Rai*_*ari 4 android android-video-player
我正在开发一个应用程序,用户可以在其中查看存储在SERVER上的所有视频信息和标题.我几乎完成了它,除了无论我如何编码它,我都无法从给定的URL获取视频持续时间.让我们从互联网上的某个地方获取这个演示视频: 点击这里获取视频路径 我希望应用程序获得视频持续时间,而无需打开视频本身.
我试图在android上使用的代码是这样的:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource("https://12-lvl3-pdl.vimeocdn.com/01/1386/0/6932347/10573836.mp4?expires=1461047937&token=037972137fdfc4c2d9902");
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInmillisec = Long.parseLong( time );
long duration = timeInmillisec / 1000;
long hours = duration / 3600;
long minutes = (duration - hours * 3600) / 60;
long seconds = duration - (hours * 3600 + minutes * 60);
Toast.makeText(context,Long.toString(timeInmillisec),Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是:第2行的java.lang.IllegalArgumentException是"retrievever.setDataSource()".任何人都可以帮我找到我做错了什么或android提供另一种方式来获取所需的信息?
Kis*_*oid 10
也许您正在寻找FFmpegMediaMetadataRetriever
FFmpegMediaMetadataRetriever类为从输入媒体文件中检索帧和元数据提供统一接口.
通过使用FFmpegMediaMetadataRetriever的METADATA_KEY_DURATION常量,您可以获得视频的持续时间.它会将字符串返回给您,然后您可以将其转换为LONG以获得TIME.
以下是您应该使用的代码:
FFmpegMediaMetadataRetriever mFFmpegMediaMetadataRetriever = new MediaMetadataRetriever();
mFFmpegMediaMetadataRetriever .setDataSource("Your video url");
String mVideoDuration = mFFmpegMediaMetadataRetriever .extractMetadata(FFmpegMediaMetadataRetriever .METADATA_KEY_DURATION);
long mTimeInMilliseconds= Long.parseLong(mVideoDuration);
Run Code Online (Sandbox Code Playgroud)
如果上面仍然没有工作,那么使用
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
retriever.setDataSource("Your video url", new HashMap<String, String>());
else
retriever.setDataSource("Your video url");
Run Code Online (Sandbox Code Playgroud)
从你的代码.
希望它会对你有所帮助.祝你好运.
这对我有用,(如果您的应用程序变慢,请在后台线程中使用此代码)
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource("YourVideofileUrl", new HashMap<String, String>());
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInMillisec = Long.parseLong(time);
retriever.release();
String duration=convertMillieToHMmSs(timeInMillisec); //use this duration
Run Code Online (Sandbox Code Playgroud)
和
public static String convertMillieToHMmSs(long millie) {
long seconds = (millie / 1000);
long second = seconds % 60;
long minute = (seconds / 60) % 60;
long hour = (seconds / (60 * 60)) % 24;
String result = "";
if (hour > 0) {
return String.format("%02d:%02d:%02d", hour, minute, second);
}
else {
return String.format("%02d:%02d" , minute, second);
}
}
Run Code Online (Sandbox Code Playgroud)
如果速度慢,请在后台使用 AsyncTask 或协程
AsyncTask.execute(new Runnable() {
@Override
public void run() {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(model.getLink(), new HashMap<String, String>());
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInMillisec = Long.parseLong(time);
retriever.release();
String durations=convertMillieToHMmSs(timeInMillisec); //use this duration
Log.d("durationns",durations);
runOnUiThread(new Runnable() {
@Override
public void run() {
duration.setText(durations);//set in textview
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6660 次 |
| 最近记录: |