From f2152fc5c88e54f2acde6a3eaed5ed4098055d97 Mon Sep 17 00:00:00 2001 From: "zhou.weiguo" Date: Tue, 25 May 2021 07:46:49 +0800 Subject: [PATCH] add display URL and statistic info in playback UI for troubleshooting purpose --- .../widget/media/InfoHudViewHolder.java | 41 ++++++++++++ .../src/main/res/values/strings.xml | 5 ++ .../ijk/media/player/IjkMediaPlayer.java | 62 ++++++++++++++++++- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/android/ijkplayer/ijkplayer-example/src/main/java/tv/danmaku/ijk/media/example/widget/media/InfoHudViewHolder.java b/android/ijkplayer/ijkplayer-example/src/main/java/tv/danmaku/ijk/media/example/widget/media/InfoHudViewHolder.java index af5e9fb77a..288773f516 100755 --- a/android/ijkplayer/ijkplayer-example/src/main/java/tv/danmaku/ijk/media/example/widget/media/InfoHudViewHolder.java +++ b/android/ijkplayer/ijkplayer-example/src/main/java/tv/danmaku/ijk/media/example/widget/media/InfoHudViewHolder.java @@ -3,11 +3,14 @@ import android.content.Context; import android.os.Handler; import android.os.Message; +import android.util.Log; import android.util.SparseArray; import android.view.View; import android.widget.TableLayout; +import java.util.Date; import java.util.Locale; +import java.text.SimpleDateFormat; import tv.danmaku.ijk.media.player.IMediaPlayer; import tv.danmaku.ijk.media.player.IjkMediaPlayer; @@ -20,6 +23,7 @@ public class InfoHudViewHolder { private IMediaPlayer mMediaPlayer; private long mLoadCost = 0; private long mSeekCost = 0; + private final static String TAG = InfoHudViewHolder.class.getName(); public InfoHudViewHolder(Context context, TableLayout tableLayout) { mTableLayoutBinder = new TableLayoutBinder(context, tableLayout); @@ -119,6 +123,29 @@ public void handleMessage(Message msg) { if (mp == null) break; + String url = mp.getDataSource(); + if (url == null) + break; + String tmpUrl = ""; + int lineLength = 30; + int endPos = 0; + int beginPos = 0; + int otherLength = url.length(); + for (int i = 0; i < (url.length() / lineLength + 1); i++) { + beginPos = i * lineLength; + if (otherLength <= lineLength) { + endPos = url.length(); + tmpUrl = tmpUrl + url.substring(beginPos, endPos); + break; + } else { + endPos = beginPos + lineLength; + tmpUrl = tmpUrl + url.substring(beginPos, endPos) + "\r\n"; + } + otherLength = otherLength - lineLength; + } + setRowValue(R.string.url, tmpUrl); + + int vdec = mp.getVideoDecoder(); switch (vdec) { case IjkMediaPlayer.FFP_PROPV_DECODER_AVCODEC: @@ -152,6 +179,20 @@ public void handleMessage(Message msg) { setRowValue(R.string.tcp_speed, String.format(Locale.US, "%s", formatedSpeed(tcpSpeed, 1000))); setRowValue(R.string.bit_rate, String.format(Locale.US, "%.2f kbs", bitRate/1000f)); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + long startTime = mp.getBeginTime(); + setRowValue(R.string.start_time, formatter.format(new Date(startTime))); + + Date curTime = new Date(System.currentTimeMillis()); + setRowValue(R.string.current_time, formatter.format(curTime)); + + long playTime = mp.getPlayTime(); + setRowValue(R.string.play_time, String.valueOf(playTime) + " secs"); + + long pauseTime = mp.getPauseTime(); + setRowValue(R.string.pause_time, String.valueOf(pauseTime) + " secs"); + mHandler.removeMessages(MSG_UPDATE_HUD); mHandler.sendEmptyMessageDelayed(MSG_UPDATE_HUD, 500); } diff --git a/android/ijkplayer/ijkplayer-example/src/main/res/values/strings.xml b/android/ijkplayer/ijkplayer-example/src/main/res/values/strings.xml index b4fdce5e02..d6700a5955 100755 --- a/android/ijkplayer/ijkplayer-example/src/main/res/values/strings.xml +++ b/android/ijkplayer/ijkplayer-example/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Render Scale Info + URL vdec fps v-cache @@ -23,6 +24,10 @@ seek_load_cost tcp_speed bit_rate + start_time + current_time + play_time + pause_time Media Information Player diff --git a/android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java b/android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java index beb73f76e8..89de11b7cd 100755 --- a/android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java +++ b/android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java @@ -48,9 +48,11 @@ import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.security.InvalidParameterException; +import java.text.DateFormat; import java.util.ArrayList; import java.util.Locale; import java.util.Map; +import java.util.TimeZone; import tv.danmaku.ijk.media.player.annotations.AccessedByNative; import tv.danmaku.ijk.media.player.annotations.CalledByNative; @@ -169,6 +171,14 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer { private String mDataSource; + //statistic info for pressure test & troubleshooting purpose + private long mBeginTime; //beginning time of current playback + private long mTotalPlayTime; + private long mLastPauseTime; + private long mTotalPauseTime; + private boolean bIsPaused; + + /** * Default library loader * Load them by yourself, if your libraries are not installed at default place. @@ -187,7 +197,7 @@ public static void loadLibrariesOnce(IjkLibLoader libLoader) { if (libLoader == null) libLoader = sLocalLibLoader; - libLoader.loadLibrary("ijkffmpeg"); + //libLoader.loadLibrary("ijkffmpeg"); libLoader.loadLibrary("ijksdl"); libLoader.loadLibrary("ijkplayer"); mIsLibLoaded = true; @@ -231,6 +241,9 @@ private void initPlayer(IjkLibLoader libLoader) { loadLibrariesOnce(libLoader); initNativeOnce(); + //should I put it in another better place? + mBeginTime = System.currentTimeMillis(); + Looper looper; if ((looper = Looper.myLooper()) != null) { mEventHandler = new EventHandler(this, looper); @@ -519,14 +532,21 @@ public void prepareAsync() throws IllegalStateException { @Override public void start() throws IllegalStateException { + Log.i(TAG, "start playing..."); stayAwake(true); + if (bIsPaused) { + mTotalPauseTime += System.currentTimeMillis() - mLastPauseTime; + Log.i(TAG, "mTotalPauseTime " + (mTotalPauseTime / 1000) ); + } _start(); + bIsPaused = false; } private native void _start() throws IllegalStateException; @Override public void stop() throws IllegalStateException { + Log.i(TAG, "stop playing..."); stayAwake(false); _stop(); } @@ -536,11 +556,48 @@ public void stop() throws IllegalStateException { @Override public void pause() throws IllegalStateException { stayAwake(false); + assert(bIsPaused == false); + + if (!bIsPaused) { + mLastPauseTime = System.currentTimeMillis(); + } + Log.i(TAG, "pause playing..."); _pause(); + bIsPaused = !bIsPaused; } private native void _pause() throws IllegalStateException; + + public long getBeginTime() { + return mBeginTime; + } + + + public long getPauseTime() { + long mCurrentPauseTime = 0; + if (bIsPaused) { + mCurrentPauseTime = System.currentTimeMillis() - mLastPauseTime; + } + return (mTotalPauseTime + mCurrentPauseTime) / 1000; + } + + + public long getPlayTime() { + DateFormat dateFormatterChina = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); + TimeZone timeZoneChina = TimeZone.getTimeZone("Asia/Shanghai"); + dateFormatterChina.setTimeZone(timeZoneChina); + + if (isPlaying()) { + long curTime = System.currentTimeMillis(); + mTotalPlayTime = ((curTime - mBeginTime - mTotalPauseTime) / 1000) ; + + return mTotalPlayTime; + } + return mTotalPlayTime; + } + + @SuppressLint("Wakelock") @Override public void setWakeMode(Context context, int mode) { @@ -698,6 +755,7 @@ public int getVideoSarDen() { */ @Override public void release() { + Log.i(TAG, "release"); stayAwake(false); updateSurfaceScreenOn(); resetListeners(); @@ -708,6 +766,7 @@ public void release() { @Override public void reset() { + Log.i(TAG, "reset"); stayAwake(false); _reset(); // make sure none of the listeners get called anymore @@ -838,6 +897,7 @@ public long getSeekLoadDuration() { return _getPropertyLong(FFP_PROP_INT64_LATEST_SEEK_LOAD_DURATION, 0); } + private native float _getPropertyFloat(int property, float defaultValue); private native void _setPropertyFloat(int property, float value); private native long _getPropertyLong(int property, long defaultValue);