ffmpeg解码学习(一)

一、FFmpeg解码流程: 
1、注册所有容器格式和CODEC:avcodec_register_all(); 
2、查找对应的解码器:avcodec_find_decoder(AV_CODEC_ID_MJPEG); 
3、分配编解码器参数数据结构avcodec_alloc_context3(AVCodec *codec); 
4、对于部分编解码需要对上一步分配的数据结构进行初始化,因为某些参数在视频流中无效; 
5、打开编解码器:avcodec_open2(AVCodecContext *ctx, AVCodec *codec, NULL); 
6、为解码帧分配内存:AVFrame *frame = av_frame_alloc(); 
7、初始化编解码输入数据结构AVPacket:av_init_packet(AVPacket *packet); 
8、将待解码的压缩视频数据放入数据结构AVPacket中: 
(AVPacket)packet.data = inbuf(待解码视频数据缓存); 
(AVPacket)packet.size = inbufsize(待解码视频数据长度); 
9、调用解码函数开始解码:avcodec_decode_video2(AVCodecContext *ctx,AVFrame *frame,int *got,AVPacket packet); 
10、拷贝解码后的一帧数据,解码后的数据格式根据解码前的数据格式决定,例如,USB摄像头的MJPEG数据解码后是YUV422P格式,H264格式数据解码后是YUV420P格式;解码后的数据存放在AVFrame数据结构指向的缓存中,存放方式为:(AVFrame )frame->data[0]指向Y分量,(AVFrame )frame->data[1]指向U分量,(AVFrame )frame->data[2]指向V分量;(AVFrame )frame->linesize[0]、(AVFrame )frame->linesize[1]、(AVFrame )frame->linesize[2]分别为Y、U、V分量每行的长度。
二、<<左移是乘以2的意思 运算速度比value=value
2要快得多
三、Ffmpeg 交叉编译
四、./configure --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --target-os=linux --cc=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/aarch64-linux-gnu-gcc --arch=arm64 --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads

猜你喜欢

转载自blog.csdn.net/qq_40008325/article/details/86321191