深入理解 FFmpeg 书籍笔记

1. 在 Ubuntu 22.04 64位上编译 FFmpeg-0.6.3 时,使用 ./configure 配置时遇到如下错误

ffserver.c: In function ‘rtsp_cmd_describe’:
  ffserver.c:2987:5: error: implicit declaration of function
‘ff_url_split’ [-Werror=implicit-function-declaration]

解决方法:添加 disbable ffserver 操作,因为是初期学习阶段,先编译出 ffmpeg 再说

--disable-ffserver

全部 configure 命令:

./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libx264 --disable-ffserver

接下来 make 去编译

相关文章:[FFmpeg-user] Cannot set ALSA buffer size (Invalid argument) during capture

2. Windows 的 FFmpeg 一般是在 MSYS2 的 MINGW64上编译的

            

3.  视频编码中主要有三种帧, I 帧,B 帧,P 帧

     B 帧是双向预测的帧间压缩算法。当把一帧压缩成 B 帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,“找出”B 帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到 B 帧“某点”样值,从而可得到完整的 B 帧。

     B 帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确。同时,B 帧不是参考帧,不会造成解码错误的扩散。但是,B 帧需要参考前一帧数据和后一帧数据才能够正常把数据解码出来。

     I 帧(关键帧,Intra-coded Frame):I 帧是视频序列中的关键帧,采用帧内编码方式,仅利用本帧内的数据进行编码。I 帧包含了完整画面的数据,因此也被称为关键帧或独立帧。在解码时,I 帧不需要参考其他帧即可独立解码出完整的画面。由于 I 帧包含了完整的数据,因此其数据量相对较大。

    P 帧(预测帧,Predicted Frame):P 帧是前向预测的帧间编码。它采用帧间编码方式,利用前面的 I 帧或 P 帧进行预测编码。P 帧只包含与前一帧之间的差异数据,因此数据量相对较小。P 帧由在它前面的 P 帧或者 I 帧预测而来,它根据本帧与邻近的前一帧或几帧的不同点来压缩本帧数据。

    注意:通常情况下,P 帧不会参考 B 帧的数据。P 帧的编码是基于之前的 I 帧或 P 帧,不会使用 B 帧作为参考。这是因为 B 帧通常依赖于前后的参考帧,编码时本身就包含了前后帧的信息,如果 P 帧依赖 B 帧,会增加解码过程中的复杂度和延迟。

4. FFmpeg 中的 GOP(Group of Pictures)是一个关键的视频编码概念,以下是关于 GOP 的详细解释:

  1. 定义:GOP 是一组以 MPEG 或 H.264 等视频编码标准编码的视频内部的连续图像。每个以这些标准编码的视频都由连续的若干个 GOP 组成。
  2. GOP 结构:GOP 结构定义了 I 帧、P 帧和 B 帧之间的关系和顺序。其中,I 帧(Intraframe)是关键帧,采用帧内压缩技术,不需要参考其他帧即可解码。P 帧(Predicted frame)是预测帧,需要参考前面的I帧或 P 帧进行解码。B 帧(Bidirectional frame)是双向预测帧,需要参考前面的 I 帧或 P 帧以及后面的 P 帧或 I 帧进行解码。
  3. GOP 大小:GOP 的大小指的是一个 I 帧和下一个 I 帧之间的帧数。例如,如果 GOP 大小为10,那么一个 GOP 中就包含1个I帧和9个P帧或B帧(具体取决于编码器的设置和视频的内容)。
  4. IDR 帧:在 H.264 编码中,IDR 帧(Instantaneous Decoding Refresh)是一种特殊的 I 帧,它是每个 GOP 中的第一帧。当解码器遇到 IDR 帧时,它会清空解码器参考 buffer 中的内容,确保从该帧开始独立解码。
  5. 影响:GOP 参数不仅会影响视频的质量,还会影响视频的压缩率和解码速度。较小的 GOP 大小可以提高视频的解码速度和容错能力,但可能会降低压缩率;而较大的 GOP 大小可以提高压缩率,但可能会增加解码的延迟和复杂度。

5. 数据包(Packet)与 PTS/DTS 的处理艺术

在数据包中,显示时间戳(PTS)和解码时间戳(DTS)是两个关键的时间戳信息。PTS 表示该数据包应该在什么时间被显示出来,而 DTS 表示该数据包应该在什么时间被解码。这两个时间戳共同决定了音视频数据的播放顺序和同步性。

通常,DTS 早于或等于 PTS,因为解码是显示的前提。如果 DTS 晚于 PTS,可能会导致音视频数据解码后无法及时显示,从而引发同步问题

6. 编码能够设置 VBR、CBR、CRF 等码控模式,其中 VBR(Variable Bitrate)为可变码率,CBR(Constant Bitrate)为恒定码率,CRF 则表示以质量为目标

7. AAC 和 MP3 都是音频编码的有损压缩技术。常见的使用 AAC 编码后的文件存储格式为 m4a,它是 AAC in MP4 文件的一类,也可以使用类似 ADTS 这样的裸格式。

8. ADTS(Audio Data Transport Stream)是一种音频数据传输格式,通常用于将 AAC(Advanced Audio Coding)编码的音频数据进行封装和传输。ADTS 格式通常用于流媒体服务和广播领域,它提供了一种有效的方法来传输音频数据,并包含了一些必要的元数据信息,如采样率、通道数等。

使用 ADTS 格式封装 AAC 音频数据:

  1. 创建 ADTS 帧头:对每一帧的 AAC 音频数据添加 ADTS 帧头,帧头包含了采样率、通道数、帧长度等信息。
  2. 将 AAC 帧与 ADTS 帧头结合:将每一帧的 AAC 音频数据和对应的 ADTS 帧头组合起来,形成完整的 ADTS 帧。
  3. 将 ADTS 帧序列发送或存储:将形成的 ADTS 帧序列发送到网络上的接收端,或者存储到文件中。

使用 MP4 格式封装 AAC 音频数据:

  1. 创建 MP4 文件:使用 MP4 容器格式创建一个空白的 MP4 文件。
  2. 添加音频轨道:在 MP4 文件中创建一个音频轨道,指定音频编码为 AAC。
  3. 将 AAC 音频数据写入音频轨道:将 AAC 编码的音频数据逐帧写入音频轨道。
  4. 设置音频参数:在 MP4 文件中设置音频相关参数,如采样率、通道数等。
  5. 保存 MP4 文件:保存完整的 MP4 文件,其中包含了 AAC 编码的音频数据。

使用 ADTS 格式封装 AAC 音频数据比较简单,适用于一些实时的音频传输场景;而使用 MP4 格式封装 AAC 音频数据则更适合于存储和回放等场景,因为 MP4 格式具有更完整的容器特性,可以同时封装音频、视频和其他多媒体数据。

9. ADTS 是一种简单的音频封装格式,用于 AAC 音频数据的传输,适用于实时流媒体等场景。m4a 是一种音频容器格式,可以封装多种音频编码格式,适用于存储和分享音频文件等场景

10. AAC 音频分为 LC、HE 和 HEv2 三种

      LC:Low Complexity AAC,低复杂度。这种编码相对来说体积比较大,质量稍差。

      HE:High-Efficiency AAC,高效率。这种编码相对来说体积稍小,质量好。

      HEv2:High-Efficiency AAC version 2,高效版本 2。这种编码相对来说体积小,质量优。

11. MPEG 编码标准和 H.264 编码的区别

   MPEG 编码标准包括多个版本和子标准,如:

  1. MPEG-1:用于视频 CD(VCD)和早期的互联网视频流。其视频压缩算法的代表是 MPEG-1 Part 2。
  2. MPEG-2:用于 DVD、数字电视广播(如DVB、ATSC)和部分蓝光光盘。MPEG-2 Video(MPEG-2 Part 2)是其主要的视频压缩算法。
  3. MPEG-4 Part 2:用于早期的互联网视频和一些移动设备视频。DivX 和 Xvid 是基于 MPEG-4 Part 2 的常见编码器。

         H.264(也称为 MPEG-4 Part 10 或 AVC)

         H.264 是一种更现代的视频压缩标准,广泛应用于互联网视频、蓝光光盘、视频会议、高清电视和流媒体服务。它相对于 MPEG-2 和 MPEG-4 Part 2 有以下优势:

  1. 更高的压缩效率:H.264 提供了更高的压缩效率,能够在相同的视频质量下显著减少文件大小。
  2. 更好的视频质量:在相同的比特率下,H.264 可以提供更高的视频质量。
  3. 灵活的网络适应性:H.264 具有良好的网络适应性,能够在不同带宽条件下提供优质的流媒体体验。
  4. 高级编码技术:H.264 引入了许多高级编码技术,如帧内预测、帧间预测、熵编码(如 CABAC)、去块效应滤波等,这些技术提高了编码效率和视频质量。

12. H.264 标准背后的制定组织

      H.264 也被称为 MPEG-4 Part 10 或 AVC(Advanced Video Coding)。它是由以下两个组织共同制定的:

  1. MPEG(Moving Picture Experts Group):这是一个负责制定多媒体编码标准的组织,归属于 ISO(International Organization for Standardization)和 IEC(International Electrotechnical Commission)。
  2. ITU-T(International Telecommunication Union Telecommunication Standardization Sector):这是一个负责制定国际电信标准的组织,H.264 在 ITU-T 中的标准编号是 H.264。

      H.264 标准的正式名称是 ISO/IEC 14496-10 和 ITU-T H.264,两个组织共同制定并发布了这个标准。

      同样的,H.265(HEVC)和 H.266(VVC)也是由 MPEG 和 ITU-T 共同制定的:

  1. H.265(HEVC - High Efficiency Video Coding):H.265 是由 ISO/IEC MPEG 和 ITU-T VCEG(Video Coding Experts Group)共同制定的标准,在 ISO/IEC 中的编号是 ISO/IEC 23008-2,在 ITU-T 中的编号是 ITU-T H.265。
  2. H.266(VVC - Versatile Video Coding):H.266 也是由 ISO/IEC MPEG 和 ITU-T VCEG 共同制定的标准,在 ISO/IEC 中的编号是 ISO/IEC 23090-3,在 ITU-T 中的编号是 ITU-T H.266。

      虽然 H.264、H.265 和 H.266 是由同样的两个组织共同制定的,但它们各自有不同的目标和应用场景,原因包括:

  1. 技术演进:新标准(如 H.265 和 H.266)在压缩效率和视频质量方面比前一代标准(如 H.264)有显著提升,但旧标准仍然在广泛使用,特别是在一些历史遗留设备和基础设施中。
  2. 设备兼容性:许多现有设备和系统仍然依赖于旧的标准(如 H.264 和 MPEG-2),更换这些设备的成本高昂。
  3. 应用场景:不同应用场景对编码标准的需求不同,例如,高清电视、互联网流媒体、视频会议等可能采用较新的标准,而一些传统的广播电视和DVD仍然使用旧标准。

13. 常见的流媒体传输协议:HLS 和 HTTP+FLV 和 DASH

 ChatGPT-4O 回答:HLS、HTTP+FLV、DASH

14. 

 

 实际运行出错:

 

正确的命令:

ffmpeg -i "tcp://192.168.100.179:1935/live/stream?timeout=20000000" -c copy -f flv output.flv

15. 第八章中 8.5 介绍视频多宫格处理时的 ffmpeg 命令要保证换行

如果是直接复制文本会提示 command not found

 要按照书上写的顺序输入命令行

ffmpeg -i 1.avi -i 2.avi -i 3.avi -i 4.avi \
-filter_complex "nullsrc=size=640x480 [base]; \
[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; \
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; \
[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; \
[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; \
[base][upperleft] overlay=shortest=1 [tmp1]; \
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; \
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; \
[tmp3][lowerright] overlay=shortest=1:x=320:y=240" \
-c:v libx264 output.flv  

最终会生成一个合成好的四宫格视频

16. 绘制音频波形

ffmpeg -i Ring09.wav -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png

不要从书上直接复制粘贴命令行到终端中,不然容易出现 command not found 的问题,因为书上是中文编码,会出现隐藏的字符导致运行出错

 运行后会生成一张波形图,使用 eog 查看

eog output.png

 17.  libavformat 接口的使用

 媒体流封装(Muxing)过程主要指以 AVPackets 的形式获取编码后的数据后,以指定的容器格式将其写入文件或以其他方式输出到字节流中。

 Muxing 实际执行的 主要 API 调用流程如下:

  • 初始化,avformat_alloc_output_context2()
  • 创建媒体流(如果有的话),avformat_new_stream()
  • 写文件头,avformat_write_header()
  • 写数据包,av_write_frame() / av_interleaved_write_frame()
  • 写文件尾部信息并释放内部资源,av_write_trailer()

 

posted @ 2024-04-25 18:43  strive-sun  阅读(52)  评论(0编辑  收藏  举报