使用FFmpeg+go搭建m3u8点播服务器

一. 前言

        HLS(HTTP Live Streaming) 是苹果公司提出的基于 HTTP 的流媒体传输协议,它的工作原理是将整个文件切分成一个个小的文件(通常是 TS 格式文件),客户端通过 HTTP 下载播放。在准备播放某个 m3u8 媒体源时会先下载一个包含元数据信息的 .m3u8 索引文件,根据 .m3u8 索引文件信息依次下载媒体流文件。

        本文将使用 FFmpeg+go 搭建一个 m3u8 点播服务器,其中 FFmpeg 用于对 mp4 等媒体文件进行切分,go 用于搭建一个 Web 资源服务器。

二. 切分媒体文件

ffmpeg -i lantingxv.mp4 -vbsf h264_mp4toannexb -vcodec libx264 -acodec aac -strict 2 -s 1280x720 -r 30 -g 150 -hls_time 5 -hls_list_size 0 -start_number 0 -f hls -y lantingxv.m3u8

        准备一个媒体文件,然后执行如上命令,命令执行完成后将在本地目录生成一个 .m3u8 文件(索引文件)和若干个 .ts 文件(媒体文件),每一个 .ts 文件都可以单独播放,每个 .ts 文件的时长大约 5s。

        m3u8 播放索引文件内容大致如下,#EXT 开头的是 m3u8 Tag,各个 Tag 含义见如下解释。  

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000000,
lantingxv0.ts
#EXTINF:5.000000,
lantingxv1.ts
#EXTINF:5.000000,
lantingxv2.ts
#EXTINF:5.000000,
lantingxv3.ts
#EXTINF:5.000000,
lantingxv4.ts
#EXTINF:5.000000,
lantingxv5.ts
#EXTINF:5.000000,
lantingxv6.ts
#EXTINF:5.000000,
lantingxv7.ts
#EXTINF:5.000000,
lantingxv8.ts
#EXTINF:5.000000,
lantingxv9.ts
#EXT-X-ENDLIST

#EXTM3U 必须在文件的第一行,标识这是一个 M3U Playlist 文件。

#EXT-X-VERSION 表示版本。

#EXT-X-TARGETDURATION 表示最大的媒体段文件的时长,如上表示最长的 TS 文件是 5s。

#EXT-X-MEDIA-SEQUENCE 表示第一个媒体段文件名的序号,如上是从 lantingxv0.ts 开始的,因此是 0。

#EXTINF 表示下面媒体段文件的时长,如上都是 5s。

#EXT-X-ENDLIST 表示 Playlist 结束,对于 m3u8 点播索引文件有这个 TAG,m3u8 直播索引文件没有这个 TAG,直播索引文件是不断动态更新的。

三. 使用go搭建一个静态资源服务器

        我们完成媒体文件切分成 .m3u8 索引文件和 .ts 文件片段后,还需要通过 HTTP 方式暴露出去,让客户端可以通过 HTTP 协议获取索引文件和媒体文件,我们使用 go 搭建一个静态资源服务器,代码如下。

package main

import "net/http"

func main() {
	http.Handle("/", http.FileServer(http.Dir("file")))
	http.ListenAndServe(":8080", nil)
}

先在代码的同级目录下创建 file 目录,然后将 .m3u8 文件和对应的 .ts 文件全部拷贝到该目录,之后运行代码即可。

四. 使用VLC播放指定m3u8源

         启动 VLC,点击打开网络,输入 m3u8 源后点击播放即可,播放效果如下。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ffmpeg是一个开源的跨平台多媒体处理工具,可以实现将MP4视频文件转换为M3U8格式。以下是一种常见的使用ffmpeg实现MP4转M3U8的方法: 1. 首先,将MP4文件切片成TS格式,创建M3U8清单。可以使用以下命令来实现: ``` ffmpeg -i demo.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls demo.m3u8 ``` 这个命令将会把demo.mp4文件切片成TS格式,并生成一个名为demo.m3u8M3U8清单文件。 2. 如果需要批量执行MP4转M3U8操作,可以使用像引用中提供的PHP脚本一样的方法。这个脚本将遍历一个视频文件数组,针对每个视频文件执行MP4转M3U8的操作。 3. 如果已经拥有一个包含TS清单的M3U8文件,可以使用以下命令将其转换为MP4文件: ``` ffmpeg -i https://xxx.com/index.m3u8 -acodec copy -vcodec copy -absf aac_adtstoasc xxx.mp4 ``` 这个命令将会下载并解析名为index.m3u8M3U8文件,并将其中的TS流合并为一个MP4文件,保存为xxx.mp4。 总结起来,FFmpeg可以通过切片MP4文件并生成M3U8清单文件来实现MP4转M3U8的功能。同时,也可以通过解析包含TS清单的M3U8文件来将其转换为MP4文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用ffmpeg进行mp4与m3u8之间转换](https://blog.csdn.net/shamqu/article/details/114042996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椛茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值