使用FFMPEG将RTMP源重定向到YouTube - 输出中没有视频流

时间:2018-02-04 16:48:53

标签: nginx video ffmpeg youtube rtmp

我试图从nginx-rtmp服务器获取.m3u8文件并将其传递给YouTube rtmp。我相信这是可能的(例如:https://stackoverflow.com/a/11978820/1552594虽然这是在同一主机上)。我正在使用的命令是:

ffmpeg -analyzeduration 0 -i \
http://source.rtmp.server/hls/stream.m3u8 -pix_fmt yuv420p \ 
-f flv rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx

然而,输出仅包含音频而YouTube不喜欢它。该命令产生以下内容:

NOOO VIDEOOOO

正如您在输出元数据中看不到视频流一样,流映射仅显示音频,而跟踪显示0kb的视频用于651kb的音频

任何帮助非常感谢

更多信息

从本文中提取的命令的改进版本:

https://judge2020.com/restreaming-a-m3u8-hls-stream-to-youtube-using-ffmpeg/

“使用FFMPEG将m3u8 HLS流重新导入Youtube”AKA正是我想要做的。

我发送的命令现在是:

ffmpeg -re -i "http://source.rtmp.server/hls/stream.m3u8" \ 
-strict -2 -c:v copy -c:a aac -ar 44100 -ab 128k -ac 2 -flags \ 
+global_header -bsf:a aac_adtstoasc -bufsize 3000k -f flv \ 
"rtmp://a.rtmp.youtube.com/live2/xxx-xxxx-xxxx-xxxx"

除了使用aac编解码器读取和输出音频外,我得到了完全相同的响应。

enter image description here

更多信息

我发现添加映射可以强制视频流进入输出:

ffmpeg -re -i "http://source.rtmp.server/hls/stream.m3u8" \
-strict -2 -c:v copy -c:a -map 0:0 -map 0:1 -ar 44100 -ab 128k -ac 2 \ 
-flags +global_header -bsf:a aac_adtstoasc -bufsize 1000k \
-f flv "rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx"

这会引发可能导致视频流被静默删除的错误:

enter image description here

1 个答案:

答案 0 :(得分:0)

终于解决了。上面的最后一个问题是一个红色的鲱鱼,因为错过了音频-c:a的编解码器参数。

完整的工作命令如下:

ffmpeg -probesize 100M -analyzeduration 20M -re \ 
-i "http://source.rtmp.server/hls/stream.m3u8" -strict -2 -c:v \ 
libx264 -pix_fmt yuv420p -c:a aac -map 0:0 -map 0:1 -ar 44100 \ 
-ab 128k -ac 2 -b:v 2567k -flags +global_header -bsf:a aac_adtstoasc \ 
-bufsize 1000k -f flv "rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx"

重要的部分是-probesize-analyeduration - 这些部分需要调整才能正常工作。 -re标志对于表示休息是很重要的。各种视频编解码器声明也很重要 - -c:v libx264 -pix_fmt yuv420p或者它会输出有关输出大小为0x0的错误。最后,映射标志确保两个流都包含在输出中:-map 0:0 -map 0:1