Как да прочета дължината на видеоклипа, записан с MediaRecorder, в частна директория за съхранение на приложения, създадена чрез context.getFilesDir()?

Имам странен проблем с четенето на дължината/продължителността на видео файл, записан с камерата на устройството с помощта на 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“. По някаква причина просто не мога да прочета продължителността, когато файлът е в директорията с лични файлове, която принадлежи на приложението. Освен това този проблем възниква САМО на моя Samsung Droid Charge, който работи с Android 2.3. Това НЕ се случва на Samsung Galaxy S4, който работи с Android 4.2, и Asus Nexus 7, който работи с Android 4.3.

Редактиране:

Ако взема същия файл и го копирам на sdcard, след това прочета дължината му там, всичко работи. Какво дава?

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!

Какво мога да направя, за да разреша този проблем?




Отговори (1)


Успях да разреша проблема си, като зададох 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

person BVB    schedule 31.10.2013