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?
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.