设置 OpenH264 编码器时 WelsInitEncoderExt 出现 ParamValidationExt 错误失败
ParamValidationExt error with WelsInitEncoderExt failed while setting up OpenH264 encoder
场景:
我在我的应用程序中使用 OpenH264 编码成 video_file.mp4
.
环境:
平台:MacOs Sierra
编译器:Clang++
代码:
以下是我所拥有的代码的关键:
void EncodeVideoFile() {
ISVCEncoder * encoder_;
std:string video_file_name = "/Path/to/some/folder/video_file.mp4";
EncodeFileParam * pEncFileParam;
SEncParamExt * pEnxParamExt;
float frameRate = 1000;
EUsageType usageType = EUsageType::CAMERA_VIDEO_REAL_TIME;
bool denoise = false;
bool lossless = true;
bool enable_ltr = false;
int layers = 1;
bool cabac = false;
int sliceMode = 1;
pEncFileParam = new EncodeFileParam;
pEncFileParam->eUsageType = EUsageType::CAMERA_VIDEO_REAL_TIME;
pEncFileParam->pkcFileName = video_file_name.c_str();
pEncFileParam->iWidth = frame_width;
pEncFileParam->iHeight = frame_height;
pEncFileParam->fFrameRate = frameRate;
pEncFileParam->iLayerNum = layers;
pEncFileParam->bDenoise = denoise;
pEncFileParam->bLossless = lossless;
pEncFileParam->bEnableLtr = enable_ltr;
pEncFileParam->bCabac = cabac;
int rv = WelsCreateSVCEncoder (&encoder_);
pEnxParamExt = new SEncParamExt;
pEnxParamExt->iUsageType = pEncFileParam->eUsageType;
pEnxParamExt->iPicWidth = pEncFileParam->iWidth;
pEnxParamExt->iPicHeight = pEncFileParam->iHeight;
pEnxParamExt->fMaxFrameRate = pEncFileParam->fFrameRate;
pEnxParamExt->iSpatialLayerNum = pEncFileParam->iLayerNum;
pEnxParamExt->bEnableDenoise = pEncFileParam->bDenoise;
pEnxParamExt->bIsLosslessLink = pEncFileParam->bLossless;
pEnxParamExt->bEnableLongTermReference = pEncFileParam->bEnableLtr;
pEnxParamExt->iEntropyCodingModeFlag = pEncFileParam->bCabac ? 1 : 0;
for (int i = 0; i < pEnxParamExt->iSpatialLayerNum; i++) {
pEnxParamExt->sSpatialLayers[i].sSliceArgument.uiSliceMode = pEncFileParam->eSliceMode;
}
encoder_->InitializeExt(pEnxParamExt);
int videoFormat = videoFormatI420;
encoder_->SetOption (ENCODER_OPTION_DATAFORMAT, &videoFormat);
int frameSize = frame_width * frame_height * 3 / 2;
int total_num = 500;
BufferedData buf;
buf.SetLength (frameSize);
// check the buffer before proceeding
if (buf.Length() != (size_t)frameSize) {
CloseEncoder();
return;
}
SFrameBSInfo info;
memset (&info, 0, sizeof (SFrameBSInfo));
SSourcePicture pic;
memset (&pic, 0, sizeof (SSourcePicture));
pic.iPicWidth = frame_width;
pic.iPicHeight = frame_height;
pic.iColorFormat = videoFormatI420;
pic.iStride[0] = pic.iPicWidth;
pic.iStride[1] = pic.iStride[2] = pic.iPicWidth >> 1;
pic.pData[0] = buf.data();
pic.pData[1] = pic.pData[0] + frame_width * frame_height;
pic.pData[2] = pic.pData[1] + (frame_width * frame_height >> 2);
for(int num = 0; num < total_num; num++) {
// try to encode the frame
rv = encoder_->EncodeFrame (&pic, &info);
}
if (encoder_) {
encoder_->Uninitialize();
WelsDestroySVCEncoder (encoder_);
}
}
上面的代码是我从official usage examples of OpenH264 where BufferedData.h is a class I reused from OpenH264 utils
中提取的
问题:
但是,我收到以下错误:
[OpenH264] this = 0x0x1038bc8c0, Error:ParamValidationExt(), width > 0, height > 0, width * height <= 9437184, invalid 0 x 0 in dependency layer settings!
[OpenH264] this = 0x0x1038bc8c0, Error:WelsInitEncoderExt(), ParamValidationExt failed return 2.
[OpenH264] this = 0x0x1038bc8c0, Error:CWelsH264SVCEncoder::Initialize(), WelsInitEncoderExt failed.
以上 不会使应用程序崩溃 但它会经历一个空白 运行 而不会使用我尝试写入的虚拟数据创建 video_file.mp4
进入其中。
问题:
我应用到 pEnxParamExt
的设置配置似乎有问题,它进入 encoder_->InitializeExt
.
我在设置编码器时做错了什么?
注:
我没有尝试连接任何相机设备。我只是想用一些虚拟图像数据创建一个 .mp4
视频。
如果您想获得完整的和可用的 OpenH264 编码器初始化程序,您可以单击...。
根据您的问题场景,您正在尝试从一些虚拟图像创建视频文件 (.mp4/.avi)。此任务可以使用两个不同的库来完成:i) 编解码器库,ii) 容器库。
i) 编解码器库:使用 OpenH264 压缩数据非常容易。我必须提到的一件事是,OpenH264 始终使用原始帧,例如yuv420 数据。所以,如果你想压缩你的图像数据,你必须将这些图像数据转换成 yuv420 颜色格式。要获取 OpenH264 单击... here
ii) 容器库:在获取编码数据后,您必须使用另一个库来创建扩展名为 .mp4、.avi、.flv 等的容器。存在很多库github 做 FFmpeg, OpenCV, Bento4, MP4Maker, mp4parser 等工作人员。在使用这些库之前,请详细检查许可证问题。如果您使用 FFmpeg,则不需要使用 OpenH264,因为 FFmpeg 本身可以与多种编解码器一起使用。您还会发现更多工作示例,因为许多开发人员都在处理视频数据。
希望能帮助到你。 :)
场景:
我在我的应用程序中使用 OpenH264 编码成 video_file.mp4
.
环境:
平台:MacOs Sierra
编译器:Clang++
代码:
以下是我所拥有的代码的关键:
void EncodeVideoFile() {
ISVCEncoder * encoder_;
std:string video_file_name = "/Path/to/some/folder/video_file.mp4";
EncodeFileParam * pEncFileParam;
SEncParamExt * pEnxParamExt;
float frameRate = 1000;
EUsageType usageType = EUsageType::CAMERA_VIDEO_REAL_TIME;
bool denoise = false;
bool lossless = true;
bool enable_ltr = false;
int layers = 1;
bool cabac = false;
int sliceMode = 1;
pEncFileParam = new EncodeFileParam;
pEncFileParam->eUsageType = EUsageType::CAMERA_VIDEO_REAL_TIME;
pEncFileParam->pkcFileName = video_file_name.c_str();
pEncFileParam->iWidth = frame_width;
pEncFileParam->iHeight = frame_height;
pEncFileParam->fFrameRate = frameRate;
pEncFileParam->iLayerNum = layers;
pEncFileParam->bDenoise = denoise;
pEncFileParam->bLossless = lossless;
pEncFileParam->bEnableLtr = enable_ltr;
pEncFileParam->bCabac = cabac;
int rv = WelsCreateSVCEncoder (&encoder_);
pEnxParamExt = new SEncParamExt;
pEnxParamExt->iUsageType = pEncFileParam->eUsageType;
pEnxParamExt->iPicWidth = pEncFileParam->iWidth;
pEnxParamExt->iPicHeight = pEncFileParam->iHeight;
pEnxParamExt->fMaxFrameRate = pEncFileParam->fFrameRate;
pEnxParamExt->iSpatialLayerNum = pEncFileParam->iLayerNum;
pEnxParamExt->bEnableDenoise = pEncFileParam->bDenoise;
pEnxParamExt->bIsLosslessLink = pEncFileParam->bLossless;
pEnxParamExt->bEnableLongTermReference = pEncFileParam->bEnableLtr;
pEnxParamExt->iEntropyCodingModeFlag = pEncFileParam->bCabac ? 1 : 0;
for (int i = 0; i < pEnxParamExt->iSpatialLayerNum; i++) {
pEnxParamExt->sSpatialLayers[i].sSliceArgument.uiSliceMode = pEncFileParam->eSliceMode;
}
encoder_->InitializeExt(pEnxParamExt);
int videoFormat = videoFormatI420;
encoder_->SetOption (ENCODER_OPTION_DATAFORMAT, &videoFormat);
int frameSize = frame_width * frame_height * 3 / 2;
int total_num = 500;
BufferedData buf;
buf.SetLength (frameSize);
// check the buffer before proceeding
if (buf.Length() != (size_t)frameSize) {
CloseEncoder();
return;
}
SFrameBSInfo info;
memset (&info, 0, sizeof (SFrameBSInfo));
SSourcePicture pic;
memset (&pic, 0, sizeof (SSourcePicture));
pic.iPicWidth = frame_width;
pic.iPicHeight = frame_height;
pic.iColorFormat = videoFormatI420;
pic.iStride[0] = pic.iPicWidth;
pic.iStride[1] = pic.iStride[2] = pic.iPicWidth >> 1;
pic.pData[0] = buf.data();
pic.pData[1] = pic.pData[0] + frame_width * frame_height;
pic.pData[2] = pic.pData[1] + (frame_width * frame_height >> 2);
for(int num = 0; num < total_num; num++) {
// try to encode the frame
rv = encoder_->EncodeFrame (&pic, &info);
}
if (encoder_) {
encoder_->Uninitialize();
WelsDestroySVCEncoder (encoder_);
}
}
上面的代码是我从official usage examples of OpenH264 where BufferedData.h is a class I reused from OpenH264 utils
中提取的问题:
但是,我收到以下错误:
[OpenH264] this = 0x0x1038bc8c0, Error:ParamValidationExt(), width > 0, height > 0, width * height <= 9437184, invalid 0 x 0 in dependency layer settings!
[OpenH264] this = 0x0x1038bc8c0, Error:WelsInitEncoderExt(), ParamValidationExt failed return 2.
[OpenH264] this = 0x0x1038bc8c0, Error:CWelsH264SVCEncoder::Initialize(), WelsInitEncoderExt failed.
以上 不会使应用程序崩溃 但它会经历一个空白 运行 而不会使用我尝试写入的虚拟数据创建 video_file.mp4
进入其中。
问题:
我应用到 pEnxParamExt
的设置配置似乎有问题,它进入 encoder_->InitializeExt
.
我在设置编码器时做错了什么?
注:
我没有尝试连接任何相机设备。我只是想用一些虚拟图像数据创建一个 .mp4
视频。
如果您想获得完整的和可用的 OpenH264 编码器初始化程序,您可以单击...
根据您的问题场景,您正在尝试从一些虚拟图像创建视频文件 (.mp4/.avi)。此任务可以使用两个不同的库来完成:i) 编解码器库,ii) 容器库。
i) 编解码器库:使用 OpenH264 压缩数据非常容易。我必须提到的一件事是,OpenH264 始终使用原始帧,例如yuv420 数据。所以,如果你想压缩你的图像数据,你必须将这些图像数据转换成 yuv420 颜色格式。要获取 OpenH264 单击... here
ii) 容器库:在获取编码数据后,您必须使用另一个库来创建扩展名为 .mp4、.avi、.flv 等的容器。存在很多库github 做 FFmpeg, OpenCV, Bento4, MP4Maker, mp4parser 等工作人员。在使用这些库之前,请详细检查许可证问题。如果您使用 FFmpeg,则不需要使用 OpenH264,因为 FFmpeg 本身可以与多种编解码器一起使用。您还会发现更多工作示例,因为许多开发人员都在处理视频数据。
希望能帮助到你。 :)