我正在尝试将实时 rtmp 流实时转换为 hls 流。
阅读后我有了一些想法
我能够将实时 rtmp 流转换为 hls,但不能在运行时转换。当我运行命令并测试任何 hsl 文件(.m3u8 和 .ts)时,我无法看到,但是当我中断命令并在那里检查时,我会根据需要获取 hls 文件。
我在谷歌上搜索解决方案,但无法得到正确的答案。
有谁能够帮我?
提前致谢...
我正在尝试将实时 rtmp 流实时转换为 hls 流。
阅读后我有了一些想法
我能够将实时 rtmp 流转换为 hls,但不能在运行时转换。当我运行命令并测试任何 hsl 文件(.m3u8 和 .ts)时,我无法看到,但是当我中断命令并在那里检查时,我会根据需要获取 hls 文件。
我在谷歌上搜索解决方案,但无法得到正确的答案。
有谁能够帮我?
提前致谢...
这是使用任何输入文件或流进行 HLS 流式传输的简短指南:
我遵循 user1390208 的方法,所以我只使用 FFMPEG 来生成我的服务器然后接收以提供 HLS 的 rtmp 流。我没有使用 Unreal/Wowza/Adobe,而是使用带有 rtmp 模块的免费服务器 nginx,它很容易设置。简而言之,这就是我的做法:Any input file or stream -> ffmpeg -> rtmp -> nginx server -> HLS -> Client
或更详细:
输入视频文件或流(http、rtmp 等)--> ffmpeg 实时转码为 x.264 + aac,输出到 rtmp--> nginx 获取 rtmp 并向用户(客户端)提供 HLS。因此,在客户端,您可以使用 VLC 或其他任何东西并连接到 nginx 提供的 .m3u8 文件。
这就是我使用 ffmpeg 将输入文件转码为 rtmp 的方式:
ffmpeg -re -i mydirectory/myfile.mkv -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
(.mkv 是 1080p 和 5.1 声音,根据您的输入,您应该使用较低的比特率!)
你从哪里得到 rtmp 流?
任何带有流 Y 的服务器 X?然后你必须将 ffmpeg 命令更改为:
ffmpeg -re -i rtmp://theServerX/yourStreamY -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
或者如果您的 rtmp 流已经是 h.264/aac 编码,您可以尝试使用copy
ffmpeg 中的选项将内容直接流式传输到 nginx。
正如您在我的 nginx 配置文件中看到的:
rtmp://localhost:12345/hls/mystream;
location /hls
. 这意味着在 VLC 中我可以连接http://myServer:80/hls/mystream.m3u8
到访问 HLS 流。 一切都清楚了吗?快乐流媒体!
试试这个 RTMP 到 HLS 命令行设置:
ffmpeg -v verbose -i rtmp://<host>:<port>/<stream> -c:v libx264 -c:a aac -ac 1 -strict -2 -crf 18 -profile:v baseline -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 <pathToFolderYouWantTo>/<streamName>.m3u8
HLS 提要中可能存在一些延迟。但是,它会起作用。
作为对这个问题的更新,我已经设法在不使用 ffmpeg 的情况下完成了从 RTMP 到 HLS 的实时转码,如何?
好吧,只需使用与 user3069376 共享的完全相同的 nginx 配置文件,并非常小心生成 .m3uh 宣言的路径,RTMP 模块中的 hls 选项就应该处理好它。
至于视频播放器,Video.Js 就像一个魅力
如果您已经RTMP
准备好直播并作为 HLS 播放,那么您只需.m3u8
在流名称后添加并RTMP
链接到http
. 例如,您有这样的RTMP
链接:
rtmp://XY.Y.ZX.Z/hls/chid
您只需像这样制作网址:
http://XY.Y.ZX.Z/hls/chid.m3u8
它会在iOS中流畅播放。我已经尝试过以下代码,它工作正常。
func setPlayer()
{
// RTMP URL rtmp://XY.Y.ZX.Z/hls/chid be transcripted like this http://XY.Y.ZX.Z/hls/chid.m3u8 it will play normally.
let videoURL = URL(string: "http://XY.Y.ZX.Z/hls/chid.m3u8")
let playerItem = AVPlayerItem(url: videoURL!)
let adID = AVMetadataItem.identifier(forKey: "X-TITLE", keySpace: .hlsDateRange)
let metadataCollector = AVPlayerItemMetadataCollector(identifiers: [adID!.rawValue], classifyingLabels: nil)
//metadataCollector.setDelegate(self, queue: DispatchQueue.main)
playerItem.add(metadataCollector)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
self.player = player
player.play()
}
但由于高分辨率视频流上传,它会很慢和滞后。如果在上传视频流时将分辨率调低,在低带宽网络下也能流畅运行。
请注意:它不是由 FFMPEG 提供的,因为我们已经由 FFMPEG 运行 RTMP,所以我确实喜欢这个。