You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg实现UDP循环MP4视频转HLS直播的问题求助

问题根源分析

你遇到的核心问题是MP4容器不适合UDP流式传输:MP4的关键元数据(moov原子)默认存储在文件末尾,ffmpeg作为UDP接收端,必须读取到完整的moov才能解析视频参数、启动转码。无限循环推送MP4时,接收端永远拿不到文件末尾的moov,因此无法输出;只有极小视频能被完整接收、获取到moov后,转码才能正常工作。

解决方案

方案一:修改UDP推送端(推荐)

将MP4转为MPEG-TS格式后再循环推送——TS是专为流媒体设计的容器,元数据分散在每个数据包中,接收端无需等待完整文件即可实时处理。

推送端命令:

ffmpeg -re -stream_loop -1 -i input.mp4 -c:v libx264 -c:a aac -f mpegts udp://<IP_ADDRESS>:<PORT>

参数说明:

  • -re:按视频帧率读取输入,模拟真实直播流的速度
  • -stream_loop -1:无限循环播放输入视频
  • -f mpegts:输出MPEG-TS格式,适配UDP流式传输场景

方案二:调整接收端命令(不修改推送端时使用)

如果无法修改推送端,强制ffmpeg跳过对完整MP4元数据的等待,实时处理流:

ffmpeg -i udp://<IP_ADDRESS>:<PORT> -fflags +igndts+genpts+nobuffer -c:v libx264 -b:v 3000k -c:a aac -b:a 128k -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename <OUTPUT_TS_DIRECTORY>/output%03d.ts <OUTPUT_M3U8_FILE>

参数说明:

  • -fflags nobuffer:禁用输入缓存,强制实时处理UDP数据包
  • -fflags +igndts+genpts:忽略输入流的DTS时间戳,自动生成新的PTS时间戳,避免因循环推送导致的时间戳混乱

可选优化:HLS片段管理

在接收端命令中添加-hls_flags delete_segments,可以自动删除过期的TS片段,避免磁盘空间被无限占用:

ffmpeg -i udp://<IP_ADDRESS>:<PORT> -c:v libx264 -b:v 3000k -c:a aac -b:a 128k -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename <OUTPUT_TS_DIRECTORY>/output%03d.ts -hls_flags delete_segments <OUTPUT_M3U8_FILE>

内容的提问来源于stack exchange,提问作者BladesV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:01:36