ffmpeg 之 hls

前言

  与其他博客不同,本文不是讲解HLS 协议本身,而是讲解在FFMPEG 中是如何解析HLS的,当然FFMPEG 也是按照HLS 协议去封装/解析 HLS 流的,因此读完本文不但能了解HLS 协议本身,还能看到HLS 是如何落地的。

1 综述

 HLS(Http Live Streaming )是有苹果公司基于HTTP 传输的协议,目的解决防火墙屏蔽问题,如RTMP 不是走HTTP,容易被防火墙阻难。我们首先来看一个简单的m3u8 文件:

#EXTM3U   //固定格式,首行开头必须是#EXTM3U
#EXT-X-VERSION:3  //HLS V3
#EXT-X-TARGETDURATION:10 //切片最大duration ,下面5段ts 最大duration 是10, 因此这里为10
#EXT-X-MEDIA-SEQUENCE:1  //第一个切片序列号
#EXTINF:9.640000,  //切片info 信息,下面紧跟切片
output1.ts   //ts 切片
#EXTINF:5.600000,
output2.ts
#EXTINF:10.000000,
output3.ts
#EXTINF:10.000000,
output4.ts
#EXTINF:3.040000,
output5.ts
#EXT-X-ENDLIST  //代表HLS 切片结束

工作原理其实也很简单,先下载M3U8 文件,然后根据M3U8文件中提供的ts url ,采用HTTP 去下载视频数据。因此HLS = m3u8 + http

2  使用FFMPEG 转换成HLS 切片

1)从常规文件转换HLS 切片:

./ffmpeg.exe -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8  //会生成一个m3u8 文件 及N 个 ts 流 

2)通过start_number参数,设置第一片序列数

./ffmpeg.exe -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb  -start_number 100 output.m3u8  //第一片切片序数将从100 开始

3)通过hls_time 参数设置切片的duration

./ffmpeg.exe -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8  //生成的切片duration 维持在10s

 本文重点是分析HLS 在FFMPEG 中是如何实现的, 关于HLS 字段 & 使用FFMPEG 转HLS 参数 见下图。

问题:播放 http://127.0.0.1/streaming/output.m3u8  与播放 http://127.0.0.1/streaming/output1.ts 有何区别?

答: 通过上述两个url,我们可以得知前者是hls 协议,后者是http 协议。 对于后者通过ffmpeg 直接下载http 网络数据,然后去demux。 前者需在后者的基础上 通过m3u8文本解析出ts 流的url。 因此我们可以概述:相比与http

### FFmpeg实现HLS(HTTP Live Streaming) #### HLS协议简介 在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流[^1]。此协议只请求基本的HTTP报文,与实时传输协议(RTP)不同,能够穿过任何允许HTTP数据通过的防火墙或者代理服务器,并且很容易使用内容分发网络来传输媒体流。 #### 使用FFmpeg实现HLS编码 为了利用FFmpeg实现HLS功能,主要依赖于其内置的`hls` muxer来进行操作。下面是一个简单的命令行例子展示如何将输入视频转换成适合HLS播放的形式: ```bash ffmpeg -i input.mp4 -codec: copy -start_number 0 -hls_time 10 \ -hls_list_size 0 -f hls index.m3u8 ``` 这段脚本中的参数解释如下: - `-i input.mp4`: 输入文件路径。 - `-codec: copy`: 不重新编码音频和视频轨道,直接复制原始比特率到输出文件中。 - `-start_number 0`: 设置第一个片段编号为0。 - `-hls_time 10`: 定义每个TS切片的时间长度为10秒。 - `-hls_list_size 0`: 表示不设置最大列表大小;即保留所有条目直到手动删除。 - `-f hls`: 输出格式指定为HLS。 - `index.m3u8`: 输出的主清单文件名。 #### 配置FFmpeg支持HLS 对于想要更深入理解或修改FFmpeg内部行为的人来说,可能需要查看并调整源代码。特别是当涉及到特定平台上的优化或是自定义特性开发的时候。配置FFmpeg以启用必要的库和支持选项可以通过以下方式完成: ```bash ./configure --enable-libx264 --enable-gpl --enable-shared --prefix=/usr/local/ffmpeg make make install ``` 上述指令序列将会编译并安装带有H.264编码能力以及其他必要组件的支持版本[^4]。 #### 关键结构体解析 一旦完成了FFmpeg环境搭建,在实际应用过程中还需要了解几个重要的概念以及它们对应的C语言结构体表示形式。例如,在处理节目信息时需要用到`AVProgram`对象,这通常是在构建直播流的过程中被创建出来的[^5]。而具体到HLS,则有专门针对该协议的数据结构用来管理播放列表及其关联的内容描述符等细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值