|
|
@ -147,7 +147,6 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl
|
|
|
|
mAppContext = context.getApplicationContext();
|
|
|
|
mAppContext = context.getApplicationContext();
|
|
|
|
mSettings = new Settings(mAppContext);
|
|
|
|
mSettings = new Settings(mAppContext);
|
|
|
|
|
|
|
|
|
|
|
|
initBackground();
|
|
|
|
|
|
|
|
initRenders();
|
|
|
|
initRenders();
|
|
|
|
|
|
|
|
|
|
|
|
mVideoWidth = 0;
|
|
|
|
mVideoWidth = 0;
|
|
|
@ -940,75 +939,10 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl
|
|
|
|
setRender(mCurrentRender);
|
|
|
|
setRender(mCurrentRender);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int toggleRender() {
|
|
|
|
|
|
|
|
mCurrentRenderIndex++;
|
|
|
|
|
|
|
|
mCurrentRenderIndex %= mAllRenders.size();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mCurrentRender = mAllRenders.get(mCurrentRenderIndex);
|
|
|
|
|
|
|
|
setRender(mCurrentRender);
|
|
|
|
|
|
|
|
return mCurrentRender;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getRenderText(Context context, int render) {
|
|
|
|
|
|
|
|
String text;
|
|
|
|
|
|
|
|
// switch (render) {
|
|
|
|
|
|
|
|
// case RENDER_NONE:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.VideoView_render_none);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// case RENDER_SURFACE_VIEW:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.VideoView_render_surface_view);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// case RENDER_TEXTURE_VIEW:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.VideoView_render_texture_view);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// default:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.N_A);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
return "getRenderText";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------
|
|
|
|
|
|
|
|
// Extend: Player
|
|
|
|
|
|
|
|
//-------------------------
|
|
|
|
|
|
|
|
public int togglePlayer() {
|
|
|
|
|
|
|
|
if (mMediaPlayer != null)
|
|
|
|
|
|
|
|
mMediaPlayer.release();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mRenderView != null)
|
|
|
|
|
|
|
|
mRenderView.getView().invalidate();
|
|
|
|
|
|
|
|
openVideo();
|
|
|
|
|
|
|
|
return mSettings.getPlayer();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getPlayerText(Context context, int player) {
|
|
|
|
|
|
|
|
// String text;
|
|
|
|
|
|
|
|
// switch (player) {
|
|
|
|
|
|
|
|
// case Settings.PV_PLAYER__AndroidMediaPlayer:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.VideoView_player_AndroidMediaPlayer);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// case Settings.PV_PLAYER__IjkMediaPlayer:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.VideoView_player_IjkMediaPlayer);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// case Settings.PV_PLAYER__IjkExoMediaPlayer:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.VideoView_player_IjkExoMediaPlayer);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// default:
|
|
|
|
|
|
|
|
// text = context.getString(R.string.N_A);
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
return "getPlayerText";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public IMediaPlayer createPlayer(int playerType) {
|
|
|
|
public IMediaPlayer createPlayer(int playerType) {
|
|
|
|
IMediaPlayer mediaPlayer = null;
|
|
|
|
IMediaPlayer mediaPlayer = null;
|
|
|
|
|
|
|
|
|
|
|
|
switch (playerType) {
|
|
|
|
switch (playerType) {
|
|
|
|
// case Settings.PV_PLAYER__IjkExoMediaPlayer: {
|
|
|
|
|
|
|
|
// IjkExoMediaPlayer IjkExoMediaPlayer = new IjkExoMediaPlayer(mAppContext);
|
|
|
|
|
|
|
|
// mediaPlayer = IjkExoMediaPlayer;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
case Settings.PV_PLAYER__AndroidMediaPlayer: {
|
|
|
|
case Settings.PV_PLAYER__AndroidMediaPlayer: {
|
|
|
|
AndroidMediaPlayer androidMediaPlayer = new AndroidMediaPlayer();
|
|
|
|
AndroidMediaPlayer androidMediaPlayer = new AndroidMediaPlayer();
|
|
|
|
mediaPlayer = androidMediaPlayer;
|
|
|
|
mediaPlayer = androidMediaPlayer;
|
|
|
@ -1072,180 +1006,4 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl
|
|
|
|
|
|
|
|
|
|
|
|
return mediaPlayer;
|
|
|
|
return mediaPlayer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------
|
|
|
|
|
|
|
|
// Extend: Background
|
|
|
|
|
|
|
|
//-------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean mEnableBackgroundPlay = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void initBackground() {
|
|
|
|
|
|
|
|
// mEnableBackgroundPlay = mSettings.getEnableBackgroundPlay();
|
|
|
|
|
|
|
|
// if (mEnableBackgroundPlay) {
|
|
|
|
|
|
|
|
// MediaPlayerService.intentToStart(getContext());
|
|
|
|
|
|
|
|
// mMediaPlayer = MediaPlayerService.getMediaPlayer();
|
|
|
|
|
|
|
|
// if (mHudViewHolder != null)
|
|
|
|
|
|
|
|
// mHudViewHolder.setMediaPlayer(mMediaPlayer);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean isBackgroundPlayEnabled() {
|
|
|
|
|
|
|
|
return mEnableBackgroundPlay;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// public void enterBackground() {
|
|
|
|
|
|
|
|
// MediaPlayerService.setMediaPlayer(mMediaPlayer);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// public void stopBackgroundPlay() {
|
|
|
|
|
|
|
|
// MediaPlayerService.setMediaPlayer(null);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------
|
|
|
|
|
|
|
|
// Extend: Background
|
|
|
|
|
|
|
|
//-------------------------
|
|
|
|
|
|
|
|
// public void showMediaInfo() {
|
|
|
|
|
|
|
|
// if (mMediaPlayer == null)
|
|
|
|
|
|
|
|
// return;
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// int selectedVideoTrack = MediaPlayerCompat.getSelectedTrack(mMediaPlayer, ITrackInfo.MEDIA_TRACK_TYPE_VIDEO);
|
|
|
|
|
|
|
|
// int selectedAudioTrack = MediaPlayerCompat.getSelectedTrack(mMediaPlayer, ITrackInfo.MEDIA_TRACK_TYPE_AUDIO);
|
|
|
|
|
|
|
|
// int selectedSubtitleTrack = MediaPlayerCompat.getSelectedTrack(mMediaPlayer, ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// TableLayoutBinder builder = new TableLayoutBinder(getContext());
|
|
|
|
|
|
|
|
// builder.appendSection(R.string.mi_player);
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_player, MediaPlayerCompat.getName(mMediaPlayer));
|
|
|
|
|
|
|
|
// builder.appendSection(R.string.mi_media);
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_resolution, buildResolution(mVideoWidth, mVideoHeight, mVideoSarNum, mVideoSarDen));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_length, buildTimeMilli(mMediaPlayer.getDuration()));
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// ITrackInfo trackInfos[] = mMediaPlayer.getTrackInfo();
|
|
|
|
|
|
|
|
// if (trackInfos != null) {
|
|
|
|
|
|
|
|
// int index = -1;
|
|
|
|
|
|
|
|
// for (ITrackInfo trackInfo : trackInfos) {
|
|
|
|
|
|
|
|
// index++;
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// int trackType = trackInfo.getTrackType();
|
|
|
|
|
|
|
|
// if (index == selectedVideoTrack) {
|
|
|
|
|
|
|
|
// builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index) + " " + getContext().getString(R.string.mi__selected_video_track));
|
|
|
|
|
|
|
|
// } else if (index == selectedAudioTrack) {
|
|
|
|
|
|
|
|
// builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index) + " " + getContext().getString(R.string.mi__selected_audio_track));
|
|
|
|
|
|
|
|
// } else if (index == selectedSubtitleTrack) {
|
|
|
|
|
|
|
|
// builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index) + " " + getContext().getString(R.string.mi__selected_subtitle_track));
|
|
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
|
|
// builder.appendSection(getContext().getString(R.string.mi_stream_fmt1, index));
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_type, buildTrackType(trackType));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_language, buildLanguage(trackInfo.getLanguage()));
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// IMediaFormat mediaFormat = trackInfo.getFormat();
|
|
|
|
|
|
|
|
// if (mediaFormat == null) {
|
|
|
|
|
|
|
|
// } else if (mediaFormat instanceof IjkMediaFormat) {
|
|
|
|
|
|
|
|
// switch (trackType) {
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_VIDEO:
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_codec, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_LONG_NAME_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_profile_level, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_PROFILE_LEVEL_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_pixel_format, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_PIXEL_FORMAT_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_resolution, mediaFormat.getString(IjkMediaFormat.KEY_IJK_RESOLUTION_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_frame_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_FRAME_RATE_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_bit_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_BIT_RATE_UI));
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_AUDIO:
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_codec, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_LONG_NAME_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_profile_level, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CODEC_PROFILE_LEVEL_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_sample_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_SAMPLE_RATE_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_channels, mediaFormat.getString(IjkMediaFormat.KEY_IJK_CHANNEL_UI));
|
|
|
|
|
|
|
|
// builder.appendRow2(R.string.mi_bit_rate, mediaFormat.getString(IjkMediaFormat.KEY_IJK_BIT_RATE_UI));
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// default:
|
|
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// AlertDialog.Builder adBuilder = builder.buildAlertDialogBuilder();
|
|
|
|
|
|
|
|
// adBuilder.setTitle(R.string.media_information);
|
|
|
|
|
|
|
|
// adBuilder.setNegativeButton(R.string.close, null);
|
|
|
|
|
|
|
|
// adBuilder.show();
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String buildResolution(int width, int height, int sarNum, int sarDen) {
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
|
|
sb.append(width);
|
|
|
|
|
|
|
|
sb.append(" x ");
|
|
|
|
|
|
|
|
sb.append(height);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sarNum > 1 || sarDen > 1) {
|
|
|
|
|
|
|
|
sb.append("[");
|
|
|
|
|
|
|
|
sb.append(sarNum);
|
|
|
|
|
|
|
|
sb.append(":");
|
|
|
|
|
|
|
|
sb.append(sarDen);
|
|
|
|
|
|
|
|
sb.append("]");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return sb.toString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String buildTimeMilli(long duration) {
|
|
|
|
|
|
|
|
long total_seconds = duration / 1000;
|
|
|
|
|
|
|
|
long hours = total_seconds / 3600;
|
|
|
|
|
|
|
|
long minutes = (total_seconds % 3600) / 60;
|
|
|
|
|
|
|
|
long seconds = total_seconds % 60;
|
|
|
|
|
|
|
|
if (duration <= 0) {
|
|
|
|
|
|
|
|
return "--:--";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hours >= 100) {
|
|
|
|
|
|
|
|
return String.format(Locale.US, "%d:%02d:%02d", hours, minutes, seconds);
|
|
|
|
|
|
|
|
} else if (hours > 0) {
|
|
|
|
|
|
|
|
return String.format(Locale.US, "%02d:%02d:%02d", hours, minutes, seconds);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
return String.format(Locale.US, "%02d:%02d", minutes, seconds);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String buildTrackType(int type) {
|
|
|
|
|
|
|
|
// Context context = getContext();
|
|
|
|
|
|
|
|
// switch (type) {
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_VIDEO:
|
|
|
|
|
|
|
|
// return context.getString(R.string.TrackType_video);
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_AUDIO:
|
|
|
|
|
|
|
|
// return context.getString(R.string.TrackType_audio);
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_SUBTITLE:
|
|
|
|
|
|
|
|
// return context.getString(R.string.TrackType_subtitle);
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT:
|
|
|
|
|
|
|
|
// return context.getString(R.string.TrackType_timedtext);
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_METADATA:
|
|
|
|
|
|
|
|
// return context.getString(R.string.TrackType_metadata);
|
|
|
|
|
|
|
|
// case ITrackInfo.MEDIA_TRACK_TYPE_UNKNOWN:
|
|
|
|
|
|
|
|
// default:
|
|
|
|
|
|
|
|
// return context.getString(R.string.TrackType_unknown);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
return "buildTrackType";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String buildLanguage(String language) {
|
|
|
|
|
|
|
|
if (TextUtils.isEmpty(language))
|
|
|
|
|
|
|
|
return "und";
|
|
|
|
|
|
|
|
return language;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ITrackInfo[] getTrackInfo() {
|
|
|
|
|
|
|
|
if (mMediaPlayer == null)
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return mMediaPlayer.getTrackInfo();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void selectTrack(int stream) {
|
|
|
|
|
|
|
|
MediaPlayerCompat.selectTrack(mMediaPlayer, stream);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void deselectTrack(int stream) {
|
|
|
|
|
|
|
|
MediaPlayerCompat.deselectTrack(mMediaPlayer, stream);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int getSelectedTrack(int trackType) {
|
|
|
|
|
|
|
|
return MediaPlayerCompat.getSelectedTrack(mMediaPlayer, trackType);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|