如何使用ffmpeg将实时rtmp流转换为实时hls流?

如何使用ffmpeg将实时rtmp流转换为实时hls流?,ffmpeg,streaming,Ffmpeg,Streaming,我正在尝试将实时rtmp流转换为hls流 我看完后有了一些想法 我能够将实时rtmp流转换为hls,但不能在运行时转换。当我运行命令并测试任何hsl文件(.m3u8和.ts)时,我无法看到,但当我中断命令并在那里检查时,我会根据需要获得hls文件 我在谷歌上搜索解决方案,但没有得到正确的答案 有人能帮我吗 提前感谢…这是一个简短的指南,介绍使用任何输入文件或流的HLS流: 我遵循user1390208的方法,所以我只使用FFMPEG生成rtmp流,然后服务器接收该流以提供HLS。与Unreal

我正在尝试将实时rtmp流转换为hls流

我看完后有了一些想法

我能够将实时rtmp流转换为hls,但不能在运行时转换。当我运行命令并测试任何hsl文件(.m3u8和.ts)时,我无法看到,但当我中断命令并在那里检查时,我会根据需要获得hls文件

我在谷歌上搜索解决方案,但没有得到正确的答案

有人能帮我吗


提前感谢…

这是一个简短的指南,介绍使用任何输入文件或流的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的:

    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流

  • 档案?那你就可以用我的方法了
  • 是否有任何服务器X具有流Y?然后必须将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编码的,您可以尝试使用ffmpeg中的
    copy
    选项将内容直接流到nginx

正如您在我的nginx配置文件中看到的:

  • 我的rtmp服务器有一个名为“hls”的“应用程序”。这部分描述了nginx在哪里侦听ffmpeg的rtmp流,这就是为什么ffmpeg流要
    rtmp://localhost:12345/hls/mystream;
  • 我的http服务器具有
    位置/hls
    。这意味着在VLC中,我可以连接到
    http://myServer:80/hls/mystream.m3u8
    访问HLS流

一切都清楚了吗?流媒体快乐

作为对这个问题的更新,我成功地完成了从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进行转码。非常简单的答案!有没有办法减少延迟?