MediaMetadataRetriever.setDataSource(собственный метод) вызывает RuntimeException: status = 0x80000000

Я пытаюсь получить некоторые метаданные из файла jpg в моем приложении для Android с помощью android.media.MediaMetadataRetriever. Вот мой код:

public long getDuration(String videoFilePath, Context context) {
    File file = loadVideoFile(videoFilePath);
    if (file == null) {
        return -1;
    }

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    file.setReadable(true, false);
    retriever.setDataSource(file.getAbsolutePath());
    return getDurationProperty(retriever);
}

Когда я вызываю метод setDataSource, он генерирует исключение RuntimeException:

09-10 15:22:25.576: D/PowerManagerService(486): releaseWakeLock(419aa2a0): CPU_MIN_NUM , tag=AbsListViewScroll_5.0, flags=0x400
09-10 15:22:26.481: I/HtcModeClient(12704): handler message = 4011
09-10 15:22:26.481: E/HtcModeClient(12704): Check connection and retry 9 times.
09-10 15:22:27.681: W/dalvikvm(13569): threadid=1: thread exiting with uncaught exception (group=0x40bc92d0)
09-10 15:22:27.696: E/AndroidRuntime(13569): FATAL EXCEPTION: main
09-10 15:22:27.696: E/AndroidRuntime(13569): java.lang.RuntimeException: setDataSource failed: status = 0x80000000
09-10 15:22:27.696: E/AndroidRuntime(13569):    at android.media.MediaMetadataRetriever.setDataSource(Native Method)
09-10 15:22:27.696: E/AndroidRuntime(13569):    at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:66)

И странно, что это не удается только на HTC One X с Android 4.2.2. Приложения прекрасно работают с другими устройствами, которые имеют другие версии Android (например, 4.2.1).

Редактировать:

Вот это да. Может быть, речь идет о моей неправильной зависимости в Maven:

<dependency>
    <groupId>com.google.android</groupId>
    <artifactId>android</artifactId>
    <version>4.1.1.4</version>
    <scope>provided</scope>
</dependency>

Но я не могу найти зависимость для Android 4.2.2. Где я могу найти это?

3 ответа

Открытие файла самостоятельно и использование FileDescriptor лучше работает на API 10:

FileInputStream inputStream = new FileInputStream(file.getAbsolutePath());
retriever.setDataSource(inputStream.getFD());
inputStream.close();

MediaMetadataRetriever не работает согласованно во всех версиях Android. Я рекомендую попробовать https://github.com/wseemann/FFmpegMediaMetadataRetriever (Disclaimer: это мой проект). Он имеет тот же интерфейс, что и MediaMetadataRetriever:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
retriever.setDataSource(file.getAbsolutePath());
retriever.release();

После большого количества исследований + проб и ошибок я пришел к выводу и согласился с /questions/11252562/mediametadataretrieversetdatasourcesobstvennyij-metod-vyizyivaet-runtimeexception-status-0xffffffea/11252572#11252572. Я попытался воспроизвести исключение с разными форматами видеофайлов и из следующих видеоформатов: AVI, MPG/MPEG, MOV, mov, mp4, m4v, flv, WMV, я заметил, что AVI, MPG / MPEG и WMV бросали исключение для меня каждый раз. Лучше исключить их перед запуском метода и обернуть пробой.

Помещение метода setDataSource() в блок try-catch решило проблему.

try {
        metaRetriver.setDataSource(AudioPath);
       //
    } catch (Exception e) {
        //
    }
Другие вопросы по тегам