视频解码一般步驺
1.准备上下文
AVFormatContext
AVCodec AVCodecContext
2.准备上下文的原子对象
AVFrame
AVPacket
3.配置解码器
一种是直接find decoder输入AVCodecID即可
另一种是按AVFormatContext->streams[st_index_video]->codecpar->codec_id来find decoder
第二种比较保险,寻找格式方便,比如若解析txt文件,他会自动找到‘tty’格式的解码器,如果是我自己,一定很难找到的。这种方法根本上是根据后缀名判断的,若无后缀名则在format open input的时候就返回NULL了,这种情况下若自己对数据内容有把握,可以自己设定AVInputFormat,退一步说,你随便设置一个InputFormat,后面read_frame以后再用合适的方法来处理也是绝对可以的!(但此时format组件的功能函数就别用了,比如dump format之类的)
4.解码
大致没啥说的,都是send_packet然后recive_frame,或者decode_video/audio(据说这种方法将来会被放弃)。下面举个例子说明一下这种最简单粗暴的解码方法
MJPEG视频解码实例
0.原因
MJPEG的视频码流是可以直接播放的,所以解封装以后直接保存到文件即可,最简单
1.目的
保存MJPEG格式的码流到文件并播放
2.代码
环境: Qt 5.7.1 64位
#include <QDebug>
#include <QString>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libswscale/swscale.h>
#include <libavutil/file.h>
#include <libavutil/imgutils.h>
}
#define STR(str) QString::fromLocal8Bit((char*)str)
#define LOG qDebug()
#define INBUF_SIZE 4096
#define DST_FILENAME QString("D:/fmt_avi/")
int main(int argc, char** argv)
{
char* filename = "D:/fmt.avi";
AVFormatContext* ic=0;
AVCodec* c=0;
AVCodecContext* cc=0;
AVPacket* pkt=0;
AVFrame* frame&#