解码H264流bufferInfo.size始终为零

2024-01-16

我有一个 H264 流,想要使用 MediaCodec 将其解码以显示。

因为我只是解码,并且希望定位尽可能多的设备,所以我支持 API 16 并使用 ExtractMpegFrames 测试作为参考。http://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txt http://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txt

当调用 dequeOutputBuffers(info,timeout); 时info.size 始终为零。如果我硬编码releaseOutputBuffer(index,true);我得到了显示(取决于我如何设置表面...在主活动 onCreate 中创建一个表面并将其传递给配置工作,使用 extractmpegframes 中的表面概念不会...可能会调试它)。

无论我使用基于 info.size 的布尔值还是硬编码“true”......我都会得到很多 “SEC_VIDEO_DEC(1840):输出缓冲区小于解码数据大小输出长度”(在三星 Galaxy Note 10.1 上),在谷歌搜索后我发现:https://gitorious.org/replicant/device_samsung_aries-common/source/9ff4c660a554dc2816db67004fccb10f6ad0e0fa:aries/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c#L849 https://gitorious.org/replicant/device_samsung_aries-common/source/9ff4c660a554dc2816db67004fccb10f6ad0e0fa%3aaries/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c#L849849线 在这个设备上,由于似乎有大量的分配和随后的垃圾收集,我有很多口吃。

Surface 绝对不为空...三星平板电脑是 4.1.2..

还尝试过新的 Lenovo Yoga 10 HD(4.2 版,平板电脑现已上市),视频也有卡顿,尺寸不为零,但与手机相比“小”

问题:
1. 为什么在Note平板电脑上尺寸总是为零,而在Galaxy S3手机上却不然?
2. 有没有办法解决平板电脑尺寸为零的问题?
3. 我应该检查一些东西来确定设备是否不支持我正在做的事情? (即使它处于据称支持的 sdk 级别)
4. 我是否需要捕获变化的 sps/pps 中流并停止解码器、重新配置并重新启动它?

解码器设置现在正在解析来自第一个 AU 的 sps/pps:

private final String    MIME_TYPE = "video/avc";    // H.264 Advanced Video Coding 

//set width and height                                                                                                                                                     
//cropping parameters should be used only when [frame_cropping_flag] is enabled in SPS.                                                                                    
if (h.sps.frame_cropping_flag == 1)                                                                                                                                        
{                                                                                                                                                                          
    mWidth = ((h.sps.pic_width_in_mbs_minus1 + 1) * 16) - h.sps.frame_crop_left_offset * 2 - h.sps.frame_crop_right_offset * 2;                                            
    mHeight= ((2 - h.sps.frame_mbs_only_flag)* (h.sps.pic_height_in_map_units_minus1 +1) * 16) - (h.sps.frame_crop_top_offset * 2) - (h.sps.frame_crop_bottom_offset * 2); 
}                                                                                                                                                                          
else                                                                                                                                                                       
{                                                                                                                                                                          
    mWidth = ((h.sps.pic_width_in_mbs_minus1 + 1) * 16);                                                                                                                   
    mHeight= ((2 - h.sps.frame_mbs_only_flag)* (h.sps.pic_height_in_map_units_minus1 +1) * 16);                                                                            
}                                                                                                                                                                          

            MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
            format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080);
            format.setInteger(MediaFormat.KEY_MAX_WIDTH,1920);
            format.setInteger(MediaFormat.KEY_MAX_HEIGHT,1080);
            format.setInteger(MediaFormat.KEY_PUSH_BLANK_BUFFERS_ON_STOP,1);

            //we know we have Codec-Sepcific Data if we got here
            format.setByteBuffer("csd-0", sps);
            if (ppsOffset != -1)
            {
                format.setByteBuffer("csd-1", pps);
            }
            else
            {
                //can this happen?
                Log.d(s_logTag, "UpdateInput - did not find PPS data");
            } 

            // Create a MediaCodec for the desired codec using the format variable we just created along with the surface passed to us in the constructor
            mDecoder = MediaCodec.createDecoderByType(MIME_TYPE);
            mDecoder.configure(format, mSurface, null, 0);          //not an encoder so pass 0 instead of flag: MediaCodec.CONFIGURE_FLAG_ENCODE);
            mDecoder.start();

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解码H264流bufferInfo.size始终为零 的相关文章

随机推荐

  • 使用 lucene.net 进行条件搜索

    我使用 lucene net 进行搜索的方式如下 此例程针对所有名为的索引字段搜索多个单词 标题 描述 网址 国家 地区 我需要知道如何给出一个条件 例如国家 地区 英国 或国家 美国 我希望多个单词应该像下面这样搜索 但我想在国家是英国时
  • ld:在 mac os x lion 上找不到 -lintl 的库

    我很久以前就安装了 git 1 7 4 4 我想升级到 git 1 7 11 然而 当我跑步时 sudo make prefix usr local 安装 它给出了这个错误 ld 找不到 lintl 的库 Collect2 ld 返回 1
  • 如何清除 VS2008 中错误列表的警告部分?

    具体来说 一旦我将某个网站的 WCAG 分析警告放入我的警告窗口中 我就无法摆脱它们 直到我关闭工作室 当在同一解决方案中构建另一个项目时 它们会留在那里 有人有什么想法吗 卸载 重新加载项目 我经常遇到无法清除的顽固错误 在带有 MS A
  • 如何取消协程中的阻塞代码

    我有以下代码结构 Throws InterruptedException class fun method do some blocking operations like Thread sleep var job launch metho
  • 在 Jersey Restful API 中创建 MIME****.tmp 文件

    我使用 Jersey 2 0 API 创建了一个 RESTful Web 服务 它可以生成和使用 json MediaType Path PortfolioSummary public class RESTWSService public
  • 组合框不会失去焦点

    我在使用 ComboBox 控件时遇到了问题 我不是 GUI 专家 但我知道这个问题与控件的焦点有关 由于某种原因 当我在组合框外部单击时 组合框不会失去焦点 举例来说 我单击组合框来列出其项目 我选择一项 这将关闭组合框 我单击第二个组合
  • 如何在 Julia 中使用锁

    我正在和朱莉娅一起工作 IDE 是 Juno 如果我是对的 async可以生成一个任务 它就像一个线程 所以我们可以这样做 async begin do something1 end async begin do something2 en
  • React原生垂直时间轴组件

    我想在 React Native 中创建一个垂直时间线 如下所示 但无法找到一个像样的库 有人可以建议一个库吗 或者如果它不是太棘手可以指导如何在没有库的情况下完成 您可以在常规 ListView 中实现此功能 在每一行中 在左侧放置一个固
  • 使用 DLLImport 导入对象

    我有一个 C 类的 dll SLABHIDDevice dll 我正在尝试在 C net 应用程序中使用此 dll 的功能 该 dll 包含多种方法 我可以通过诸如此类的语句轻松使用它们 如果我在这里弄错了一些术语 我深表歉意 因为我是使用
  • 是否可以删除子类/接口中继承的字段/方法?

    沿着这些思路 interface A a number x any interface B extends A b number interface C a number b number So the B将等于C 省略字段x但仍在延伸A
  • powershell Stop-Service 和 NET-STOP 有什么区别

    在 powershell 中 我见过多种停止服务的方法 更现代的方式 Stop Service wuauserv 还有更传统的方式 NET STOP WUAUSERV 传统方式自动化要困难得多 因为它本身并不是幂等的 https stack
  • AcceptSocket 不尊重 Thread.Abort 请求[重复]

    这个问题在这里已经有答案了 我的理解是 Thread Abort 应该在被阻止的线程上引发 ThreadAbortException 但是在处理时似乎并非如此TcpListener AcceptSocket 这是该问题的最基本说明 clas
  • 在 Android 中将 Json 转换为 Xml [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个 net web 服务和 w
  • nuget:“替换令牌‘id’没有值”

    执行中 nuget exe pack nuget nuget exe pack pathToProject myproject nuspec IncludeReferencedProjects Prop Configuration Rele
  • Datagridcolumn:通过 BindingProxy 绑定可见性和宽度显示不同的行为

    由于数据网格的列不在数据网格的可视化树中 我使用这种绑定代理方法来绑定数据网格的可见性DataGridTextColumn https www thomaslevesque com 2011 03 21 wpf how to bind to
  • 错误:对象已被删除或失效。 (领域)

    有时 很少但会发生 我收到错误Object has been deleted or invalidated 当尝试使用属性或在 AFnetworking 块内修改我的模型对象时 谁能帮我找出我做错了什么 错误 情况 1 Code void
  • 如何在 csv 列中使用逗号[重复]

    这个问题在这里已经有答案了 可能的重复 处理 CSV 文件中的逗号 https stackoverflow com questions 769621 dealing with commas in a csv file 我们正在将我们的一个项
  • Python setuptools 不包括 C++ 标准库头文件

    我正在尝试将 Python 包装器编译为我编写的小型 C 库 我写了以下内容setup py尝试使用的脚本setuptools编译包装器 from setuptools import setup Extension import numpy
  • 谷歌地图查询参数说明

    我正在网站中实现一项功能 通过 5 个输入框获取用户的位置 然后需要在谷歌地图中显示位置 我知道这个过程称为地理编码 但在进行一些搜索后 我再次遇到了这个链接 http www seomoz org ugc everything you n
  • 解码H264流bufferInfo.size始终为零

    我有一个 H264 流 想要使用 MediaCodec 将其解码以显示 因为我只是解码 并且希望定位尽可能多的设备 所以我支持 API 16 并使用 ExtractMpegFrames 测试作为参考 http bigflake com me