ffmpeg通过spspps的信息解析视频宽高和yuv格式(一)

本文内容是ffmpeg通过spspps的信息解析视频宽高和yuv格式,ffmpeg对这个支持没有对外接口,可以参考下面文章。 

http://ffmpeg.org/pipermail/ffmpeg-devel/2015-July/176434.html

如果想解析请看下面:

 

/* 通过sps/pps和一个idr帧获取视频宽高以及yuv格式(必须包含一帧IDR帧否则解析不出来,也可以解码一帧数据获取信息);
* 参数:传入的视频,传入的视频长度,视频编码类型(AVCodecID_t),传出的解析后的宽,传出的解析后的高,传出的解析后的yuv格式;
* 返回值:0:失败;1:成功;
*/
int func(const char * videooutdata, const int videooutdatasize, int video_codecID,
    int * outwidth, int * outheight, int * outpixelfromat);

int func(const char * videooutdata, const int videooutdatasize, int video_codecID,
	int * outwidth, int * outheight, int * outpixelfromat)
{
	int ret = 0;
	AVCodecParserContext *parservideo = NULL;
	AVCodecContext *cvideo = NULL;
	AVCodec *codecvideo = NULL;
	char * outvideo = (char *)malloc(sizeof(char)* (videooutdatasize + 64));
	memset(outvideo, 0, (videooutdatasize + 64));
	AVPacket * outpkt = NULL;
	
	if (videooutdatasize <= 0)
	{
		return 0;
	}

	outpkt = av_packet_alloc();
	if (!outpkt)
	{
		return 0;
	}

	if (parservideo == NULL)
	{
		/* find the H264 or H265 video */
		if (video_codecID == AV_CODEC_ID_H264_t)
		{
			codecvideo = avcodec_find_decoder(AV_CODEC_ID_H264);
		}
		else if (video_codecID == AV_CODEC_ID_H265_t)
		{
			codecvideo = avcodec_find_decoder(AV_CODEC_ID_H265);
		}
		else
		{
			av_packet_free(&outpkt);
			return 0;
		}
		if (!codecvideo)
		{
			printf("parser_videoinfo Codec not found\n");
			return 0;
		}

		parservideo = av_parser_init(codecvideo->id);
		if (!parservideo)
		{
			printf("parser_videoinfo parser not found\n");
			return 0;
		}

		cvideo = avcodec_alloc_context3(codecvideo);
		if (!cvideo)
		{
			printf("parser_videoinfo Could not allocate video codec context\n");
			return 0;
		}
		/* open it */
		if (avcodec_open2(cvideo, codecvideo, NULL) < 0)
		{
			printf("parser_videoinfo Could not open codec\n");
			return 0;
		}
	}
	ret = av_parser_parse2(parservideo, cvideo, &outpkt->data, &outpkt->size,
		(uint8_t *)videooutdata, videooutdatasize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
	if (ret > 0)
	{
		ret = av_parser_parse2(parservideo, cvideo, &outpkt->data, &outpkt->size,
			NULL, 0, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
	}

	if (outpkt->size >0)
	{
		*outwidth = parservideo->width;
		*outheight = parservideo->height;
		*outpixelfromat = parservideo->format;
		if (parservideo->width == 0 ||
			parservideo->height == 0 ||
			parservideo->format == -1)
		{
			ret = 0;
		}
		ret = 1;
	}
	av_parser_close(parservideo);
	avcodec_free_context(&cvideo);
	av_packet_free(&outpkt);

	return ret;
}


 

 

如有错误请指正:

交流请加QQ群:62054820
QQ:379969650.


版权声明:本文为zhuweigangzwg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。