对于ffmpeg的架构介绍,请参考24岁“封神”雷霄骅的博客,他已离开江湖,但江湖仍有他的传说。
FFmpeg源代码结构图 - 编码:https://blog.csdn.net/leixiaohua1020/article/details/44226355
FFmpeg源代码结构图 - 解码:https://blog.csdn.net/leixiaohua1020/article/details/44220151
一.ffmpeg开发入门
下面是一个打开视频的小例子。
先用Win32控制台程序来讲解ffmpeg的简单开发,建立Win32的控制台项目,在项目属性中加入ffmpeg的库文件。没有ffmpeg3.2.4库文件的同学,请点击下载。
代码如下:
// FFmpeg_打开视频文件.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
extern "C"
{
#include <libavformat/avformat.h>
}
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avcodec.lib")
using namespace std;
int main()
{
av_register_all(); //ffmpeg程序的第一句,注册库
AVFormatContext *afc = NULL;
//打开视频文件
int nRet = avformat_open_input(&afc, "天下有情人.mp4", 0, 0);
if (nRet < 0)
{
cout << "找不到视频文件" << endl;
}
else
{
cout << "视频打开成功" << endl;
}
int durTime = afc->duration / AV_TIME_BASE; //视频时间 4分20秒
unsigned int numberOfStream = afc->nb_streams; //包含流的个数2:一个视频流一个音频流
for (int i = 0; i < afc->nb_streams; i++)
{
AVCodecContext *acc = afc->streams[i]->codec;
if (acc->codec_type == AVMEDIA_TYPE_VIDEO) //如果是视频类型
{
AVCodec *codec = avcodec_find_decoder(acc->codec_id);
if (!codec)
{
cout << "没有该类型解码器" << endl;
}
int ret = avcodec_open2(acc, codec, NULL);
if (ret != 0)
{
char buf[1024] = { 0 };
av_strerror(ret, buf, sizeof(buf));
}
cout << "解码器打开成功" << endl;
}
}
if (afc)
{
avformat_close_input(&afc); //关闭视频流
}
system("pause");
return 0;
}
可能会出现以下编译错误:
errorC4996: 'AVStream::codec': 被声明为已否决
解决方法如下