FFmpeg -> JSMpeg Websocket 反复关闭

FFmpeg -> JSMpeg Websocket Closes Repeatedly

我正在尝试创建一个相当简单的流式传输 server/site。这是当前流程:

当我有如下 exec_push 语句时,一切似乎都运行良好,除了浏览器在它接收到的每一帧上都显示 Possible garbage data. Skipping.

exec_push /usr/bin/ffmpeg -re -i rtmp://127.0.0.1:1935/$app/$name -f mpeg1video  http://localhost:8080/supersecret;

这种行为是可以理解的,因为 JSMpeg 必须接收 MPEG-TS 数据,而不是 MPEG1 数据。它看到 MPEG1 帧并认为它们是垃圾。

所以通过一些在线研究,我发现了这个:

exec_push /usr/bin/ffmpeg -re -i rtmp://127.0.0.1:1935/$app/$name -c:v copy -c:a copy -f mpegts http://localhost:8080/supersecret;

据推测,这应该将我的 RTMP 流转码为 MPEG-TS 格式,该格式应与 JSMpeg 兼容。

然而,使用第二个版本的命令,我的 FFmpeg -> JSMpeg 流不断连接和断开连接,连接和断开连接,等等。在终端中观察到此行为:

Stream Connected: ::1:40208
close
Stream Connected: ::1:40212
close
Stream Connected: ::1:40216
close
Stream Connected: ::1:40220
close
Stream Connected: ::1:40224
close
...

什么会导致这种情况?我很确定问题出在我的 exec_push 命令中。 OBS 非常满意,它告诉我流正在发送到服务器,如果我执行 push,我可以测试推送到 Ustream 就好了,这告诉我 Nginx 至少正在处理取得一定程度的成功。


免责声明:我不知道我在说什么。我所知道的关于 FFmpeg 和 JSMpeg/Node 的一切都来自我在网上找到的代码片段。

答案归功于@Mulvya。

在第二个exec_push命令中,-c:v copy -c:a copy不应该存在。 通过使用它,不会进行任何转码——它只是流传递。

从命令中删除 -c:v copy -c:a copy 并重新启动 Nginx 会产生一个成功的流。