FFmpeg -> JSMpeg Websocket 反复关闭
FFmpeg -> JSMpeg Websocket Closes Repeatedly
我正在尝试创建一个相当简单的流式传输 server/site。这是当前流程:
- OBS 流式传输到 RTMP URL
- Nginx 接受 RTMP 流并使用
exec-push
让 FFmpeg 获取流并对其进行转码
- FFmpeg 对流进行转码并将其输出到 JSMpeg 应用程序,该应用程序在网页上显示流。
当我有如下 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 会产生一个成功的流。
我正在尝试创建一个相当简单的流式传输 server/site。这是当前流程:
- OBS 流式传输到 RTMP URL
- Nginx 接受 RTMP 流并使用
exec-push
让 FFmpeg 获取流并对其进行转码 - FFmpeg 对流进行转码并将其输出到 JSMpeg 应用程序,该应用程序在网页上显示流。
当我有如下 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 会产生一个成功的流。