FFmpeg——视频解码——转YUV并输出——av_image函数介绍

本文详细介绍了使用FFmpeg进行视频解码的步骤,包括MJPEG视频的直接保存和解码为YUV420P的过程。通过示例代码展示了如何利用av_image_alloc和sws_scale进行格式转换,以便于播放或进一步处理。此外,还提到了YUV的不同格式以及与RGB的关系。
摘要由CSDN通过智能技术生成


视频解码一般步驺

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&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值