首页 > 解决方案 > 在本地网络中通过 udp 流式传输 mp4 的 ffmpeg 问题

问题描述

我正在udp://232.255.23.23:1234使用 ffmpeg v3.4.2 从 linux(嵌入式)流式传输 mp4 视频文件(其中一些是之前使用 ffmpeg 转换为 mp4)到多个使用 MPV 播放流的 linux(antix)机器,所有这些都发生在本地网络,所以我希望它可以完美地工作,但不幸的是它没有。

以下是我尝试使用的原始命令:

ffmpeg

ffmpeg -re -i PATH_TO_FILE.mp4 -c copy -f mpegts udp://232.255.23.23:1234

mpv

mpv --no-config --geometry=[geo settings] --no-border udp://232.255.23.23:1234

这似乎很有效,但是出现了一个问题,在显示端,流实际上比流内容本身长得多。mp4 文件总共有约 5 分 36 秒,而 mpv 在 >= 6 分钟内播放整个流循环。我认为这是由于丢帧、mpv 等待恢复或其他原因而发生的,因此会延长实际内容的长度。这在我的情况下不起作用,因为我有一个精确的时间间隔来显示流并且它不能比流内容长。所有内容均以 1680x800 分辨率制作,并以 1680x1050 分辨率显示在屏幕上(以 mpv 几何定位)

似乎将此命令用于mpv:

mpv --no-config --framedrop=no --geometry=[geo settings] --no-border udp://232.255.23.23:1234

使持续时间正确,但这有时会在视频中引入巨大的伪影。

我读到使用-re流式传输会导致这些帧丢失,所以我尝试为文件输入和输出流设置静态数量的 fps,例如:

ffmpeg -re -i PATH_TO_FILE.mp4 -c copy -r 25 -f mpegts udp://232.255.23.23:1234

这会以本机帧速率读取文件并以 25fps 输出流,并且它似乎具有正确的计时持续时间,但它也会导致偶尔的articats,我认为整体质量更差。当其中一个工件发生时,mpv 的输出:

[ffmpeg/video] h264: cabac decode of qscale diff failed at 85 19
[ffmpeg/video] h264: error while decoding MB 85 19, bytestream 85515

我也尝试在 mpv 中使用--untimedor ,但这会导致视频卡顿--no-cache

Invalid video timestamp在 MPV 中也经常收到警告,例如:Invalid video timestamp: 1.208333 -> -8.711667

--no-config在没有和添加的情况下播放 mpv--untimed也会导致频繁的伪影:

V: -00:00:00 / 00:00:00 Cache:  0s+266KB
[ffmpeg/video] h264: Invalid NAL unit 8, skipping.
V: -00:00:00 / 00:00:00 Cache:  0s+274KB
[ffmpeg/video] h264: Reference 4 >= 4
[ffmpeg/video] h264: error while decoding MB 6 0, bytestream 31474
[ffmpeg/video] h264: error while decoding MB 78 49, bytestream -12
V: 00:00:06 / 00:00:00 Cache:  5s+11KB
Invalid video timestamp: 6.288333 -> -8.724933
V: -00:00:05 / 00:00:00 Cache:  3s+0KB
[ffmpeg/video] h264: Invalid NAL unit 8, skipping.
[ffmpeg/video] h264: error while decoding MB 59 24, bytestream -27
V: -00:00:04 / 00:00:00 Cache:  3s+0KB
[ffmpeg/video] h264: Reference 4 >= 3
[ffmpeg/video] h264: error while decoding MB 5 2, bytestream 13402
V: -00:00:03 / 00:00:00 Cache:  2s+0KB
[ffmpeg/video] h264: Reference 5 >= 4
[ffmpeg/video] h264: error while decoding MB 51 21, bytestream 9415

我尝试使用 ffplay 播放流,它还导致视频“播放”时间延长了 20 秒。有什么方法可以保持流媒体持续时间完整并防止那些巨大的伪影?这些不是任何巨大的视频文件,每个文件只有几 MB,一切都发生在本地网络中,因此延迟很小。

流式传输文件之一时从 ffmpeg 输出:

 libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'SDM.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.48.100
  Duration: 00:00:20.00, start: 0.000000, bitrate: 1883 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1680x800 [SAR 1:1 DAR 21:10], 1880 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Output #0, mpegts, to 'udp://232.255.23.23:1234':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1680x800 [SAR 1:1 DAR 21:10], q=2-31, 1880 kb/s, 24 fps, 24 tbr, 90k tbn, 25 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  480 fps= 24 q=-1.0 Lsize=    5009kB time=00:00:19.87 bitrate=2064.7kbits/s speed=   1x
video:4592kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 9.082929%

编辑:所有文件都不包含任何音频,因此网络上的流量应该更少

标签: videoffmpegudpmpv

解决方案


推荐阅读