openh264 - bEnableFrameSkip=0,比特率无法控制
openh264 - bEnableFrameSkip=0, bitrate can't be controlled
有很多关于 opencv + H.264 的问题,但是
none个给出了详细的解释
我在 visual studio 中使用 openh264(openh264-1.4.0-win32msvc.dll) 和 opencv 3.1(使用启用了 ffmpeg 的 cmake 的自定义构建),我想用 H 以 mp4 格式保存来自网络摄像头的视频.264 压缩
VideoWriter write = VideoWriter("D:/movie.mp4", CV_FOURCC('H', '2',
'6', '4'), 10.0, cv::Size(192, 144), true);
在使用 openh264 之前,在控制台中 window 我看到一条警告消息
“无法加载 openh264 库:openh264-1.4.0-win32msvc.dll
请检查您的环境 and/or 从这里下载:
https://github.com/cisco/openh264/releases”
(也没有保存视频)
所以我下载了 dll 并与我的程序文件 (exe) 保存在一个文件夹中
现在当我 运行 程序时,我看到了不同的错误
“[OpenH264] this = 0x0DE312C0,警告:bEnabledFrameSkip=0,在不启用跳帧的情况下无法控制 RC_QUALITY_MODE 和 RC_TIMESTAMP_MODE 的比特率”
(现在视频保存了,但是体积很大!码率在1200Kbps左右)
对我来说,使用 h264 的唯一目的是减小文件大小。我想我可能必须自己构建 openh264 并进行一些更改才能消除此错误,有人可以指导我怎么做吗?或者告诉我是否有办法通过代码以某种方式降低比特率?
P.S: 我试着给 -1 而不是 CV_FOURCC(),'installed codecs' window 在我的系统中出现了,我找不到 h264 或 x264或 h264vfw,即使我已经从 here
安装了各种编解码器包和 h264
感谢和问候
您可以使用 RC_BITRATE_MODE 并在 Openh264 中启用 bEnableFrameSkip 来简单地控制比特率。
如果你想控制比特率,你必须同时使用两者
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);
希望对您有所帮助。
有很多关于 opencv + H.264 的问题,但是
none个给出了详细的解释
我在 visual studio 中使用 openh264(openh264-1.4.0-win32msvc.dll) 和 opencv 3.1(使用启用了 ffmpeg 的 cmake 的自定义构建),我想用 H 以 mp4 格式保存来自网络摄像头的视频.264 压缩
VideoWriter write = VideoWriter("D:/movie.mp4", CV_FOURCC('H', '2', '6', '4'), 10.0, cv::Size(192, 144), true);
在使用 openh264 之前,在控制台中 window 我看到一条警告消息 “无法加载 openh264 库:openh264-1.4.0-win32msvc.dll 请检查您的环境 and/or 从这里下载: https://github.com/cisco/openh264/releases” (也没有保存视频)
所以我下载了 dll 并与我的程序文件 (exe) 保存在一个文件夹中 现在当我 运行 程序时,我看到了不同的错误 “[OpenH264] this = 0x0DE312C0,警告:bEnabledFrameSkip=0,在不启用跳帧的情况下无法控制 RC_QUALITY_MODE 和 RC_TIMESTAMP_MODE 的比特率” (现在视频保存了,但是体积很大!码率在1200Kbps左右)
对我来说,使用 h264 的唯一目的是减小文件大小。我想我可能必须自己构建 openh264 并进行一些更改才能消除此错误,有人可以指导我怎么做吗?或者告诉我是否有办法通过代码以某种方式降低比特率?
P.S: 我试着给 -1 而不是 CV_FOURCC(),'installed codecs' window 在我的系统中出现了,我找不到 h264 或 x264或 h264vfw,即使我已经从 here
安装了各种编解码器包和 h264感谢和问候
您可以使用 RC_BITRATE_MODE 并在 Openh264 中启用 bEnableFrameSkip 来简单地控制比特率。
如果你想控制比特率,你必须同时使用两者
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);
希望对您有所帮助。