8

我在使用 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!

我能做些什么来解决这个问题?

4

1 回答 1

6

我能够通过将 a 设置FileInputStreamMediaPlayer.

MediaPlayer mp = new MediaPlayer();
FileInputStream stream = new FileInputStream(context.getFilesDir() + "/recordings/webcam.3gpp");
mp.setDataSource(stream.getFD());
stream.close();
mp.prepare();
long duration = mp.getDuration();
mp.release();
return duration;

我的答案来源来自https://stackoverflow.com/a/6383655/379245

于 2013-10-31T15:27:43.493 回答