从19年上半年开始,经过两年多艰苦的写作和修订过程,我的第一本音视频开发领域的入门参考书籍 《FFmpeg音视频开发基础与实战》 终于问世了。本书基础知识和开发实践并重,以降低音视频领域的入门门槛、帮助初学者尽快入门为核心目的。书中较为系统地介绍了音视频领域的相关基础知识、FFmpeg相关工具的使用和相关SDK的使用方法。其中的代码大部分改编自FFMpeg代码库中提供的示例,逻辑简单,易于理解。
本书目前已在京东、淘宝等电商平台上架,目前销量喜人。由于首印数量有限,请感兴趣的朋友抓紧下单,手慢无哦~
推荐购买链接:京东自营 当当自营 电子工业出版社京东店 新华文轩天猫旗舰店


第一部分 基础知识
第1章 音视频技术概述 2
1.1 音视频信息与多媒体系统 2
1.1.1 信息传输系统的发展 2
1.1.2 信息时代的音视频技术 4
1.1.3 音视频技术的未来展望 5
1.2 典型的音视频与多媒体系统结构 6
1.2.1 视频点播 7
1.2.2 视频直播 8
1.2.3 安防监控 9
1.2.4 视频会议 9
第2章 图像、像素与颜色空间 11
2.1 图像与像素 11
2.2 图像的位深与颜色空间 12
2.2.1 图像的位深 12
2.2.2 图像的颜色空间 14
2.3 图像压缩编码 15
2.3.1 图像压缩算法分类 16
2.3.2 图像压缩基本算法 16
2.3.3 常见的图像压缩编码格式 20
第3章 视频压缩编码 22
3.1 视频压缩编码的基础知识 22
3.1.1 视频信息的数字化表示 22
3.1.2 常用的视频格式与分辨率 24
3.1.3 对视频数据压缩编码的原因 24
3.2 视频压缩编码标准的发展历程 24
3.3 视频压缩编码的基本原理 25
3.3.1 视频数据中的冗余信息 25
3.3.2 预测编码 26
3.3.3 变换编码 27
3.3.4 熵编码 28
3.4 视频编码标准H.264 28
3.4.1 H.264简介 28
3.4.2 H.264的框架 28
3.4.3 H.264的基本算法 30
3.5 高效视频编码标准H.265 33
3.5.1 H.265简介 33
3.5.2 H.265的框架 33
3.5.3 H.265的基本算法 35
第4章 音频压缩编码 42
4.1 音频压缩编码的基础知识 42
4.1.1 声音信息的概念 42
4.1.2 声音信息的基本要素 42
4.2 音频信息采样与数字化 43
4.2.1 模拟音频 43
4.2.2 数字音频 44
4.2.3 采样和量化 44
4.3 脉冲编码调制 46
4.3.1 PCM量化区间分割 46
4.3.2 PCM量化编码规则 49
4.4 MP3格式与MP3编码标准 51
4.4.1 MP3格式 52
4.4.2 MP3编码标准 62
4.5 AAC格式与AAC标准 67
4.5.1 AAC格式 67
4.5.2 AAC标准 72
第5章 音视频文件容器和封装格式 74
5.1 概述 74
5.2 FLV格式 75
5.2.1 FLV文件结构 75
5.2.2 FLV文件头 76
5.2.3 FLV标签 77
5.3 MPEG-TS格式 84
5.3.1 信息包头 84
5.3.2 PES包结构 85
5.3.3 PSI结构 87
5.4 MP4格式 88
5.4.1 MP4格式简介 88
5.4.2 ISO协议族 89
5.4.3 MP4封装格式 89
5.4.4 Box类型 90
5.4.5 MP4文件结构 92
5.4.6 构建视频流的播放时间轴 98
第6章 音视频流媒体协议 104
6.1 网络协议模型 105
6.1.1 ISO/OSI模型结构 105
6.1.2 TCP/IP模型结构 106
6.2 网络流媒体协议——RTMP 120
6.2.1 RTMP的概念 120
6.2.2 RTMP分块与块流 121
6.2.3 RTMP信息格式 126
6.2.4 RTMP信息与命令 129
6.3 网络流媒体协议——HLS协议 136
6.3.1 HLS协议的概念 136
6.3.2 HLS直播流媒体系统结构 136
6.3.3 HLS索引文件格式 138
第二部分 命令行工具
第7章 FFmpeg的基本操作 144
7.1 FFmpeg概述 144
7.1.1 各个编译类型的区别 145
7.1.2 编译FFmpeg源代码 148
7.2 ffplay的基本使用方法 155
7.2.1 显示ffplay版本 155
7.2.2 显示编译选项 156
7.2.3 设置日志级别 156
7.2.4 全屏播放 158
7.2.5 指定输入视频的宽、高和帧率 158
7.2.6 禁用音频流、视频流和字幕流 158
7.2.7 指定播放的起始时间和时长 159
7.2.8 指定播放音量 159
7.2.9 设置播放窗口 159
7.3 ffprobe的基本使用方法 159
7.3.1 显示详细的封装格式信息 160
7.3.2 显示每一路媒体流信息 161
7.3.3 显示每一个码流包的信息 164
7.3.4 显示媒体流和码流包的负载信息 165
7.3.5 显示每一帧图像的信息 167
7.3.6 指定检测信息的输出格式 169
7.4 ffmpeg的基本使用方法 175
7.4.1 显示版本和编译配置信息 176
7.4.2 显示支持的解复用器格式 177
7.4.3 显示支持的复用器格式 179
7.4.4 显示支持的所有输入格式和输出格式 181
7.4.5 显示支持的解码器 183
7.4.6 显示支持的编码器 184
7.4.7 显示支持的媒体协议 186
7.4.8 显示支持的硬件加速框架 188
7.4.9 ffmpeg封装格式转换 188
7.4.10 视频的解码和编码 193
7.4.11 从视频中截取图像 206
7.4.12 ffmpeg视频转码 207
第8章 滤镜图 209
8.1 ffmpeg音视频滤镜 209
8.1.1 简单滤镜图 209
8.1.2 复合滤镜图 210
8.1.3 ffmpeg支持的滤镜列表 211
8.2 简单滤镜图的应用 212
8.2.1 常用的视频编辑简单滤镜图 212
8.2.2 常用的音频编辑简单滤镜图 227
8.3 复合滤镜图的应用 230
8.3.1 常用的视频编辑复合滤镜图 230
8.3.2 常用的音频编辑复合滤镜图 234
第9章 流媒体应用 236
9.1 构建SRS流媒体服务 236
9.1.1 部署RTMP流媒体服务 238
9.1.2 部署HLS流媒体服务 240
9.1.3 部署HTTP-FLV流媒体服务 241
9.2 构建Nginx RTMP流媒体服务 241
9.2.1 Nginx的编译和部署 242
9.2.2 Nginx的流媒体模块nginx-rtmp-module 246
第三部分 开发实践
第10章 FFmpeg SDK的使用 254
10.1 使用CMake构建工程 255
10.1.1 使用CMake构建Hello World工程 255
10.1.2 在工程中编译并输出多个文件 257
10.1.3 在工程中添加头文件和源文件目录 259
10.1.4 在工程中引入动态库 262
10.2 FFmpeg SDK基本使用方法示例:获取目录下的文件信息 264
10.2.1 显示指定目录信息 264
10.2.2 解析API和结构体 266
第11章 使用FFmpeg SDK进行视频编解码 269
11.1 libavcodec视频编码 269
11.1.1 主函数与数据I/O实现 269
11.1.2 视频编码器初始化 272
11.1.3 编码循环体 284
11.1.4 关闭编码器 289
11.1.5 FFmpeg视频编码延迟分析 290
11.2 libavcodec视频解码 294
11.2.1 主函数实现 294
11.2.2 视频解码器初始化 295
11.2.3 解码循环体 297
11.2.4 关闭解码器 304
第12章 使用FFmpeg SDK进行音频编解码 306
12.1 libavcodec音频编码 306
12.1.1 主函数实现 306
12.1.2 音频编码器初始化 307
12.1.3 编码循环体 310
12.1.4 关闭编码器 313
12.2 libavcodec音频解码 315
12.2.1 主函数实现 315
12.2.2 音频解码器初始化 316
12.2.3 解码循环体 318
12.2.4 关闭解码器 324
第13章 使用FFmpeg SDK进行音视频文件的解封装与封装 326
13.1 音视频文件的解封装 326
13.1.1 主函数实现 326
13.1.2 解复用器初始化 327
13.1.3 循环读取码流包数据 335
13.1.4 释放解复用器和解码器 338
13.1.5 主函数的整体实现 339
13.2 音频流与视频流文件的封装 339
13.2.1 主函数实现 340
13.2.2 音视频流复用器的初始化 340
13.2.3 复用音频流和视频流 347
13.2.4 释放复用器实例 353
第14章 使用FFmpeg SDK添加视频滤镜和音频滤镜 355
14.1 视频滤镜 355
14.1.1 主函数实现 355
14.1.2 视频滤镜初始化 356
14.1.3 循环编辑视频帧 365
14.1.4 销毁视频滤镜 368
14.2 音频滤镜 370
14.2.1 主函数框架 370
14.2.2 音频滤镜初始化 371
14.2.3 循环编辑音频帧 379
14.2.4 销毁音频滤镜 381
第15章 使用FFmpeg SDK进行视频图像转换与音频重采样 383
15.1 视频图像转换 383
15.1.1 主函数实现 383
15.1.2 视频格式转换初始化 384
15.1.3 视频的图像帧循环转换 388
15.1.4 视频格式转换结构的销毁和释放 390
15.2 音频重采样 391
15.2.1 主函数实现 391
15.2.2 音频重采样初始化 392
15.2.3 对音频帧循环重采样 396
15.2.4 音频重采样结构的销毁和释放 400
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD