FFmpeg HEVC (x265)编码

4
我正在尝试在FFmpeg库中使用H265编码器,但是遇到了以下错误:
Cannot open libx265 encoder.

这是我的代码:

这是我的代码:

formatContext = avformat_alloc_context();
videoStream = avformat_new_stream(formatContext,0);
if(!videoStream ) {
    //error
    return;
}
av_init_packet(&packet);
codecContext=videoStream->codec;
codecContext->codec_type = AVMEDIA_TYPE_VIDEO;
codecContext->width = width;
codecContext->height = height;
codecContext->time_base.den = fps;
codecContext->time_base.num = 1;
codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
codecContext->codec_id = AV_CODEC_ID_HEVC;
AVDictionary *param = 0;
av_dict_set(&param, "x265-params", "qp=20", 0);
av_dict_set(&param, "preset", "ultrafast", 0);
av_dict_set(&param, "tune", "zero-latency", 0);
av_dict_set(&param, "qmin", "0", 0);
av_dict_set(&param, "qmax", "69", 0);
av_dict_set(&param, "qdiff", "4", 0);
codec = avcodec_find_encoder(codecContext->codec_id);
if (!codec) {
    //codec not found
    return;
}
int rt = avcodec_open2(codecContext, codec, &param); // <----- fails here
if (rt < 0) {
    // fails here!!
    return;
}

这段代码适用于h264编码器,有人知道为什么不适用于hevc吗?

你是否构建了libx265? - cahn
不好意思,我正在使用来自这里的FFmpeg:http://ffmpeg.zeranoe.com/builds/ 最新版本。 - luca
你是否使用 avcodec_register 注册了编解码器? - cahn
是的,抱歉我之前没有写明,因为我在发布的代码之前已经在另一个函数中注册了:av_register_all(); avcodec_register_all(); - luca
你在2/12之后下载了包含avcodec-55.dll的共享构建吗? - cahn
尝试使用ffmpeg-20140306-git-bba7b6f-win32-shared,但无法工作。 - luca
2个回答

1
如果你设置了:


codecContext->sample_aspect_ratio.num = 4;
codecContext->sample_aspect_ratio.den = 3;

HEVC编码器可以工作,但输出没有视频。

使用您的设置,我可以初始化编解码器,但现在出现了“访问冲突读取...”的问题。我不知道是否传递了错误的数据,但如果切换到h264,则一切正常。 - luca
你是否从ffmpeg.zeranoe.com/builds重新下载了ffmpeg? - user3387182
或者你的视频宽高比是4:3或16:9,如果是后者,你需要设置:sample_aspect_ratio.num = 16; 和 sample_aspect_ratio.den = 9; - user3387182
是的,我已经从zeranoe.com下载了FFmpeg,我的视频是4:3(400:300)。 - luca
你遇到的“访问冲突”可能来自于另一个问题,也许是在数据包编码完成之前尝试获取它。 - user3387182
我不知道,我将数据传递给一个名为“encode”的函数,如果它对数据进行编码,则返回长度为n的数据,否则返回数据=0和长度=0。从调用堆栈中看来,似乎在avcodec-55.dll内部发生了访问冲突。 - luca

1

你好,你是否成功打开了libx265编码器? 我之前也遇到过同样的问题,尝试使用AV_CODEC_ID_H265代替。 之前我也遇到过libx264的问题,但是通过设置解决了:

av_dict_set(&param, "profile", "high", 0);

似乎编解码器配置中缺少某些内容。

1
在avcodec.h中有这个#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC,所以两者都可以使用,我已经在preset和tune之前添加了您的profile high,但现在出现了以下错误:Undefined constant or missing '(' in 'high' Unable to parse option value "high" Error setting option profile to value high. - luca
抱歉我们误解了,我认为配置文件参数只适用于libx264。而且肯定在libx265的配置中缺少类似这样的东西。 - user3387182
你是救命恩人。 - ar2015

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接