我尝试录制仅包含音频的 m3u8 流。它是在线广播,但收听受到地理限制,在我的国家/地区请求失败,出现 HTTP 403,但在(不受限制的)远程国家/地区的服务器上流工作。作为一种解决方法,我购买了该国的服务器并使用 socat 设置了 TCP 转发:
sudo socat TCP-LISTEN:80,fork,reuseaddr tcp:server-with-radio-stream.com:80
并且在我的本地服务器的 hosts 文件中,我将 server-with-radio-stream.com 的 DNS 映射修复为我的转发服务器的 IP 地址而不是原始服务器的 IP 地址。
这有效,我可以在本地服务器上录制无线电流,但有一个我不明白的警告:VLC 和 ffmpeg 中的停止时间都不起作用。如果我在不受限制的国家/地区的服务器上直接运行以下命令,停止时间工作和流录制将在大约 100 秒内终止,但当我在本地运行它时(使用 socat 转发流),如果是 VLC,它会提前终止录制(大约 15 秒),如果是 FFMPEG,它会无休止地录制。我使用以下两个 CLI 命令:
cvlc "http://server-with-radio-stream.com/.../xxxx.m3u8" --sout="#transcode{acodec=mp3,channels=2}:standard{access=file{append},mux=mp3,dst='xxxx.mp3'}" --run-time=100 vlc://quit
和
ffmpeg -t 100 -i "http://server-with-radio-stream.com/.../xxxx.m3u8" -c copy output.mkv
事实上我最初只使用 VLC,但为了消除 VLC 中的错误,我尝试了替代方案(ffmpeg),令人惊讶的是替代方案也受到这个问题的影响。
为什么转发流会破坏 VLC 和 FFMPEG 的时间戳,以及如何以本机方式修复它,而不是通过发送终止信号手动实现停止机制来绕过损坏的功能?