大致流程:
- 注册所有编解码器与解复用器(可省略)
- 初始化媒体上下文结构体
- 打开视频文件——avformat_open_input函数功能很强大,读取文件并给AVFormatContext赋值
- 再检索流信息,使用avformat_find_stream_info来更新媒体上下文信息(下图为打印媒体信息,分别在调用avformat_find_stream_info的前后,数据上会有不同)
- 找到视频流并用其流所对应的编解码器信息来初始化编解码器上下文
- 用编解码上下文中的编解码器ID来查找编解码器
- 打开编解码器
- 申请空间存放转换前后的AVFrame:即解码之后的数据,并初始化SwsContext用于后续格式转换
- 解码 使用av_send_packet与av_receive_frame(). 这俩函数已经替代了avcodec_decode_video2()
- 格式转换并保存PPM数据
代码如下:
#include <iostream> #include <stdlib.h> #include <thread> #define LOG(x) std::cout<<x<<std::endl; #ifdef __cplusplus extern "C" { #endif #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h> #include <libavutil/imgutils.h> #ifdef __cplusplus } #endif int checkRet(int &ret,const char* error,const char* success){ if(ret<0){ LOG(error); return -1; } LOG(success); } int& getVideoStream(AVFormatContext* pFormatCtx,int &videoStream){ for(int i = 0;i < pFormatCtx->nb_streams;i++){ if(pFormatCtx->streams[i]->codecpar->codec_type