m3u8文件无法在Android模拟器中播放

时间:2013-04-02 09:45:39

标签: android android-emulator android-mediaplayer android-source

我正在尝试在Android模拟器中播放m3u8文件。 http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

无法播放视频但听不到音频 我收到以下错误E/OMXNodeInstance( 39): OMX_GetExtensionIndex failed

我追踪了这些电话,我发现视频解码器没有正确实例化 我发现OMXNodeInstance::enableGraphicBuffers正在被调用,并且调用了, OMX_ERRORTYPE err = OMX_GetExtensionIndex(...,const_cast<OMX_STRING>("OMX.google.android.index.enableAndroidNativeBuffers"),...);
然后调用OMX_ERRORTYPE SoftOMXComponent::getExtensionIndex
但是这个功能没有实现。
它只返回UndefinedError(下面的代码)

OMX_ERRORTYPE SoftOMXComponent::getExtensionIndex(const char *name, OMX_INDEXTYPE *index)
{
return OMX_ErrorUndefined;
}

有人可以帮助我克服GetExtentionIndex失败。 记录下面

/ChromiumHTTPDataSource( 39): connect to http://devimages.apple.com/iphone/samples/bipbop/gear4/prog_index.m3u8 @0
V/NuPlayer( 39): scanning sources haveAudio=0, haveVideo=0
V/NuPlayer( 39): in instantiateDecoder at 693 audio = 0 
V/NuPlayer( 39): in instantiateDecoder at 693 audio = 1 
I/ESQueue ( 39): found AAC codec config (22050 Hz, 1 channels)
I/avc_utils( 39): found AVC codec config (192 x 144, Baseline-profile level 1.1)
V/MediaPlayer( 583): in getCurrentPosition at : 425
V/MediaPlayerService( 39): getCurrentPosition
V/MediaPlayerService( 39): [1] getCurrentPosition = 0
V/NuPlayer( 39): scanning sources haveAudio=0, haveVideo=0
V/NuPlayer( 39): in instantiateDecoder at 701 mime = video/avc
V/ACodec ( 39): Now uninitialized
V/ACodec ( 39): Now uninitialized
V/ACodec ( 39): onAllocateComponent
I/MediaPlayerService( 39): MediaPlayerService::getOMX()
V/SoftOMXPlugin( 39): makeComponentInstance 'OMX.google.h264.decoder'
V/SoftOMXPlugin( 39): makeComponentInstance at 106 
V/ACodec ( 39): onAllocateComponent
I/MediaPlayerService( 39): MediaPlayerService::getOMX()
V/SoftOMXPlugin( 39): makeComponentInstance at 128 
V/SoftOMXPlugin( 39): makeComponentInstance 'OMX.google.aac.decoder'
V/SoftOMXPlugin( 39): makeComponentInstance at 106 
V/SoftOMXPlugin( 39): makeComponentInstance at 128 
V/ACodec ( 39): [OMX.google.h264.decoder] Now Loaded
V/ACodec ( 39): onConfigureComponent
V/ACodec ( 39): configureCodec at 870 
V/ACodec ( 39): setupVideoDecoder at 1400 
V/ACodec ( 39): setupVideoDecoder at 1402 mime = video/avc 
V/ACodec ( 39): setupVideoDecoder at 1406 
V/ACodec ( 39): setupVideoDecoder at 1414 
V/ACodec ( 39): setupVideoDecoder at 1421 
V/ACodec ( 39): setupVideoDecoder at 1429 
V/ACodec ( 39): setupVideoDecoder at 1437 
V/ACodec ( 39): initNativeWindow at 1962 
V/ACodec ( 39): initNativeWindow at 1967 
E/OMXNodeInstance( 39): OMX_GetExtensionIndex failed
V/OMXNodeInstance( 39): enableGraphicBuffers at 301 OMX_GetExtensionIndex returned 2147487745
V/ACodec ( 39): onStart
V/ACodec ( 39): [OMX.google.h264.decoder] Now Loaded->Idle

3 个答案:

答案 0 :(得分:0)

尝试在真实设备中运行它,因为我知道具有某些特定sdk(如3.1)的模拟器崩溃播放m3u8文件。如果没有解决问题,也许你可以使用像Vitamio http://vitamio.org/

这样的第三个插件

答案 1 :(得分:0)

这是一个非常有趣的问题。从您的日志中,我想引用此部分

E/OMXNodeInstance( 39): OMX_GetExtensionIndex failed
V/OMXNodeInstance( 39): enableGraphicBuffers at 301 OMX_GetExtensionIndex returned 2147487745

initNativeWindow调用ACodec期间收到这2条错误消息,作为其从LOADED转换为IDLE状态的一部分。从OMX角度来看,作为LOADED to IDLE转换的一部分,会调用ACodec::LoadedState::onConfigureComponent。作为此函数的一部分,将调用initNativeWindow

initNativeWindow中,有两个不同的条件。第一种情况是用户向编解码器提供nativeWindow或更确切地说SurfaceSurfaceTexture以将其输出写入。另一种情况是用户未向Surface引擎提供MediaPlayer

V/ACodec ( 39): onStart
V/ACodec ( 39): [OMX.google.h264.decoder] Now Loaded->Idle

从这些日志中可以看出initNativeWindow的返回码是正常的,如果控件分支到mNativeNativeWindow为NULL的情况,则仅可能观察herefalse案例的返回码未被ACodec捕获,这意味着组件已成功转换为IDLE状态。

简而言之,问题主要是由于Surface没有提供MediaPlayer而引起的。

一些建议:

由于您正在使用NuPlayer,我建议您检查是否调用NuPlayer::setVideoSurfaceTexture以及non-NULL对象是否从NuPlayer传递到下游组件。

MediaPlayer角度来看,您应该将表面设置为setSurface调用的一部分。

通常,您需要为视频解码器链提供sink

答案 2 :(得分:0)

E/OMXNodeInstance( 39): OMX_GetExtensionIndex failed
V/OMXNodeInstance( 39): enableGraphicBuffers at 301 OMX_GetExtensionIndex returned 2147487745

OMX_GetExtensionIndex 的调用进入SoftOMXComponent(here),这只是一个存根函数,并且总是返回 OMX_ErrorUndefined ,导致 enableGraphicBuffers失败