FFMPEG视音频编解码学习总结

本文为雷神博客学习总结记录,主要针对FFmpeg视频编码部分学习

[总结]FFMPEG视音频编解码零基础学习方法

1. ffmpeg程序的使用

ffmpeg的官方网站是:FFmpeg

该网站中的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个应用程序了。

ffmpeg.exe:用于转码的应用程序

ffplay.exe:用于播放的应用程序

ffprobe.exe:用于查看文件格式的应用程序

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

2.1 ffmpeg库的配置

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

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

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

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

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介绍

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

2.3 相关结构体的研究

ffmpeg的结构体之间的关系参考文章:FFMPEG中最关键的结构体之间的关系

AVFrame:是包含码流参数较多的结构体,一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据。编码的时候也存储了相关的数据。因此在使用FFMPEG进行码流分析的时候,AVFrame是一个很重要的结构体。

AVFormatContext:是包含码流参数较多的结构体,AVFormatContext是一个贯穿FFmpeg开发始终的数据结构,很多函数都要用到它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。

AVCodecContext:是包含码流参数最多的结构体,AVCodecContext中很多的参数是编码的时候使用的,而不是解码的时候使用的。

AVIOContext:是FFMPEG管理输入输出数据的结构体,在解码的情况下,buffer用于存储ffmpeg读入的数据。

AVCodec:是存储编解码器信息的结构体。

AVStream:是存储每一个视频/音频流信息的结构体。

AVPacket:是存储压缩编码数据相关信息的结构体,非常常用,对于H.264来说。1个AVPacket的data通常对应一个NAL,因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。

3. ffmpeg库的使用:一个真正的播放器——ffplay

3.1 真正的播放器

ffplay源代码流程图:

ffplay.c函数结构分析:ffplay.c函数结构简单分析

4. ffmpeg库的使用

4.1 编码

AVC(H.264)视频的编码可以参考:最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

HEVC(H.265)视频编码可以参考:最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))

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

4.2 转码

转码实际上是先解码然后编码。
转码程序可参考:最简单的基于FFMPEG的转码程序
比较复杂的转码程序可以参考ffmpeg.c,ffmpeg.c函数结构简单分析:ffmpeg.c函数结构简单分析(画图)

5. ffmpeg源代码分析

ffmpeg 源代码简单分析

FFmpeg的H.264解码器源代码简单分析

FFmpeg的HEVC解码器源代码简单分析

6. FFmpeg其它几个类库的使用

6.1 libavfilter(加特效)

6.2 libavdevice(读设备)

读取摄像头:最简单的基于FFmpeg的AVDevice例子(读取摄像头)

屏幕录制:最简单的基于FFmpeg的AVDevice例子(屏幕录制)

6.3 libswscale(图像拉伸,像素格式转换)

7. FFmpeg封装格式的处理

使用FFmpeg进行封装格式的处理,主要是通过AVFormat完成

8. FFmpeg流媒体方面的应用

使用FFmpeg进行流媒体方面的应用,主要是流媒体的发送和接收。

直接使用ffmpeg.exe命令行工具的文章:FFmpeg发送流媒体的命令(UDP,RTP,RTMP)

基于FFmpeg的推流器:最简单的基于FFmpeg的推流器(以推送RTMP为例)

9. FFmpeg在其他平台的应用

最简单的基于FFmpeg的移动端例子

原文链接:FFMPEG视音频编解码学习总结_ffmpeg雷神博客_GeordieX的博客-CSDN博客

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/131008587