Живой Поток, терпящий крах на Соте - PullRequest
3 голосов
/ 26 июня 2011

Код:

        path = "httplive://<host>/moviets/index.m3u8";
        // Create a new media player and set the listeners
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setDataSource(path);
        mMediaPlayer.setOnErrorListener(this);
        mMediaPlayer.setDisplay(holder);
        mMediaPlayer.prepare();    // Crashes here. prepareAsync() does not help either
        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mMediaPlayer.start();

Трассировка стека:

 ERROR/MediaPlayer(1349): error (100, 0)
 ERROR/MediaPlayerDemo(1349): error: Prepare failed.: status=0x64
 ERROR/MediaPlayerDemo(1349): java.io.IOException: Prepare failed.: status=0x64
 ERROR/MediaPlayerDemo(1349):     at android.media.MediaPlayer.prepare(Native Method)
 ERROR/MediaPlayerDemo(1349):     at com.example.Example.VideoPlayerActivity.playVideo(VideoPlayerActivity.java:81)
 ERROR/MediaPlayerDemo(1349):     at com.example.Example.VideoPlayerActivity.surfaceCreated(VideoPlayerActivity.java:138)
 ERROR/MediaPlayerDemo(1349):     at android.view.SurfaceView.updateWindow(SurfaceView.java:565)
 ERROR/MediaPlayerDemo(1349):     at android.view.SurfaceView.access$000(SurfaceView.java:84)
 ERROR/MediaPlayerDemo(1349):     at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:173)
 ERROR/MediaPlayerDemo(1349):     at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
 ERROR/MediaPlayerDemo(1349):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1325)
 ERROR/MediaPlayerDemo(1349):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1944)
 ERROR/MediaPlayerDemo(1349):     at android.os.Handler.dispatchMessage(Handler.java:99)
 ERROR/MediaPlayerDemo(1349):     at android.os.Looper.loop(Looper.java:126)
 ERROR/MediaPlayerDemo(1349):     at android.app.ActivityThread.main(ActivityThread.java:3997)
 ERROR/MediaPlayerDemo(1349):     at java.lang.reflect.Method.invokeNative(Native Method)
 ERROR/MediaPlayerDemo(1349):     at java.lang.reflect.Method.invoke(Method.java:491)
 ERROR/MediaPlayerDemo(1349):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
 ERROR/MediaPlayerDemo(1349):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
 ERROR/MediaPlayerDemo(1349):     at dalvik.system.NativeStart.main(Native Method)
 DEBUG/MediaPlayerDemo(1349): surfaceChanged called

Logcat:

 DEBUG/MediaPlayerDemo(1349): surfaceCreated called
 INFO/System.out(1349): the path is httplive://192.168.0.196/moviets/index.m3u8
 INFO/StagefrightPlayer(1312): setDataSource('httplive://192.168.0.196/moviets/index.m3u8')
 INFO/LiveSession(1312): onConnect 'http://192.168.0.196/moviets/index.m3u8'
 INFO/NuHTTPDataSource(1312): connect to 192.168.0.196:80/moviets/index.m3u8 @0
 INFO/NuHTTPDataSource(1312): connect to 192.168.0.196:80/moviets/index.m3u8 @0
 INFO/NuHTTPDataSource(1312): connect to 192.168.0.196:80/moviets/file5.ts @0
 INFO/avc_utils(1312): found AVC codec config (320 x 240, Baseline-profile level 3.0)
 INFO/ESQueue(1312): found something resembling an AAC syncword at offset 1017
 INFO/NuHTTPDataSource(1312): connect to 192.168.0.196:80/moviets/file6.ts @0
 INFO/ESQueue(1312): found AAC codec config (48000 Hz, 7 channels)
 INFO/ESQueue(1312): [ 06-26 17:37:17.397  1312:0x550 F/ESQueue  ]
 INFO/ESQueue(1312): frameworks/base/media/libstagefright/mpeg2ts/ESQueue.cpp:255 Should not be here.
 INFO/DEBUG(31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
 INFO/DEBUG(31): Build fingerprint: 'generic/sdk/generic:3.0/HONEYCOMB/104254:eng/test-keys'
 INFO/DEBUG(31): pid: 1312, tid: 1360  >>> /system/bin/mediaserver <<<
 INFO/DEBUG(31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
 INFO/DEBUG(31):  r0 deadbaad  r1 0000000c  r2 00000027  r3 00000000
 INFO/DEBUG(31):  r4 00000080  r5 aff46658  r6 00000007  r7 00000000
 INFO/DEBUG(31):  r8 a2b72589  r9 00012a6c  10 00100000  fp 00000001
 INFO/DEBUG(31):  ip ffffffff  sp 4060f488  lr aff193e9  pc aff15f58  cpsr 00000030
 INFO/NuHTTPDataSource(1312): connect to 192.168.0.196:80/moviets/file7.ts @0
 INFO/DEBUG(31):          #00  pc 00015f58  /system/lib/libc.so
 INFO/DEBUG(31):          #01  pc 00001466  /system/lib/liblog.so (__android_log_assert)
 INFO/DEBUG(31): libc base address: aff00000

Меня озадачивает строка "Конфигурация найденного кодека AAC",в то время как видеофайл содержит кодировку mp3.Это нормально, или мой Android-клиент неправильно определяет mp3 как aac?К вашему сведению, другие видео с кодировкой aac хорошо воспроизводятся на клиенте

Любая подсказка?

1 Ответ

1 голос
/ 27 июня 2011

Это похоже на ошибку в эмуляторе Сота, когда Android ошибочно определяет поток mp3 как aac. FFmpeg, с другой стороны, правильно определяет поток mp3, как показано ниже

ffmpeg -i file6.ts
Stream #0.1[0x101]: Audio: mp3, 48000 Hz, 2 channels, s16, 192 kb/s

К сожалению, Android считает, что это AAC

 INFO/avc_utils(1312): found AVC codec config (320 x 240, Baseline-profile level 3.0)
 INFO/ESQueue(1312): found something resembling an AAC syncword at offset 1017
 INFO/NuHTTPDataSource(1312): connect to <ip>:<port>/moviets/file6.ts @0
 INFO/ESQueue(1312): found AAC codec config (48000 Hz, 7 channels)
 INFO/ESQueue(1312): [ 06-26 17:37:17.397  1312:0x550 F/ESQueue  ]
 INFO/ESQueue(1312): frameworks/base/media/libstagefright/mpeg2ts/ESQueue.cpp:255 \
                     Should not be here.

Обходной путь должен использовать кодирование AAC. Если вы используете ffmpeg, используйте опцию -acodec libfaac. Это работает для нашего проекта, потому что мы можем выбирать исходные форматы видео. Впрочем, это не обязательно ваш случай.

...