Search code examples
androidandroid-3.0-honeycombhttp-live-streaming

Live Streaming crashing on Honeycomb


Code:

        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();

Stack trace:

 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

What stumps me is the line "found AAC codec config", while the video file contains mp3 encoding. Is that normal or my Android client is wrongly detecting mp3 as aac? FYI, other videos with aac encoding are playing okay on the client

Any clue?


Solution

  • This seems like a bug in Honeycomb emulator where Android wrongly detects mp3 stream as aac. FFmpeg, on the other hand, detects the mp3 stream correctly, as below

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

    Unfortunately, Android thinks it is 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.
    

    The workaround is to use AAC encoding. If you are using ffmpeg, use the -acodec libfaac option. This works for our project because we have the liberty of choosing the source video formats. This might not necessarily be your case though.