我正在尝试在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
答案 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
或更确切地说Surface
或SurfaceTexture
以将其输出写入。另一种情况是用户未向Surface
引擎提供MediaPlayer
。
V/ACodec ( 39): onStart
V/ACodec ( 39): [OMX.google.h264.decoder] Now Loaded->Idle
从这些日志中可以看出initNativeWindow
的返回码是正常的,如果控件分支到mNativeNativeWindow
为NULL的情况,则仅可能观察here。 false
案例的返回码未被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失败强>