Имам странен проблем с четенето на дължината/продължителността на видео файл, записан с камерата на устройството с помощта на 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!
Какво мога да направя, за да разреша този проблем?