以 MPEG-1 为例的视频解码例子,不含封装,只解析裸流
流程:
-
视频数据包初始化,av_packet_alloc
-
查找 MPEG-1 解码器, avcodec_find_decoder
-
数据解析器初始化,av_parser_init
-
解码结构初始化,avcodec_alloc_context3
-
打开解码器,avcodec_open2
-
打开视频文件,fopen
-
解码视频帧初始化,av_frame_alloc
-
循环
读文件,fread
解析数据包,av_parser_parse2
解码视频帧,avcodec_send_packet,avcodec_receive_frame
写文件(PGM图,p5),fopen,fwrite,fclose -
关闭视频文件,fclose
-
关闭解析器,av_parser_close
-
释放解码器,avcodec_free_context
-
释放视频帧,av_frame_free
-
释放视频数据包,av_packet_free
升级方案:
- avcodec_find_decoder 可以调用其他解码器,解析其他裸流,如:h264、h265等
- 解码后的输出帧,可以按 yuv 分量保存成 yuv 视频文件
//Y, U, V (YUV420P)
FILE *fp = fopen(filepath_out, "wba");
for(int i=0;i<frame->height;i++){
fwrite(frame->data[0]+pFrame->linesize[0]*i,1,frame->width,fp);
}
for(int i=0;i<frame->height/2;i++){
fwrite(frame->data[1]+frame->linesize[1]*i,1,frame->width/2,fp);
}
for(int i=0;i<frame->height/2;i++){
fwrite(frame->data[2]+frame->linesize[2]*i,1,frame->width/2,fp);
}
flcose(fp);
decode_video.c
/**
* @file
* video decoding with libavcodec API example
*
* @example decode_video.c
*/
#include <stdio.h>
#include <stdlib.h>
#