gpt4 book ai didi

android - 库存 Android H264 解码器在 .m3u8 URL 文件上失败

转载 作者:行者123 更新时间:2023-11-29 01:38:45 28 4
gpt4 key购买 nike

我还没有找到对 m3u8 文件进行硬件解码(即直播)的解决方案,我在以下位置询问过:

ACodec call to OMX_GetExtensionIndex fails, during playback of an m3u8 file

因此,我决定尝试强制使用 ACodedc 的库存 Google SW 解码:

   bool ACodec::UninitializedState::onAllocateComponent
...
OMXCodec::findMatchingCodecs(
mime.c_str(),
encoder, // createEncoder
NULL, // matchComponentName
kSoftwareCodecsOnly, // Forcing SW for ACodec i.e. live streaming
&matchingCodecs,
&matchingCodecQuirks);

但它崩溃了...似乎缓冲区大小 (91286) 大于 info->mData->capacity (65536),在缓冲区分配时给出:

 V/ACodec  (   74): [OMX.google.h264.decoder] Allocating 8 buffers of size 65536 on input port

缓冲区大小从这些 fragment 中获取,在 Acodec.cpp 中:

ACodec::setupVideoEncoder
...
def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2;

ACodec::setVideoFormatOnPort
...
if (portIndex == kPortIndexInput) {
// XXX Need a (much) better heuristic to compute input buffer sizes.
const size_t X = 64 * 1024;
if (def.nBufferSize < X) {
def.nBufferSize = X;
}
}

我像下面这样更改了这个逻辑,只是将大小加倍:

const size_t X = 128 * 1024;

这使它通过了解码的初始阶段,但后来由于另一个原因失败了:

V/MediaPlayer( 1040): setDataSource(http://everyrai-lh.akamaihd.net/i/rai_1@177959/master.m3u8)
V/MediaPlayerService( 74): Client(8) constructor
V/MediaPlayerService( 74): Create new client(8) from pid 1040, uid 10064,
V/MediaPlayerService( 74): setDataSource(http://everyrai-lh.akamaihd.net/i/rai_1@177959/master.m3u8)
...
V/ACodec ( 74): Increasing nBufferSize to 131072
V/ACodec ( 74): setVideoFormatOnPort
V/ACodec ( 74): ComponentName: OMX.google.h264.decoder
V/ACodec ( 74): onStart
V/ACodec ( 74): [OMX.google.h264.decoder] Now Loaded->Idle
V/ACodec ( 74): [OMX.google.h264.decoder] Allocating 8 buffers of size 131072 on input port
V/ACodec ( 74): [OMX.google.h264.decoder] Allocating 2 buffers of size 115200 on output port
V/ACodec ( 74): [OMX.google.h264.decoder] Now Idle->Executing
V/ACodec ( 74): [OMX.google.h264.decoder] calling fillBuffer 0x2a085a80
V/ACodec ( 74): [OMX.google.h264.decoder] calling fillBuffer 0x2a085c58
V/ACodec ( 74): [OMX.google.h264.decoder] Now Executing
V/ACodec ( 74): [OMX.google.h264.decoder] calling emptyBuffer 0x2a089e30 w/ codec specific data
V/ACodec ( 74): [OMX.google.h264.decoder] onOMXEmptyBufferDone 0x2a089e30
V/ACodec ( 74): [OMX.google.h264.decoder] calling emptyBuffer 0x2a099d50 w/ codec specific data
V/ACodec ( 74): [OMX.google.h264.decoder] calling emptyBuffer 0x2a089e30 w/ time 240000 us
E/SoftAVC ( 74): Decoder failed: -2
V/ACodec ( 74): [OMX.google.h264.decoder] onOMXEmptyBufferDone 0x2a099d50
V/ACodec ( 74): [OMX.google.h264.decoder] calling emptyBuffer 0x2a099c50 w/ time 360000 us
E/ACodec ( 74): [OMX.google.h264.decoder] ERROR(0x80001001)
...

在 h264dec/source 中添加一些跟踪日志,我得到了这些附加信息:

D/H264Dec (   75): H264SwDecInit#
D/H264Dec ( 75): H264SwDecInit# decInst 0x2a075448 noOutputReordering 0
D/H264Dec ( 75): H264SwDecInit# OK: return 0x2a0758a8
D/H264Dec ( 75): H264SwDecDecode#
D/H264Dec ( 75): H264SwDecDecode# decInst 0x2a0758a8 pInput 0x42b6dd88 pOutput 0x42b6dd7c
D/H264Dec ( 75): H264SwDecDecode# OK: DecResult 1
D/H264Dec ( 75): H264SwDecDecode#
D/H264Dec ( 75): H264SwDecDecode# decInst 0x2a0758a8 pInput 0x42b6dd88 pOutput 0x42b6dd7c
D/H264Dec ( 75): H264SwDecDecode# OK: DecResult 1
D/H264Dec ( 75): H264SwDecDecode#
D/H264Dec ( 75): H264SwDecDecode# decInst 0x2a0758a8 pInput 0x42b6dd88 pOutput 0x42b6dd7c
D/H264Dec ( 75): H264SwDecDecode# OK: DecResult -2
E/SoftAVC ( 75): Decoder failed: -2
I/SoftAAC2( 75): Reconfiguring decoder: 44100 Hz, 2 channels
E/ACodec ( 75): [OMX.google.h264.decoder] ERROR(0x80001001)
E/NuPlayer( 75): Received error from video decoder, aborting playback.

这里,“DecResult -2”是这段代码中的 H264SWDEC_STRM_ERR:

    decResult = h264bsdDecode(&pDecCont->storage, tmpStream, strmLen,
...
switch (decResult)
{
...
case H264BSD_PARAM_SET_ERROR:
if ( !h264bsdCheckValidParamSets(&pDecCont->storage) &&
strmLen == 0 )
{
returnValue = H264SWDEC_STRM_ERR;

我想知道,首先,为什么股票解码器不能开箱即用,使用标准流媒体 URL(底层应用程序可以在其他设备上运行)。

我对缓冲区“调整大小”的猜测是否正确?我不知道为什么会失败,使用默认的大小调整逻辑。

关于最新错误的任何建议/修复?

会不会和上面的尺寸错误有关?

谢谢法比奥

最佳答案

与上面的大小 hack 无关......我得到的第一个错误是:

E/H264_pps(   75): entropy_coding_mode_flag
E/H264_decoder( 75): PIC_PARAM_SET

来自h264bsd_pic_param_set.c中的这段代码 fragment :

/* entropy_coding_mode_flag, shall be 0 for baseline profile */
tmp = h264bsdGetBits(pStrmData, 1);
if (tmp)
{
EPRINT("entropy_coding_mode_flag");
return(HANTRO_NOK);
}

查看 H264 文档,我发现 entropy_coding_mode_flag 决定了两种编码类型:

CAVLC: Context-based adaptive variable-length coding
CABAC: Context-based adaptive binary arithmetic coding

在这两者中,CAVLC 是质量较低、更易于解码的选项,而 CABAC 是质量较高、但更难解码的选项。

查看更多:

http://www.streaminglearningcenter.com/articles/producing-h264-video-for-flash-an-overview.html?page=3#sthash.26PqYA7p.dpuf

似乎 AOSP 解码器只支持“基线配置文件”,而这里我们有一个使用 entropy_coding_mode_flag 集(即 CABAC)编码的流。

这可能与硬件解码器不起作用的原因相同 - 它不支持 CABAC H264。

一个可能的解决方案,可能来自使用不同的 SW 编解码器,例如打开的“ffmpeg”播放器似乎工作正常,通过 MXPlayer 应用程序播放完全相同的流。我想要的是让这些编解码器也被股票播放器使用。

这些补丁(将合并到 JB 中),将 ffmpeg 编解码器集成到 AOSP 中,可能会起到作用:

https://github.com/omxcodec/stagefright-plugins (代码)

虽然它还没有被应用和测试......

关于android - 库存 Android H264 解码器在 .m3u8 URL 文件上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181554/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com