编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

ffmpeg音视频编解码《零基础学习方法》

wxchong 2024-07-23 21:47:49 开源技术 30 ℃ 0 评论

前两年最流行的非视频直播莫属,出现了几百家的直播平台,然后就写一篇关于直播的文章。这里只说流程,具体的实现就不说了

先上一张简单的流程图:

0. 背景知识

本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:FFMPEG是非常重要的。

使用FFMPEG作为内核视频播放器:

Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...

使用FFMPEG作为内核的Directshow Filter:

ffdshow,lav filters...

使用FFMPEG作为内核的转码工具:

ffmpeg,格式工厂...

事实上,FFMPEG的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。


1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe)

【视频资源必学】


fmpeg的官方网站是:http://ffmpeg.org/

编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持同步): http://ffmpeg.zeranoe.com/builds/

网站中的FFMPEG分为3个版本:Static,Shared,Dev。

前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。

Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。

打开系统命令行接面,切换到ffmpeg所在的目录,就可以使用这3个应用程序了。


上面这张图就是视频直播的流程图,想要开发一款自己的视频直播软件不麻烦,现在有好多直播sdk,比如腾讯视频云,金山视频云,易视云,7牛视频云,等等,使用它们的sdk能很快的开发一款自己的视频直播软件,上面流程图只是说的表面流程,下面说一些涉及到的技术上面一些流程。

不管是哪个视频云sdk都是使用的ffmpeg开源的这个库,这个库很强大,强大到无所不能,不管是android还是ios还是pc的音视频的编码解码都是用的这个库,先说一下使用这个库的编码也就是音视频数据的压缩流程

下面附一张使用FFmpeg编码视频的流程图。使用该流程,不仅可以编码H.264的视频,而且可以编码MPEG4/MPEG2/VP8等等各种FFmpeg支持的视频。

简单介绍一下流程中各个函数的意义:

av_register_all():注册FFmpeg所有编解码器。

avformat_alloc_output_context2():初始化输出码流的AVFormatContext。

avio_open():打开输出文件。

av_new_stream():创建输出码流的AVStream。

avcodec_find_encoder():查找编码器。

avcodec_open2():打开编码器。

avformat_write_header():写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。

avcodec_encode_video2():编码一帧视频。即将AVFrame(存储YUV像素数据)编码为AVPacket(存储H.264等格式的码流数据)。

av_write_frame():将编码后的视频码流写入文件。

flush_encoder():输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的AVPacket。

av_write_trailer():写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)

下面说一下音视频的解码(解压缩)的流程:


.1 ffmpeg.exe

ffmpeg是用于转码的应用程序。

一个简单的转码命令可以这样写:

将input.avi转码成output.ts,并设置视频的码率为640kbps

ffmpeg -i input.avi -b:v 640k output.ts

具体的使用方法可以参考: ffmpeg参数中文详细解释

详细的使用说明(英文):http://ffmpeg.org/ffmpeg.html

1.2 ffplay.exe

ffplay是用于播放的应用程序。

一个简单的播放命令可以这样写:

播放test.avi

ffplay test.avi

具体的使用方法可以参考:ffplay的快捷键以及选项

详细的使用说明(英文):http://ffmpeg.org/ffplay.html

1.3 ffprobe.exe

ffprobe是用于查看文件格式的应用程序。

这个就不多介绍了。

详细的使用说明(英文):http://ffmpeg.org/ffprobe.html

2. ffmpeg库的使用:视频播放器

本章开始介绍使用ffmpeg的库进行开发。

2.1 ffmpeg库的配置

从http://ffmpeg.zeranoe.com/builds/网站上

1.下载Dev版本,里面包含了ffmpeg的xxx.h头文件以及xxx.lib库文件。

2.下载Shared版本,里面包含了ffmpeg的dll文件。

3.将这两部分文件拷贝到VC工程下面就可以了

注:可能会出现问题,参见:FFMPEG 库移植到 VC 需要的步骤

如果不想自己手动配置,可以下载已经配置好的工程:最简单的基于FFMPEG+SDL的视频播放器

2.2 最简单的视频播放器

学习文章《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》中的代码,这是ffmpeg做视频播放器最简单的代码了,是我自己精简出来的,已经不能再简化了,每一行都很重要。

原版是基于SDL1.2的视频播放器,后来更新了基于SDL2.0的最简单的视频播放器:最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

上述播放器使用libavformat和libavcodec两个类库完成了视频的解码工作。实际上解码工作只需要libavcodec就可以了。因此更新了一个“纯净”的解码器。该解码器只使用libavcodec完成解码工作: 最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)

ffmpeg的函数介绍:ffmpeg函数介绍

注1:播放视频或音频数据的时候会用到SDL。有关SDL可以参考:SDL介绍

SDL参考文档:SDL GUIDE 中文译本

注2:如果想查看解码后的数据,需要用到 YUV播放器:YUV播放器源代码或YUV Player Deluxe都可以

总结;音视频解码流程原理上讲: 我们所看到的有声视频,其实是视频和音频数据同步的结果.

视频的播放过程 音频的播放过程 相关查看工具 视频编码数据 视频编码的作用 H.264格式简 H.264压缩方法 视频像素数 视频像素数据作用 保存了屏幕上每个像素点的像素值。 音频编码数据 音频编码的作用 音频采样数据 音频采样数据作用等等。。。。。都是我们要学习的今天就分享到这 ,

有什么不懂的可以关注+私信‘资料’MF分享相关资料。


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表