# FFmpeg入门详解 **Repository Path**: zhoubing/ffmpeg-beginners-guide ## Basic Information - **Project Name**: FFmpeg入门详解 - **Description**: FFmpeg入门详解 音视频流媒体播放器原理及应用 梅会东著 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2024-01-28 - **Last Updated**: 2024-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README FFmpeg入门详解 音视频流媒体播放器原理及应用 梅会东著 #### 流媒体传输方式 ##### 1.顺序流方式 适合点播高质量视频 放在标准HTTP或FTP服务器上 在观看在线媒体的同时下载文件 ##### 2.实时流传输必须保证匹配连接带宽 实时流协议RTSP #### 流媒体协议 ##### 1.RTMP Macromedia开发 RTMP播放方式需要依赖Flash 目前Flash被淘汰 所以RTMP目前主要用于提取视频流 也就是说将视频发到托管平台 首先用RTMP协议发送到CDN 随后使用另一种协议通常是HLS传递给播放器 RTMP协议延迟非常低 但由于需要Flash插件所以不建议该协议 但流提取例外 在流提取RTMP非常强大几乎得到了普遍支持 RTMP与HTTP一样 都属于TCP/IP四层模型的应用层 RTMP依赖于TCP 也有握手过程 ##### 2.HLS Apple开发 当前使用最广放的协议 HTML5视频播放器原生支持HLS 但不支持Adobe的HDS和RTMP HLS支持码率自适应并且支持最新的H.265编解码器 HLS的工作原理是把整个流分成一个个小的基于HTTP的文件来下载每次只下载一些 当媒体流正在播放时客户端可以选择从不同的备用源以不同的速率下载同样的资源 允许流媒体绘画使用不同的数据速率 开始流媒体会话时客户端会下载一个包含元素据的M3U/M3U8 Playlist文件 用于寻找可用媒体流 HLS只请求基本的HTTP报文 与实时传输协议不同 HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器 也很容易使用内容分发网络来传输数据流 HLS网络结构如下: - 服务器将媒体文件转换为m3u8及ts分片 - 客户端请求m3u8文件 根据索引获取ts分片 点播与直播服务器不同的是 直播的m3u8文件会不断更新 点播的是不会变的 只需要客户端开始请求一次 ##### 3.RTSP RTSP对比HTTP来说 HTTP请求有客户发起 RTSP则是客户端和服务端都能发起 双向的 RTSP是用来控制声音和影响的多媒体串流协议 传输时所用的网络通信协议并不硬性规定 可以选择TCP UDP来传送串流内容 ##### 3.HTTP-FLV HLS其实是一个文本协议并非流媒体协议 流是指数据在网络上按时间先后次序传输和播放的数据流 之所以可以按照顺序传输和连续播放是因为类似RTMP、FLV的协议中 每个音视频数据都被封装成了包含时间戳信息头的数据包 当播放器获得这些数据包解包时能够根据时间戳信息把这些音视频数据和之间到达的音视频数据连续起来播放 MP4 MKV这种封装 必须获得完整的音视频文件才能播放 因为里面单个音视频数据块不带有时间戳信息 HTTP-FLV、RTMP、HLS都是流媒体协议 从延迟性来看 FLV和RTMP延迟低 HLS延迟较高 HLS最大优点就是HTML5可以直接打开播放有浏览器即可 #### RTMP和HTTP-FLV进行比较 ##### 1.穿墙 很多防火墙会屏蔽RTMP 但不会屏蔽HTTP 因为HTTP-FLV出现奇怪问题概率很小 ##### 2.调度 RTMP有个302但只有Flash支持 HTTP-FLV就支持302方便CDN纠正DNS错误 ##### 3.容错 HTTP-FLV回源可以回多个 ##### 4.简单 HTTP-FLV是最简单的流媒体封装 HTTP是最广泛的协议 这两个组合一起可维护性更高比RTMP简单 HTTP协议中有一个约定即content-length字段 可以指定HTTP的body长度 服务器回复HTTP请求时如果有这个字段 客户端就接受这个长度的数据 然后就可以认为数据传输完成了 如果服务器回复HTTP请求中没有这个字段 客户端就一直接收数据 知道服务器跟客户端的Socket连接断开 FLV直播就是利用这个原理 服务端回复客户端请求时不加content-length字段 在回复了HTTP 内容后 紧接着发送FLV数据 这样客户端就可以一直接收数据了 #### VLC下载 https://download.videolan.org/pub/videolan/vlc/3.0.19/win64/ #### 视频播放器播放本地视频文件或流媒体流程 ##### 1.解协议 指将流媒体协议的数据解析为标准的封装格式 音视频在网络上传输常采用各种流媒体协议 例如HTTP RTMP MMS等 这些协议在传输音视频数据的同时会传输一些信令数据(播放 暂停 停止等)或者对网路状态的描述 接协议的过程会去掉信令数据而只保留音视频数据 例如采用RTMP协议传输的数据 经过解协议操作后输出FLV格式的数据 ##### 2.解封装 将输入的封装格式的数据分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式很多 例如MP4 MKV RMVB TS FLV AVI等 其作用是将已经压缩编码的音视频数据按照一定格式放到一起 例如FLV格式的数据 经过解封装操作后 输出H.264编码的视频码流和AAC编码的音频码流 ##### 3.音视频解码 是指将音视频压缩编码的数据解码成为非压缩的视频音频原始数据 音频的压缩编码标准包含AAC MP3 AC-3等 视频压缩编码标准包含H.264 MPEG2 VC-1等 通过解码,压缩编码的视频数据输出为非压缩的颜色数据例如YUV420P和RGB等 压缩编码的音频数据输出为非压缩的音频数据例如PCM数据 #####