![如何让 ffmpeg 在输入停止时写入静音?](https://linux22.com/image/1620018/%E5%A6%82%E4%BD%95%E8%AE%A9%20ffmpeg%20%E5%9C%A8%E8%BE%93%E5%85%A5%E5%81%9C%E6%AD%A2%E6%97%B6%E5%86%99%E5%85%A5%E9%9D%99%E9%9F%B3%EF%BC%9F.png)
因此,我设置了一个 ffmpeg 命令,用于转换通过 stdin 管道输入的音频。但是,输入的音频并不是持续管道输入的,有时会停止几秒钟,然后再恢复。
我怎样才能让 ffmpeg 在输出中用静音填充这些暂停部分?由于输出正在流式传输到 Icecast,我需要它持续运行,而不是对文件运行某种形式的后期处理。
这可能吗?如果可以,我该怎么做?如果有人能建议我使用不同的工具来实现这一点,我将不胜感激!
编辑:我用来传输音频的命令是。当我运行此命令时,它可以完美地将输入从 stdin 转换为 icecast。但是,当输入暂停时,ffmpeg 会在输入再次启动时停止写入,并出现以下错误:ffmpeg -hide_banner -ac 2 -f s32le -i pipe:0 -ar 48000 -ac 2 -compression_level 10 -c:a libmp3lame -f mp3 -content_type audio/mpeg -vn icecast://source:[email protected]/mount.mp3
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, s32le, from 'pipe:0':
Duration: N/A, bitrate: 2822 kb/s
Stream #0:0: Audio: pcm_s32le, 44100 Hz, stereo, s32, 2822 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (pcm_s32le (native) -> mp3 (libmp3lame))
Output #0, mp3, to 'icecast://source:[email protected]:mount.mp3':
Metadata:
TSSE : Lavf58.20.100
Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s32p
Metadata:
encoder : Lavc58.35.100 libmp3lame
av_interleaved_write_frame(): Broken pipe 128.2kbits/s speed=0.583x
Error writing trailer of icecast://source:[email protected]:mount.mp3: Broken pipe
size= 286kB time=00:00:18.31 bitrate= 128.0kbits/s speed=0.378x
video:0kB audio:286kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!
答案1
如果您遇到这样的问题,很可能是您的 Icecastsource_timeout
设置得太低了。尝试将其设置为不合理的高值或设置为-1
,它根本不会超时。
这将确保 ffmpeg 永不超时并且连接将保持打开状态,从而无需发送静默来模拟首先发送的数据。