FFMPEG解码流程:

FFMPEG解码流程:
  1. 注册所有容器格式和CODEC:  av_register_all()
  2. 打开文件:                    av_open_input_file()
  3. 从文件中提取流信息:          av_find_stream_info()
  4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO
  5. 查找对应的解码器:            avcodec_find_decoder()
  6. 打开编解码器:                avcodec_open2()
      这里需要注意,从stream里面获得的codecCtx不能直接使用
 从stream里面获得的codecCtx指的是
 pCodecCtxOrig = pFormatCtx->streams[videoStream]->codec;
 这个pCodecCtxOrig不能直接使用,
 而要拷贝到另外一个位置,使用新的
 原文是这么写的
 Note that we must not use the AVCodecContext from the video stream directly!
 So we have to use avcodec_copy_context() to copy the context to a new location
     (after allocating memory for it, of course).


  7. 为解码帧分配内存:            avcodec_alloc_frame()
  8. 不停地从码流中提取出帧数据:  av_read_frame()
  9. 判断帧的类型,对于视频帧调用: avcodec_decode_video2()
  10.每读取完一个packet,解码之后,释放packet,然后重新读: av_free_packet(&packet)
  11.释放分配的内存(所有的packet解码之后):av_frame_free
  12. 解码完后,释放解码器:       avcodec_close()
  13. 关闭输入文件:               avformat_close_input_file()
  
  ========
  有几个函数不一定在基本流程里面使用,但是有必要介绍一下
  av_malloc av_free 
  `av_malloc` is ffmpeg's malloc that is just a simple wrapper around malloc
that makes sure the memory addresses are aligned and such. It will _not_
protect you from memory leaks, double freeing, or other malloc problems.
翻译过来之后是:
av_malloc 简单的封装了malloc,保证了内存地址对齐,但是以前malloc具有的内存泄漏,多次释放和其他问题还是需要自己注意。


avpicture_fill
Now we use avpicture_fill to associate the frame with our newly allocated
buffer. About the AVPicture cast: the AVPicture struct is a subset of the
AVFrame struct - the beginning of the AVFrame struct is identical to the
AVPicture struct.


avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);
其中buffer是刚刚用av_malloc分配的内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值