web-dev-qa-db-ja.com

入力が停止したときにffmpegに無音を書き込むにはどうすればよいですか?

だから私はstdinを介してパイプされたオーディオを変換するffmpegコマンドを設定しています。ただし、入力されているこのオーディオは常にパイプで送られるわけではなく、再開する前に、場合によっては数秒間停止することがあります。

Ffmpegにこれらの一時停止したセクションを無音で埋めさせるにはどうすればよいですか?出力はIcecastにストリーミングされているため、ファイルに対して何らかの後処理を実行するのではなく、常に実行する必要があります。

これは可能ですか?もしそうなら、私はこれについてどうしますか?これを達成するために使用できるさまざまなツールの提案があれば、それでも大いに感謝します!

[〜#〜] edit [〜#〜]:オーディオのストリーミングに使用しているコマンドは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。このコマンドを実行すると、stdinからの入力を完全に変換し、これをicecastにブロードキャストします。ただし、入力に一時停止があると、入力が再起動するとffmpegは書き込みを停止し、次のエラーが発生します。

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
Kezz101

このような問題が発生した場合は、Icecast source_timeoutの設定が低すぎる可能性があります。不当に高い値に設定するか、-1に設定すると、タイムアウトしません。

これにより、ffmpegがタイムアウトすることはなく、接続が開いたままになるため、最初に送信されるデータを模倣するために無音を送信する必要がなくなります。

1
Kezz101