如何将使用MediaRecorder录制的视频长度读取到通过context.getFilesDir()构建的私人应用程序



我遇到了一个奇怪的问题,通过使用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);

方法2:

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",则不会发生此问题。由于某种原因,我只是无法读取文件位于属于该应用程序的私人文件目录中的持续时间。此外,此问题仅发生在我的三星Droid Charge上运行Android 2.3。它不会发生在运行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!

我该怎么做才能解决这个问题?

我能够通过将FileInputStream设置为MediaPlayer的数据源来解决我的问题。

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

相关内容

最新更新