8

MediaRecorder を使用して、デバイスのカメラで記録されたビデオ ファイルの長さ/期間を読み取る際に奇妙な問題が発生しています。ファイルは、次のように設定されているアプリケーションのプライベート ストレージ ディレクトリに記録されます。

mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp");

録画が完了したら、次の方法でビデオの長さを読み取ろうとします。

方法 1:

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.extractMetadatanull を返しMediaPlayer.create、IOException で失敗します。ファイルが存在することを確認しました。

重要な注意:録画を「/sdcard/recordings/webcam.3gpp」に保存すると、この問題は発生しません。何らかの理由で、ファイルがアプリケーションに属するプライベート ファイル ディレクトリにある場合、期間を読み取ることができません。また、この問題は Android 2.3 を実行している私の Samsung Droid Charge でのみ発生します。Android 4.2 を実行する Samsung Galaxy S4、および Android 4.3 を実行する Asus 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

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から来ています

于 2013-10-31T15:27:43.493 に答える