我在使用 MediaRecorder 读取使用设备的相机录制的视频文件的长度/持续时间时遇到一个奇怪的问题。该文件被记录到应用程序的私有存储目录中,设置如下:
mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp");
录制完成后,我尝试使用以下方法读取视频的长度:
方法一:
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(context.getFilesDir() + "/recordings/webcam.3gpp");
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Long.parseLong(time);
方法二:
MediaPlayer mp = MediaPlayer.create(context, Uri.parse(context.getFilesDir() + "/recordings/webcam.3gpp"));
long duration = mp.getDuration();
mp.release();
return duration;
这些方法都不起作用。mediaMetadataRetriever.extractMetadata
返回 null 并MediaPlayer.create
以 IOException 失败。我已验证该文件存在。
重要提示:如果我将录音保存到“/sdcard/recordings/webcam.3gpp”,则不会发生此问题。出于某种原因,当文件位于属于应用程序的私有文件目录中时,我无法读取持续时间。此外,此问题仅发生在运行 Android 2.3 的三星 Droid Charge 上。它不会发生在运行 Android 4.2 的三星 Galaxy S4 和运行 Android 4.3 的华硕 Nexus 7 上。
编辑:
如果我把同一个文件复制到 SD 卡,然后在那里读取它的长度,一切正常。是什么赋予了?
copy(new File(context.getFilesDir() + "/recordings/webcam.3gpp"), new File("/sdcard/wtfisthiscrap.3gpp"));
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource("/sdcard/wtfisthiscrap.3gpp");
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Long.parseLong(time); // works!
我能做些什么来解决这个问题?