MF 无法播放来自我的源的视频
MF doesn't play video from my source
我正在开发一个基于媒体基础的h264播放器,从我自己的自定义媒体源播放h264视频和HE-AAC音频。
我的原型不播放视频,只播放音频。如何解决?
问题来了。我打开了我的URL。
该框架创建并初始化我的媒体源,然后创建并初始化音频和视频这两个流。
然后它要求视频样本,直到到达文件的末尾。日志中填充了CMFTransformDetours::ProcessOutput failed hr=0xC000D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
然后,在我的视频流发送MEEndOfStream后,框架要求再提供几个音频样本,最终将状态转换为播放,并开始只播放音频。
该框架试图在我的视频流中找到什么?
如果由内置流源打开,则相同的文件由相同的播放器代码播放OK。mftrace.exe说,当内置流源播放文件时,第一个视频样本比我的流源播放它时长38字节(所有其他样本的长度完全相同)。38字节正是我的视频的MF_MT_MPEG_SEQUENCE_HEADER的大小(即00 00 01+SPS+00 00 01+PPS)。我试图在第一帧中预先设置MF_MT_MPEG_SEQUENCE_HEADER值,但没有帮助。
系统提供的流源在视频样本上设置了未记录的属性,GUID={19124E7C-AD4B-465F-BB18-20186287B6AF},值是8字节的二进制值,如"09 00 00 29 0d 00 00 00",并更改每一帧——这是什么原因?
我还能尝试什么?
有没有关于MFh264解码器在输入时到底想要什么的文档?
提前谢谢。
我的代码中有两个主要问题。
- 我的流源没有输出GUID为{19124E7C-AD4B-465F-BB18-20186287B6AF}的属性该属性有文档记录,只是MFTrace.exe日志记录工具不知道,所以它打印GUID而不是名称。GUID代表MF_NAMELU_LENGTH_INFORMATION属性
我的视频流描述符的MF_NAMELU_LENGTH_SET属性设置为TRUE。这就是为什么h264解码器跳过了我所有的视频样本——它在它们上寻找MF_NAMELU_LENGTH_INFORMATION属性,但它不存在。
简单的修复方法--从描述符中删除MF_NAMELU_LENGTH_SET,解码器在没有该数据的情况下也可以。
- 对于这个原型,我从.mp4容器中读取了视频样本。容器中的NALU前面是它们的长度(以字节为单位)。MS解码器要求NALU前面加上起始代码"00 00 00 01"。请参阅此SO答案以了解更多信息。在我提供给解码器的样本中,我不得不将NALU长度替换为"00 00 00 01">
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 我应该如何表示我拥有的连续元素序列?
- 不必要的C++代码最终会出现在我完成的程序中吗?
- Opencv 恢复到比我设置的更高的分辨率
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 指针没有给我相同的价值
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 如何将我编写的对象传递到另一个类的构造函数中?
- 链接错误,包括我创建的相同头文件 - C++
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- 将矩阵乘以我自己的输入的向量
- 我可以从列表中获取对象并复制它们,但如何删除我复制的对象?
- 它在 { 令牌之前给了我预期的标识符
- 如何让我的OpenGL视频具有与QQuickItem相同的大小和位置?
- Blackmagic DirectShow Framerate - 为什么我没有获得我的捕获设备能够实现的所有视频模式