使用ffmpeg将x265 nal_单元解码为yuv
我正在编写一种skype应用程序,其中我首先使用x265编码器对视频进行编码。下面您可以看到编码器的设置以及对视频进行编码并获取nal_单位的线路使用ffmpeg将x265 nal_单元解码为yuv,ffmpeg,decode,yuv,hevc,Ffmpeg,Decode,Yuv,Hevc,我正在编写一种skype应用程序,其中我首先使用x265编码器对视频进行编码。下面您可以看到编码器的设置以及对视频进行编码并获取nal_单位的线路 x265_param_default_preset(param, "ultrafast", "zerolatency"); x265_param_parse(param, "fps", "30"); x265_param_parse(param, "input-res", "160x120"); //wxh x265_param_parse(para
x265_param_default_preset(param, "ultrafast", "zerolatency");
x265_param_parse(param, "fps", "30");
x265_param_parse(param, "input-res", "160x120"); //wxh
x265_param_parse(param, "bframes", "3");
x265_param_parse(param, "rc-lookahead", "5");
x265_param_parse(param, "repeat-headers", "1");
x265_nal *pp_nal=NULL;
uint32_t pi_nal=0;
int encoded = x265_encoder_encode(encoder, &pp_nal, &pi_nal, pic_in, pic_recon);
在此之后,我将pp_nal和pi_nal发送到客户端,然后我想用ffmpeg将这些nal_单元解码到yuv。我初始化解码器:
AVCodec *codec;
AVCodecContext *av_codec_context = NULL;
avcodec_register_all();
int frame_count;
FILE *f;
AVFrame *frame;
AVPacket avpkt;
av_init_packet(&avpkt);
codec = avcodec_find_decoder(AV_CODEC_ID_H265);
if (!codec) {
fprintf(stderr, "Codec not found\n");
exit(1);
}
av_codec_context = avcodec_alloc_context3(codec);
if (!av_codec_context) {
fprintf(stderr, "Could not allocate video codec context\n");
exit(1);
}
av_codec_context->width = 160;
av_codec_context->height = 120;
av_codec_context->extradata = NULL;
av_codec_context->pix_fmt = PIX_FMT_YUV420P;
/* open it */
if (avcodec_open2(av_codec_context, codec, NULL) < 0) {
fprintf(stderr, "Could not open codec\n");
exit(1);
}
AVFrame *av_frame_ = av_frame_alloc();
frame_count = 0;
int got_frame;
但这不起作用,并给出以下错误“error parsing nal unit”。我做错了什么?我想你要么需要在编解码器上下文中设置extradata字段,要么切换x265使用annexB。但我假设h264位流与h254.seconding@szatmary注释相似,假设相同
AVPacket av_packet;
av_new_packet(&av_packet, pp_nal->sizeBytes);
av_packet.data = (uint8_t *) pp_nal->payload;
av_packet.size = pp_nal->sizeBytes;
avcodec_decode_video2(av_codec_context, av_frame_, &got_frame, &av_packet);