You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将设备A推送的FFmpeg UDP视频流保存到设备B本地

如何将设备A推送的FFmpeg UDP视频流保存到设备B本地

看起来你已经搞定了从设备A推流到设备B播放的环节,就差把流存到B本地了对吧?你之前用的ffmpeg -f mpegts -i udp://IP:PORT output.mp4没生效,大概率是因为MPEG-TS流转MP4时,FFmpeg需要处理时间戳兼容性或者封装格式的问题,我给你几个靠谱的解决方案:

一、直接保存为MP4(最常用方案)

在设备B上运行这条命令:

ffmpeg -fflags +igndts -f mpegts -i udp://IP:PORT -c:v copy -c:a copy -f mp4 output.mp4

给你拆解下关键参数的作用:

  • -fflags +igndts:UDP流经常会出现DTS(解码时间戳)不连续的情况,加上这个参数可以忽略错误的时间戳,避免转存中途失败
  • -c:v copy -c:a copy:直接复制原流的音视频编码格式,不重新编码,既快又不会损失画质;如果你的桌面捕获流没有音频,可以去掉-c:a copy
  • 如果你需要暂停录制,直接按Ctrl+C就行,FFmpeg会自动修复MP4的索引,保证文件能正常播放

二、先保存为TS格式(更稳定的长时录制方案)

如果你的录制时间很长,或者UDP流丢包比较严重,建议先保存为和原流一致的TS格式,之后再转MP4:

  1. 设备B上运行录制命令:
ffmpeg -f mpegts -i udp://IP:PORT -c copy output.ts
  1. 之后如果需要转成MP4,再运行:
ffmpeg -i output.ts -c copy output.mp4

TS格式天生适合流录制,不需要处理复杂的时间戳问题,就算中途断流,已经录制的部分也能正常播放

可能遇到的问题排查

  • 先确认设备B的防火墙没有阻止UDP端口:比如你用的PORT,要确保B的防火墙允许入站的UDP流量到这个端口,不然FFmpeg接不到流
  • 如果出现丢包导致的录制中断,可以在命令里增加缓冲参数:-max_delay 500000,给FFmpeg更多缓冲时间来处理丢包的情况
  • 如果你之前的命令生成了空的MP4文件,那就是因为FFmpeg无法生成有效的MP4索引,加上-fflags +igndts就能解决这个问题

备注:内容来源于stack exchange,提问作者this_is_a_display_name

火山引擎 最新活动