首页 > 解决方案 > RTMP Nginx exec_push 与 alaw 和 h264

问题描述

我有 2 个 RTMP 服务器,一个带有 RTMP 模块的 NGINX,第二个只能使用带有 H264 和 ALAW 的 RTMP,它将接收来自 NGINX 的视频。

我使用 Gstreamer 成功地将我的相机图像推送到第二台服务器:

gst-launch-1.0 v4l2src device="/dev/video0" ! videoconvert ! video/x-raw,format=I420 ! x264enc speed-preset=ultrafast tune=zerolatency key-int-max=20 ! flvmux name=flvmux ! rtmpsink location=rtmp://<second_server_ip>:1935/publish/foobar audiotestsrc ! alawenc ! flvmux.

现在,我需要将视频从 NGINX 服务器发送到第二台服务器,但它需要具有 H264 视频编码和 ALAW 音频编码。

我又尝试了一个中间步骤,将流式传输到 NGINX 服务器并运行

gst-launch-1.0 rtmpsrc location=rtmp://<nginx_ip>:1935/live/100 ! videoconvert ! video/x-raw,format=I420 ! x264enc speed-preset=ultrafast tune=zerolatency key-int-max=20 ! flvmux name=flvmux ! rtmpsink location=rtmp://<second_server_ip>:1935/publish/foobar audiotestsrc ! alawenc | flvmux.

但我得到了

Setting pipeline to PAUSED ...
pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstRTMPSrc:rtmpsrc0: Internal data stream error.
Additional debug info:
gstbasesrc.c(3072): gst_base_src_loop (): /GstPipeline:pipeline0/GstRTMPSrc:rtmpsrc0:
streaming stopped, reason not-negotiated (-4)
ERROR: pipeline doesn't want to preroll.

我在 GStreamer 命令中缺少什么?以及如何将其添加到 NGINX 应用程序以自动推送接收到的流?如果需要,我可以使用 FFmpeg 进行操作。

谢谢

编辑:

我的第一台服务器将接收来自移动应用程序的流。此服务器(NGINX)配置如下:

application live {
   live on;
   interleave on; 
}

该服务器应该推送到第二个服务器(用 Go 编写),它将 RTMP 转换为 WebRTC,以便我可以在浏览器中播放流。正如我之前所说,我已经使用 GStreamer 成功地将 RTMP 流式传输到第二台服务器,但我希望第一台服务器自动推送到第二台服务器,而这正是我能够做到的推送。

编辑2:

我用过VLC,编码是H264,所以没问题。但是我确实需要 ALAW 而不是 MPEG AAC 音频,当我将它推送到第二台服务器时,如何在 NGINX 服务器上进行更改?

标签: nginxffmpeggstreamerrtmp

解决方案


推荐阅读