首先,向雷霄骅,雷神致敬
cover
昨天插了一条html的东西,今天补档ffmpeg的编程,通过ffmpeg编写一个最简单的程序,今天的程序主要的功能是
打印视频文件的相关信息输出H.264文件输出YUV文件
不过在编程之前,再来将前天的ffmpeg结构体框架图拿出来
FFMPEG解码的结构.png
ok这张图能够对下面的编程有所帮助,你可以根据这张图去知道哪个结构体或者数组是属于那个大的结构体的。
再来介绍下该结构体中的一些重要的信息
AVStream(在AVFormatContext结构体下方)
AVCodecContext(编解码器的一些信息)
AVCodec
AVPacket(可以理解成装H.264的结构体)
AVFrame(可以理解成装YUV的结构体)
下文中要用到的小知识:解码后的数据需要经过sws_scale()函数处理
该函数效果如下图
经过sws_scale()函数处理过程.png
ok,先把大体的代码 up 上来,我这里做了必要的注释,应该都能看懂,看不懂的话可以留言联系我
//
include "stdio.h"
define __STDC_CONSTANT_MACROS
include "stdafx.h"
//引入ffmpeg中的相关头文件
extern "C" {
include "libavcodec\avcodec.h"
include "libavformat/avformat.h"
include "libswscale/swscale.h"
}
int main(int argc, char* argv[])
{
//声明了AVFormatContext视频数据指针
AVFormatContext *pFormatCtx;
//声明变量i和视频的位置索引
int i, videoindex;
//解码器信息指针
AVCodecContext *pCodecCtx;
//解码器指针
AVCodec *pCodec;
//像素数据指针
AVFrame *pFrame, *pFrameYUV;
//可以理解成缓冲数组
uint8_t *out_buffer;
//h.264数据指针
AVPacket *packet;
int y_size;
int ret, got_picture;
struct SwsContext *img_convert_ctx;
//输入文件路径
char filepath[] = "Titanic.ts";
}
ok,注释都加上了,然后就是要做一些输出了,我们先把一个ts视频文件的时长 格式打印一下。
输出文件信息.png
ok,现在,我们先尝试下把这些信息输出到一个文件里面去
输出视频信息到文件.png
ok,现在剩下输出h264文件和yuv文件了,不过这里先不帖出来了,下篇文章会贴出来的,有跟着学的同学们可以自己试一下,如何输出h264文件和yuv文件~~
持续更新,欢迎关注~~~
领取专属 10元无门槛券
私享最新 技术干货