MediaMTX RTSP 容器不代理源

问题描述 投票:0回答:1

请注意:即使添加了端口转发标志,此问题仍然存在,因此其他 SO 答案在这里对我没有帮助。我知道我在这里询问的是开源 MediaMTX RTSP 服务器,但我相信这本质上是一个纯粹的 Docker 问题;因此,任何具有 Docker 网络经验的人都可以回答这个问题,无论他们是否有 MediaMTX 的经验。


我使用的是 Mac 笔记本电脑。我通过 docker 运行 MediaMTX,如下所示:

docker run --rm -it -p 8554:8554 bluenviron/mediamtx:latest
2023/10/16 15:05:22 INF MediaMTX v1.2.0
2023/10/16 15:05:22 INF configuration loaded from /mediamtx.yml
2023/10/16 15:05:22 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2023/10/16 15:05:22 INF [RTMP] listener opened on :1935
2023/10/16 15:05:22 INF [HLS] listener opened on :8888
2023/10/16 15:05:22 INF [WebRTC] listener opened on :8889 (HTTP)
2023/10/16 15:05:22 INF [SRT] listener opened on :8890 (UDP)

我可以确认它正在运行:

docker ps
CONTAINER ID   IMAGE                        COMMAND       CREATED          STATUS          PORTS     NAMES
ef27229a41c4   bluenviron/mediamtx:latest   "/mediamtx"   19 seconds ago   Up 18 seconds             goofy_franklin

并且

telnet
看到它就好了:

telnet localhost 8554
Trying ::1...
Connected to localhost.
Escape character is '^]'.

但是当我通过

ffmpeg
向其发布(写入/流式传输)MP4 时,我收到 broken pipeline 错误:

ffmpeg -re -stream_loop -1 -i fireplace.mp4 -c copy -f rtsp rtsp://localhost:8554/mystream     
ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
  built with Apple clang version 14.0.0 (clang-1400.0.29.202)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/6.0_1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      58.  2.100 / 58.  2.100
  libavcodec     60.  3.100 / 60.  3.100
  libavformat    60.  3.100 / 60.  3.100
  libavdevice    60.  1.100 / 60.  1.100
  libavfilter     9.  3.100 /  9.  3.100
  libswscale      7.  1.100 /  7.  1.100
  libswresample   4. 10.100 /  4. 10.100
  libpostproc    57.  1.100 / 57.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fireplace.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf59.27.100
  Duration: 00:00:11.27, start: 0.000000, bitrate: 522 kb/s
  Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/smpte170m, progressive), 368x640, 448 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.37.100 libx264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 64 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Output #0, rtsp, to 'rtsp://localhost:8554/mystream':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.3.100
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/smpte170m, progressive), 368x640, q=2-31, 448 kb/s, 30 fps, 30 tbr, 90k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.37.100 libx264
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 64 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
av_interleaved_write_frame(): Broken pipe00:00:09.60 bitrate=N/A speed=   1x    /s speed=N/A    
[out#0/rtsp @ 0x128f15b00] Error muxing a packet
[out#0/rtsp @ 0x128f15b00] Error writing trailer: Broken pipe
frame=  305 fps= 30 q=-1.0 Lsize=N/A time=00:00:10.10 bitrate=N/A speed=   1x    
video:560kB audio:80kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!

当我运行该命令时,我在容器日志中得到以下输出:

2023/10/19 23:26:43 INF [RTSP] [conn 192.168.65.1:22506] opened
2023/10/19 23:26:43 INF [RTSP] [session f1b1b628] created by 192.168.65.1:22506
2023/10/19 23:26:43 INF [RTSP] [session f1b1b628] is publishing to path 'mystream', 2 tracks (H264, MPEG-4 Audio)
2023/10/19 23:26:50 INF [RTSP] [session f1b1b628] destroyed: torn down by 192.168.65.1:22506
2023/10/19 23:26:50 INF [RTSP] [conn 192.168.65.1:22506] closed: EOF
2023/10/19 23:26:53 INF [RTSP] [conn 192.168.65.1:22507] opened
2023/10/19 23:26:53 INF [RTSP] [session b7be9e08] created by 192.168.65.1:22507
2023/10/19 23:26:53 INF [RTSP] [session b7be9e08] is publishing to path 'mystream', 2 tracks (H264, MPEG-4 Audio)
2023/10/19 23:27:03 INF [RTSP] [conn 192.168.65.1:22507] closed: terminated
2023/10/19 23:27:03 INF [RTSP] [session b7be9e08] destroyed: session timed out

因此看起来

ffmpeg
能够连接到RTSP服务器,但实际上无法向其发送任何内容。

有人能发现我可能出问题的地方吗?

docker portforwarding docker-networking
1个回答
2
投票

使用以下内容:

docker run --rm -it --network=host -p 8554:8554

ffmpeg -re -stream_loop -1 -i fireplace.mp4 -c copy -f rtsp -rtsp_transport tcp rtsp://localhost:8554/mystream

通过以下方式查看流:

ffplay -rtsp_transport tcp rtsp://localhost:8554/mystream

说明:

由于您在 Mac 上运行此程序,因此您可能正在使用 Docker Desktop。 Docker Desktop 文档 对于主机网络有这样的说法:

主机网络驱动程序仅适用于 Linux 主机,Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server 不支持。

由于您正在运行

docker run --rm -it --network=host -p 8554:8554 bluenviron/mediamtx:latest
,因此
--network=host
选项将覆盖您在命令中提供的任何端口分配。由于此模式在 Mac 版 Docker Desktop 上不起作用,这意味着您的容器将无法访问。

要解决此问题,您需要显式转发您想要使用的端口。我能够在 Mac 上运行以下内容:

docker run --rm -it -p 8554:8554 bluenviron/mediamtx:latest
<- Starts the server

为了测试其是否有效,我使用以下命令通过 RTSP 服务器传输一系列连续的灰色帧:

ffmpeg -readrate 1 -f lavfi -i color=c=gray -vf "fps=25,format=yuv420p" -c:v libx264 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/mystream

-readrate 1
限制 ffmpeg 发送帧的速度过快,因为我们通过该合成视频获得的帧速率可能会导致问题。

-f lavfi -i color=c=gray
连续生成灰帧,因此我们不需要依赖任何特定视频来进行测试

-vf "fps=25,format=yuv420p"
设置视频格式(25 FPS 和 420p 分辨率)

-c:v libx264
将编解码器设置为 H264,这是 mediamtx 的 RTSP 流支持的编解码器之一,根据他们的 文档

-f rtsp -rtsp_transport tcp
设置输出格式和传输协议。请注意,上面的命令缺少
-rtsp_transport tcp
,我发现在相同的设置(macOS/docker/ffmpeg)中这是必需的。这可能是您需要添加到您自己的 ffmpeg 命令中的内容。

我能够通过使用以下命令通过 ffmpeg 查看该流来确认该流是否正常工作:

ffplay -rtsp_transport tcp rtsp://localhost:8554/mystream

根据请求编辑流捕获

要将流的输出捕获回本地文件,您可以使用以下命令:

ffmpeg -rtsp_transport tcp -i rtsp://localhost:8554/mystream -c copy fp-copy.mp4

由于您的原始命令将无限循环您拥有的firewall.mp4 文件,因此这将继续捕获,直到您的磁盘已满。要将其限制为特定的持续时间,您可以在输出中使用

-t
选项,如下所示:

ffmpeg -rtsp_transport tcp -i rtsp://localhost:8554/mystream -c copy -t 60 fp-copy.mp4

这将复制您开始直播后的前 60 秒。将其增加到您想要的任何持续时间。

您还可以通过文件大小而不是持续时间进行限制。为此,请使用:

ffmpeg -rtsp_transport tcp -i rtsp://localhost:8554/mystream -c copy -fs 100M fp-copy.mp4

这会将输出限制为 100MB。

请注意,捕获的输出的前几秒可能是黑色的。这是来自 ffmpeg 与 RTSP 流建立连接的时期。

如果您不想经历使用外部工具修剪该段的麻烦,您可以将命令修改为:

ffmpeg -rtsp_transport tcp -i rtsp://localhost:8554/mystream -vf "trim=start=10,setpts=PTS-STARTPTS" -af "atrim=start=10,asetpts=PTS-STARTPTS" -t 20 fp-copy.mp4

这个新的

-vf
选项将修剪音频和视频的前 10 秒。请注意,这与
-c copy
选项不兼容,但它似乎仍然可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.