MFT 编码器 (h264) CPU 利用率高

2023-11-29

我能够使用 Media Foundation Transform (MFT) 成功地通过 H264 对数据进行编码,但不幸的是我的 CPU 非常高(当我在程序中评论该函数的调用时,我的 CPU 很低)。只需执行几个步骤即可获得编码,所以我无能为力改进它?任何想法都可以提供帮助

    HRESULT MFTransform::EncodeSample(IMFSample *videosample, LONGLONG llVideoTimeStamp, MFT_OUTPUT_STREAM_INFO &StreamInfo, MFT_OUTPUT_DATA_BUFFER &encDataBuffer)
{
    HRESULT hr;
    LONGLONG llSampleDuration;
    DWORD mftEncFlags, processOutputStatus;
    //used to set the output sample
    IMFSample *mftEncodedSample;
    //used to set the output sample
    IMFMediaBuffer *mftEncodedBuffer = NULL;
    memset(&encDataBuffer, 0, sizeof encDataBuffer);
    if (videosample)
    {
        //1=set the time stamp for the sample
        hr = videosample->SetSampleTime(llVideoTimeStamp);
        #ifdef _DEBUG
        printf("Passing sample to the H264 encoder with sample time %i.\n", llVideoTimeStamp);
        #endif
        if (SUCCEEDED(hr))
        {
            hr = MFT_encoder->ProcessInput(0, videosample, 0);
        }
        if (SUCCEEDED(hr))
        {
            MFT_encoder->GetOutputStatus(&mftEncFlags);
        }
        if (mftEncFlags == MFT_OUTPUT_STATUS_SAMPLE_READY)
        {
            hr = MFT_encoder->GetOutputStreamInfo(0, &StreamInfo);

            //create empty encoded sample
            if (SUCCEEDED(hr))
            {
                hr = MFCreateSample(&mftEncodedSample);
            }
            if (SUCCEEDED(hr))
            {
                hr = MFCreateMemoryBuffer(StreamInfo.cbSize, &mftEncodedBuffer);
            }
            if (SUCCEEDED(hr))
            {
                hr = mftEncodedSample->AddBuffer(mftEncodedBuffer);
            }
            if (SUCCEEDED(hr))
            {
                encDataBuffer.dwStatus = 0;
                encDataBuffer.pEvents = 0;
                encDataBuffer.dwStreamID = 0;
                //Two shall after this step points on the same address
                encDataBuffer.pSample = mftEncodedSample;
                hr = MFT_encoder->ProcessOutput(0, 1, &encDataBuffer, &processOutputStatus);


            }
        }
    }
    SafeRelease(&mftEncodedBuffer);

    return hr;
}

第一个关键是确保您已配置接收器MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS。我还设置了MF_LOW_LATENCY属性。

// error checking omitted for brevity
hr = attributes->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);
hr = attributes->SetUINT32(MF_SINK_WRITER_DISABLE_THROTTLING, TRUE);
hr = attributes->SetUINT32(MF_LOW_LATENCY, TRUE);

另一个关键是确保您选择源输出的本机格式。否则,你将会非常失望。我详细描述了这一点here.

我还应该提到,您应该考虑在开始时创建一次转换样本和内存缓冲区,而不是在收到的每个样本上重新创建它们。

祝你好运。我希望这有帮助。

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

MFT 编码器 (h264) CPU 利用率高 的相关文章

  • 使用 Media Foundation 对 Direct X 表面进行编码

    我正在尝试使用 MediaFoundation API 对视频进行编码 但在将示例推送到 SinkWriter 时遇到问题 我正在通过桌面复制 API 获取要编码的帧 我最终得到的是一个包含桌面图像的 ID3D11Texture2D 我正在
  • ffmpeg API h264编码的视频不能在所有平台上播放

    Edit 在之前的版本中 我使用了非常旧的 ffmpeg API 我现在使用最新的库 问题仅略有变化 从 主要 变为 高 我正在使用 ffmpeg C API 在 C 中创建 mp4 视频 我希望生成的视频具有 约束基线 配置文件 以便生成
  • 如何在 Windows 8 现代应用程序上从视频流中抓取帧?

    我正在尝试从 mp4 视频流中提取图像 查找完内容后 正确的方法似乎是使用 C 中的媒体基础并打开框架 从中读取内容 文档和示例很少 但经过一番挖掘后 似乎有些人已经成功地做到了这一点 通过将帧读入纹理并将该纹理的内容复制到内存可读的纹理
  • 取自 .mp4 的 H.264 解码器配置记录的格式

    我正在检查从 Android 设备录制的 mp4 视频文件中包含的解码器配置记录 有些设备的解码器配置记录中写入了奇怪或不正确的参数 以下是来自 Galaxy Player 4 0 的示例 该示例是不正确的 DecoderConfigura
  • H264 帧查看器

    您知道有什么应用程序可以向我显示单个 H264 帧的所有标头 参数吗 我不需要解码它 我只是想看看它是如何构建的 我想到了三种方法 如果您正在寻找免费的东西 否则谷歌 h264分析 以获取付费选项 下载h 264解析器 http www w
  • iOS 上通过 RTMP 的 H264 视频流

    经过一番挖掘 我发现了一个库 可以在写入 mp4 文件时从该文件中提取 NAL 单元 我正在尝试使用 RTMP 将此信息打包为 flvlibavformat and libavcodec 我使用以下方法设置视频流 void setupVid
  • 使用libavcodec解码H264视频,C

    我正在尝试使用 ffmpeg libavcodec 解码原始 h264 文件 但无法使其正常工作 目前输出应该是原始 YUV 文件 可以用GCC编译代码 gcc o decoder decoder c L lib llibavcodec l
  • 使用 bufferedimages 将视频编码为 h264?

    我正在尝试使用 java 将大量缓冲图像 由我的应用程序动态创建的预先保存的图像 转换为视频 并希望有一个库可以帮助完成该过程 我探索了许多不同的选项 例如 jcodec 没有关于如何使用它的文档 Xuggler 由于与jdk5及其相关库的
  • WASAPI 重采样/Windows Media Foundation

    我正在使用 WASAPI 编写一个专业音频应用程序 此应用程序以独占模式运行流 并在两个方向上将音频数据重新采样为恒定格式或从恒定格式重新采样 一个在捕获设备和应用程序之间重新采样 另一个在应用程序和输出设备之间重新采样 MSDN 上有一个
  • 为什么 AVSampleBufferDisplayLayer 会失败并出现操作中断 (-11847)?

    我正在使用一个AVSampleBufferDisplayLayer解码并显示从服务器流式传输的 H 264 视频 当我的应用程序进入后台然后返回前台时 解码过程就会搞砸 并且AVSampleBufferDisplayLayer失败 我看到的
  • Microsoft Media Foundation 中的 h264 无损模式

    我发现h264编解码器可以工作在无损压缩模式下 但微软媒体基金会支持吗 如果是这样 我如何将该编解码器的压缩模式从有损压缩模式切换到无损压缩模式 Windows 附带的 H 264 编码器的软件实现仅限于 H 264 配置文件 并且不提供无
  • 使用 libavcodec 的 mpegts 容器中的原始 H264 帧

    我非常感谢对以下问题的帮助 我有一个带摄像头的小工具 可以生成 H264 压缩视频帧 这些帧将发送到我的应用程序 这些帧不在容器中 只是原始数据 我想用ffmpeg和libav函数创建一个视频文件 方便以后使用 如果我解码帧 然后对其进行编
  • 使用 libavformat API 读取 H264 SPS 和 PPS NAL 字节

    如何使用 libavformat API 读取 H264 SPS 和 PPS NAL 字节 我尝试使用 av read frame input avFormatContext avPkt API 从 mp4 视频 编解码器为 h264 文件
  • 非 IDR 图片 NAL 单元 - 0x21 和 0x61 含义

    有谁知道是什么0x21 and 0x61是指在 h 264 编码的视频流中吗 我知道0x01意味着它是一个b frame and 0x41意味着它是一个p frame 我的编码视频给了我两个0x21帧后跟一帧b frame I 21 21
  • Html5 视频和 Flash 方法

    研究 HTML5 视频标签 并研究哪些浏览器支持哪些视频文件类型 我最初的想法是事情变得比仅仅使用 Flash 更困难 我想知道是否有人已经找到一些骨架代码 与视频的开发方法相结合 来执行以下操作 如果闪光灯可用 请使用它 如果没有 请尝试
  • 视频录制挂在 IMFSinkWriter->Finalize() 上;

    我在使用 Media Foundation 将视频录制完成为 mp4 时遇到问题 其中调用IMFSinkWriter gt Finalize 永远挂起 它并不总是发生 并且几乎可以在任何计算机上发生 在 Windows 服务器 7 8 10
  • 有没有简单的方法来提取附件 b 格式的 h264 原始流?

    当我使用命令行使用 ffmpeg 提取视频流时 ffmpeg i 一些文件 vcodec copy an f rawvideo h264 什么 out h264 对于 Adob e Media Encoder 生成的某些媒体文件 只有 m4
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • h264 参考帧

    我正在寻找一种在 h264 流中查找参考帧的算法 我在不同的解决方案中看到的最常见的方法是查找访问单元分隔符和 IDR 类型的 NAL 不幸的是 我检查的大多数流没有 IDR 类型的 NAL 我将不胜感激的帮助 问候 雅采克 H264 帧由
  • 如何使用AVAssetWriter将h264流写入视频?

    我想将 h 264 流从服务器传输到视频文件 但是当我使用assetwrite finishwrite XCode 报告 Video var mobile Applications DE4196F1 BB77 4B7D 8C20 7A5D6

随机推荐