因此,我正在使用将 mp4 视频流式传输ffmpeg
到另一台主机,然后使用 读取该流ffplay
。以下是我使用的命令:
对于 IP 为 192.168.1.1 的发送主机:
ffmpeg -re -i sample.mp4 -strict 2 -preset ultrafast -vcodec copy -an -f rtp rtp://192.168.3.1:5010 -sdpfile sample.sdp
对于 IP 为 192.168.3.1 的接收主机:
ffplay -rtbufsize 0 -reorder_queue_size 0 -fflags nobuffer+fastseek -protocol_whitelist file,udp,rtp -i sample sample.sdp
到目前为止一切运行良好。然后我尝试模拟两个主机之间的故障链接(使用ip link set eth0 down
或限制带宽tc
),并希望立即看到结果。
例如,当我关闭两个主机之间的链接时,我期望ffplay
停止播放。但事实并非如此。ffplay
流停止后仍继续播放 7-8 秒的视频,这意味着某处存在某种缓冲。
此外,当我恢复链接时,我立即看到 UDP 数据包到达接收器,但又ffplay
需要 10 秒钟才能启动视频。我尝试了所有可能的命令来关闭缓冲,ffplay
但无济于事。
有没有办法在连接丢失/恢复后立即开始/停止播放?
PS 我也尝试使用使用 TCP 的 RTMP,但结果更糟。
答案1
好的,摆弄了 ffmpeg 和 ffplay 选项后,我发现它们可以按我想要的方式工作:
流媒体端:ffmpeg -re -i sample.mp4 -f mpegts -codec:v mpeg1video -s 640x480 -b:v 800k -bf 0 -codec:a mp2 -ar 44100 -ac 1 -b:a 128k udp://192.168.3.1:5000
接收方:ffplay -probesize 32 -sync ext -fflags nobuffer udp://localhost:5000
当我关闭连接两个主机的链接时,ffplay 播放会立即停止,并在链接恢复后重新启动。