Ошибка MediaMetadataRetriever setDataSource: status = 0xFFFFFFED
Мне нужно получить кадры из видео, расположенного в Интернете. Вот как я это делаю:
class PlayerWrapper {
private static final MediaMetadataRetriever mMediaMetadataRetriever = new MediaMetadataRetriever();
…
public void initPlayback(final Context context, final VideoSurfaceView videoSurface, final String url) {
new Thread(new Runnable() {
@Override
public void run() {
…
try {
mMediaMetadataRetriever.setDataSource(url, new HashMap<String, String>());
} catch (Exception e) {
DPLog(e);
}
}
}).start();
}
public Bitmap getFrameAt(int positionMillis) {
if (mMediaMetadataRetriever != null) {
DPLog.d("Creating frame for position [%s]", positionMillis);
try {
return mMediaMetadataRetriever.getFrameAtTime(positionMillis * 1000);
} catch (Exception e) {
…
return null;
}
} else {
return null;
}
}
}
Это отлично работает на нескольких устройствах с Android 4.4, 5 и 6. Но на одном устройстве с Android 4.1.2 setDataSource
функция завершается с помощью следующей трассировки стека:
java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFED
at android.media.MediaMetadataRetriever._setDataSource(MediaMetadataRetriever.java)
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:99)
at co.unreel.videoapp.playback.UnreelPlayer$3.run(UnreelPlayer.java:138)
at java.lang.Thread.run(Thread.java:856)
Также пробовал этот код на эмуляторе, получил почти то же самое, но со статусом 0x80000000
URL получен из YouTube API, выглядит так:
https://r2---sn-n3toxu-axqe.googlevideo.com/videoplayback?gcr=ru&sver=3&mm=31&mn=sn-n3toxu-axqe&key=yt6&signature=D1CE7B8615F3D96A58A9D2679057D676E7777E05.5A318AD8C5F48FCED2D1A9149348CD269F466FA9&mt=1456173450&pl=24&mv=m&ms=au&lmt=1455616987173757&itag=22&requiressl=yes&ip=188.242.217.203&source=youtube&dur=848.248&id=o-ABIn_CbRwqIO6qpvlaWe_ekyTZPLVd0w_eM80awd6uRQ&fexp=9408087%2C9416126%2C9419451%2C9420452%2C9421340%2C9422596%2C9423661%2C9423662%2C9425078%2C9425963%2C9427767%2C9427801%2C9428013%2C9428432%2C9428660%2C9429602&mime=video%2Fmp4&upn=P5qxGGbPoc0&sparams=dur%2Cgcr%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&expire=1456195127&initcwndbps=3140000&ratebypass=yes&ipbits=0
Разрешения:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Почему это может произойти и что делать?
Я также пытался использовать FFmpegMediaMetadataRetriever
с той же логикой, но это не работает вообще, setDataSource
вызывает исключения со статусом 0xFFFFFFFF
на всех устройствах. Как я обнаружил на SO, это означает, что URL-адрес является недействительным, но это нормально и играет MediaPlayer
без проблем. Также я обнаружил, что ffmpeg имеет проблемы с URL-адресами длиннее 1024, но это не мой случай.
Может быть есть другой способ получить кадры из видео?
0 ответов
Получите ту же ошибку. Ошибка setDataSource: status = 0xFFFFFFED
Используйте Crosswalk на Android для воспроизведения mp3-файла на сервере https. И нашел это из источника Google в строке 940
Устанавливает источник данных (путь к файлу или URL http / rtsp) для использования.
возможно setDataSource не поддерживает https. и это работает, когда я использую http-сервер.
private static final String videoPath =
"android.resource://com.example.dvid/"+"/raw/testvid";
Uri data = Uri.parse(videoPath);
FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();
fmmr.setDataSource(data.toString());
Я получаю исключение IllegalArgumentException. Я пытаюсь получить кадры из видео на Android.