如何获得Microsoft MPEG4源来以高于4Gbps的比特率打开MOV

如何解决如何获得Microsoft MPEG4源来以高于4Gbps的比特率打开MOV

似乎当MOV的比特率太高并且无法容纳32位时,Microsoft MPEG 4 Source不会对其进行解析。有人知道解决此问题的方法吗?

我非常确定它与比特率有关,因为我已经生成了测试文件,并且通过仅调整帧速率,我生成了两个文件-比特率超过4.2Gbps(32位)的文件不会打开,但是另一个比特率小于4.2Gps的文件会打开文件。

我尝试使用IMFSourceReader打开文件:

            IMFSourceReader* reader = nullptr;
            hr = MFCreateSourceReaderFromURL(L"input.mov",nullptr,&reader);
            SAFE_RELEASE(reader);

但这只会返回E_FAIL。

我尝试通过IMFSourceResolver打开它:

        IMFMediaSource* source = nullptr;

        IMFSourceResolver* resolver = nullptr;
        MFCreateSourceResolver(&resolver);

        MF_OBJECT_TYPE objectType;
        IUnknown* result = nullptr;
        hr = resolver->CreateObjectFromURL(L"input.mov",MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE | MF_RESOLUTION_READ,&objectType,&result);

这也失败了。

为重现此内容,我上传了一个小的400KB ZIP,其中包含:

  1. 3000x3000源图像
  2. .bat ffmpeg命令生成视频
  3. 3000x3000 @ 59fps的HapQ MOV文件-MPEG4源可以解决此问题,比特率仅低于4.2Gbps
  4. 3000x3000 @ 60fps的HapQ MOV文件-MPEG4源无法解决此问题,比特率仅为推动者4.2Gbps

生成视频供参考:

ffmpeg -y -loop 1 -i black3000.png -t 0.2 -r 59 -s 3000x3000 -c:v hap -format hap_q -compressor none output-good.mov
ffmpeg -y -loop 1 -i black3000.png -t 0.2 -r 60 -s 3000x3000 -c:v hap -format hap_q -compressor none output-bad.mov
pause

有没有其他人以前见过这种行为,并且知道解决方法?

谢谢

解决方法

就像@Simon Mourier所建议的那样,解决此问题的唯一方法是实现自定义ByteStreamHandler并向MFRegisterLocalByteStreamHandler注册它,但是您还必须创建一个自定义IMFMediaSource,因为我找不到任何方法似乎只能实例化MPEG4源,所以只能通过其ByteStreamHandler创建它。.

作为参考,这是我用来创建手动创建MPEG4源而不使用Source Resolver的伪测试代码:

#include <initguid.h>
DEFINE_GUID(CLSID_MPEG4ByteStreamPlugin,0x271c3902,0x6095,0x4c45,0xa2,0x2f,0x20,0x09,0x18,0x16,0xee,0x9e);


class CallbackTest : public IMFAsyncCallback
{
public:
    CallbackTest(IMFByteStreamHandler* handler)
    {
        _handler = handler;
    }

    IMFByteStreamHandler* _handler;

    virtual HRESULT QueryInterface(REFIID riid,void ** ppvObject) override
    {
        return HRESULT();
    }
    virtual ULONG AddRef(void) override
    {
        return 1;
    }
    virtual ULONG Release(void) override
    {
        return 1;
    }
    virtual HRESULT GetParameters(DWORD * pdwFlags,DWORD * pdwQueue) override
    {
        return E_NOTIMPL;
    }
    virtual HRESULT __stdcall Invoke(IMFAsyncResult * pAsyncResult) override
    {
        // At this point HR = E_FAIL for > 4.2Gbps MOV
        HRESULT hr = pAsyncResult->GetStatus();

        MF_OBJECT_TYPE objectType;
        IUnknown* unknownObject = nullptr;
        hr = _handler->EndCreateObject(pAsyncResult,&objectType,&unknownObject);

// NOTE: I also tried to just force creating the MPEG 4 Source by calling
// EndCreateObject with a dummy IMFAsyncResult but that always failed..

        IMFMediaSource* mediaSource = nullptr;
        hr = unknownObject->QueryInterface(&mediaSource);

        return S_OK;
    }
};

void Test()
{
    HRESULT hr;

    // Create a bytestream from the file
    IMFByteStream* byteStream = nullptr;
    hr = MFCreateFile(MF_ACCESSMODE_READ,MF_OPENMODE_FAIL_IF_NOT_EXIST,MF_FILEFLAGS_NOBUFFERING,fileUrl,&byteStream);

// Create the MPEG4 ByteStreamHandler
    IMFByteStreamHandler* handler = nullptr;
    hr = CoCreateInstance(CLSID_MPEG4ByteStreamPlugin,nullptr,CLSCTX_ALL,IID_IMFByteStreamHandler,(void**)&handler);
    
    IMFAsyncCallback* callback = new CallbackTest(handler);
    hr = handler->BeginCreateObject(byteStream,MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_READ | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,callback,handler);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res