【问题标题】:openh264 - bEnableFrameSkip=0, bitrate can't be controlledopenh264 - bEnableFrameSkip=0,比特率无法控制
【发布时间】:2016-07-31 04:53:11
【问题描述】:

有很多关于 opencv + H.264 的问题,但是 他们都没有给出详细的解释。

我在visual studio中使用openh264(openh264-1.4.0-win32msvc.dll)和opencv 3.1(使用启用ffmpeg的cmake自定义构建),我想用H.264压缩将来自网络摄像头的视频保存为mp4格式

VideoWriter write = VideoWriter("D:/movie.mp4", CV_FOURCC('H', '2', '6', '4'), 10.0, cv::Size(192, 144), true);

在使用 openh264 之前,在控制台窗口中我看到了一条警告消息 “无法加载 openh264 库:openh264-1.4.0-win32msvc.dll 请检查您的环境和/或从此处下载: https://github.com/cisco/openh264/releases" (也没有保存视频)

所以我下载了 dll 并与我的程序文件 (exe) 一起保存在一个文件夹中 现在当我运行程序时,我看到了不同的错误 “[OpenH264] this = 0x0DE312C0,警告:bEnabledFrameSkip=0,如果不启用跳帧,则无法控制 RC_QUALITY_MODE 和 RC_TIMESTAMP_MODE 的比特率” (现在视频保存了,但是尺寸非常大!比特率在 1200 Kbps 左右)

对我来说,使用 h264 的唯一目的是减小文件大小。我想我可能必须自己构建 openh264 并进行一些更改才能消除此错误,有人可以指导我如何操作吗?或者告诉我是否有办法通过代码以某种方式降低比特率?

PS:我尝试给出 -1 而不是 CV_FOURCC(),系统中的“已安装编解码器”窗口出现了,即使我从 @ 安装了各种编解码器包和 h264,我也找不到 h264 或 x264 或 h264vfw 987654322@

感谢和问候

【问题讨论】:

    标签: c++ opencv codec opencv3.1 openh264


    【解决方案1】:

    如果你想控制比特率,你必须同时使用两者

    encoderParemeters.iRCMode = RC_OFF_MODE;
    encoderParemeters.bEnableFrameSkip = true; 
    


    这里我以所有 Openh264 编码参数为例:

    long nReturnedValueFromEncoder = WelsCreateSVCEncoder(&m_pSVCVideoEncoder);
    
    
        m_nVideoWidth = 352;
        m_nVideoHeight = 288;
    
        SEncParamExt encoderParemeters;
    
        memset(&encoderParemeters, 0, sizeof(SEncParamExt));
    
        m_pSVCVideoEncoder->GetDefaultParams(&encoderParemeters);
    
        encoderParemeters.iUsageType = CAMERA_VIDEO_REAL_TIME;
        encoderParemeters.iTemporalLayerNum = 0;
        encoderParemeters.uiIntraPeriod = 15;
        encoderParemeters.eSpsPpsIdStrategy = INCREASING_ID;
        encoderParemeters.bEnableSSEI = false;
        encoderParemeters.bEnableFrameCroppingFlag = true;
        encoderParemeters.iLoopFilterDisableIdc = 0;
        encoderParemeters.iLoopFilterAlphaC0Offset = 0;
        encoderParemeters.iLoopFilterBetaOffset = 0;
        encoderParemeters.iMultipleThreadIdc = 0;
    
        encoderParemeters.iRCMode = RC_BITRATE_MODE;
        encoderParemeters.iMinQp = 0;
        encoderParemeters.iMaxQp = 52;
    
    
    
        encoderParemeters.bEnableDenoise = false;
        encoderParemeters.bEnableSceneChangeDetect = false;
        encoderParemeters.bEnableBackgroundDetection = true;
        encoderParemeters.bEnableAdaptiveQuant = false;
        encoderParemeters.bEnableFrameSkip = true;
        encoderParemeters.bEnableLongTermReference = true;
        encoderParemeters.iLtrMarkPeriod = 20;
        encoderParemeters.bPrefixNalAddingCtrl = false;
        encoderParemeters.iSpatialLayerNum = 1;
    
    
        SSpatialLayerConfig *spartialLayerConfiguration = &encoderParemeters.sSpatialLayers[0];
    
        spartialLayerConfiguration->uiProfileIdc = PRO_BASELINE;//;
    
        encoderParemeters.iPicWidth = spartialLayerConfiguration->iVideoWidth = m_nVideoWidth;
        encoderParemeters.iPicHeight = spartialLayerConfiguration->iVideoHeight = m_nVideoHeight;
        encoderParemeters.fMaxFrameRate = spartialLayerConfiguration->fFrameRate = (float)30;
    
        encoderParemeters.iTargetBitrate = spartialLayerConfiguration->iSpatialBitrate = 500000;
        encoderParemeters.iTargetBitrate = spartialLayerConfiguration->iMaxSpatialBitrate = 500000;
    
    
        spartialLayerConfiguration->iDLayerQp = 24;
        //spartialLayerConfiguration->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
        spartialLayerConfiguration->sSliceArgument.uiSliceMode = SM_SINGLE_SLICE;
    
    
        nReturnedValueFromEncoder = m_pSVCVideoEncoder->InitializeExt(&encoderParemeters);
    

    希望对你有所帮助。

    【讨论】:

    • 感谢您的详细回答,我认为对于该代码,我必须在 Visual Studio 中添加 openh264 库和包含文件。如何做到这一点?我是否需要自己构建 open264 库,或者我可以获得 Windows 的预编译库。我正在寻找,但没有得到太多。尝试了this,但它不起作用(在 Visual Studio 中构建失败)你有任何有用的链接吗?谢谢
    • 你必须使用 Visual Studio 构建 OpenH264:i) 下载 cisco 提供的 OpenH264 源代码 ii) 你会发现 Visual Studio 兼容项目 /OpenH264/codec/build/win32/dec 和 /OpenH264/codec /build/win32/enc 目录。 iii)您需要下载 NASM 软件 iv)然后将 NASM 可执行路径添加到所有这些 Visual Studio 项目 v)然后您可以在常规选项中选择静态或动态库。 vi) 最后,您将拥有 5 个不同的项目 .lib 或 .dll 文件,可在任何 Visual Studio 项目中使用。
    • 如何输入视频文件名,即video_file.mp4encoderParemeters ?如果不在encoderParemeters 中,我还能在哪里告诉编码器这是我要将数据编码到的视频文件。 @RajibTheKing 你能看看我的问题here。非常相似,与在 OpenH264 中设置编码器有关。提前致谢
    【解决方案2】:

    您可以使用 RC_BITRATE_MODE 并在 Openh264 中启用 bEnableFrameSkip 来简单地控制比特率。

    【讨论】:

    • 感谢您的回答。我以前没有使用过 Openh264。就像我在问题中所说的那样,我刚刚在可执行目录中复制了 dll 文件。所以我想启用 bEnableSkip 框架,我必须在 Visual Studio 项目中包含 open264 头文件和静态库?有什么有用的链接吗?试过 this 但没有用(在 Visual Studio 中构建失败)谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2016-12-05
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多