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.extractMetadata
null を返し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!
この問題を解決するにはどうすればよいですか?