如何使用ffmpeg将实时rtmp流转换为实时hls流?
我正在尝试将实时rtmp流转换为hls流 我看完后有了一些想法 我能够将实时rtmp流转换为hls,但不能在运行时转换。当我运行命令并测试任何hsl文件(.m3u8和.ts)时,我无法看到,但当我中断命令并在那里检查时,我会根据需要获得hls文件 我在谷歌上搜索解决方案,但没有得到正确的答案 有人能帮我吗如何使用ffmpeg将实时rtmp流转换为实时hls流?,ffmpeg,streaming,Ffmpeg,Streaming,我正在尝试将实时rtmp流转换为hls流 我看完后有了一些想法 我能够将实时rtmp流转换为hls,但不能在运行时转换。当我运行命令并测试任何hsl文件(.m3u8和.ts)时,我无法看到,但当我中断命令并在那里检查时,我会根据需要获得hls文件 我在谷歌上搜索解决方案,但没有得到正确的答案 有人能帮我吗 提前感谢…这是一个简短的指南,介绍使用任何输入文件或流的HLS流: 我遵循user1390208的方法,所以我只使用FFMPEG生成rtmp流,然后服务器接收该流以提供HLS。与Unreal
提前感谢…这是一个简短的指南,介绍使用任何输入文件或流的HLS流: 我遵循user1390208的方法,所以我只使用FFMPEG生成rtmp流,然后服务器接收该流以提供HLS。与Unreal/Wowza/Adobe不同,我使用免费服务器nginx和rtmp模块,这非常容易设置。简而言之,我就是这样做的:
任何输入文件或流->ffmpeg->rtmp->nginx服务器->HLS->Client
或更详细的内容:
输入视频文件或流(http、rtmp等)-->ffmpeg转码实时传输到x.264+aac,输出到rtmp-->nginx获取rtmp并向用户(客户端)提供HLS。
因此,在客户端,您可以使用VLC或其他任何工具,并连接到nginx提供的.m3u8文件
- 我遵循了nginx的安装指南
- 是我的nginx配置文件
- 这是我如何使用ffmpeg将输入文件转换为rtmp的:
(该.mkv为1080p,声音为5.1,根据您的输入,您应该使用较低的比特率!)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;
- 档案?那你就可以用我的方法了李>
- 是否有任何服务器X具有流Y?然后必须将ffmpeg命令更改为:
或者,如果您的rtmp流已经是h.264/aac编码的,您可以尝试使用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;
选项将内容直接流到nginxcopy
- 我的rtmp服务器有一个名为“hls”的“应用程序”。这部分描述了nginx在哪里侦听ffmpeg的rtmp流,这就是为什么ffmpeg流要
rtmp://localhost:12345/hls/mystream;代码>
- 我的http服务器具有
。这意味着在VLC中,我可以连接到位置/hls
访问HLS流李>http://myServer:80/hls/mystream.m3u8
一切都清楚了吗?流媒体快乐 作为对这个问题的更新,我成功地完成了从RTMP到HLS的实时转码,而不使用ffmpeg,如何完成 只要使用与用户3069376共享的完全相同的nginx配置文件,并且非常小心生成.m3uh宣言的路径,RTMP模块中的hls选项就可以解决这个问题
至于视频播放器,video.Js工作起来很有魅力尝试以下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
ffmpeg-v verbose-i rtmp://://-c:v libx264-c:a aac-ac 1-strict-2-crf 18-profile:v基线-maxrate 400k-bufsize 1835k-pix\u fmt yuv420p-flags-global\u header-hls\u time 10-hls\u list\u size 6-hls\u wrap 10-start\u number 1/.m3u8
HLS馈送中可能会有一些延迟。但是,它会起作用。如果您已经准备好了
RTMP
直播流并作为HLS播放,那么您只需在流名称后添加.m3u8
,并将RTMP
链接到http
。例如,您有如下RTMP
链接:
rtmp://XY.Y.ZX.Z/hls/chid
您只需将url设置为如下所示:
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提供的,因为我们已经通过运行RTMP
所以我喜欢这个
这是一个非常有用的答案。非常好的答案!这正是我需要的。我可以在nginx中使用RTSP/RTP作为输入流吗?!我不明白你是如何将
位置/hls
连接到应用程序hls
并从/hls/mystream.m3u8中获取流的(至少对我来说没那么容易)。@ROODAY不,但是你可以使用hls\u变体标记使其工作,请看你能详细说明或共享一个conf文件吗?我知道,nginx在后台使用FFMPEG进行转码。非常简单的答案!有没有办法减少延迟?