在 Ubuntu 20.04、Csound 6.13.0、ffmpeg 4.2.4 上运行良好:
git clone https://github.com/csound/csound
cd csound
git checkout 92409ecce053d707360a5794f5f4f6bf5ebf5d24
csound examples/xanadu.csd
我可以保存到文件:
csound -o xanadu.wav xanadu.csd
ffplay xanadu.wav
或者:
csound -W -o stdout xanadu.csd > xanadu-stdout.wav
甚至从文件转换:
ffmpeg -i xanadu-stdout.wav xanadu-stdout.ogg
ffplay xanadu-stdout.ogg
或者:
cat xanadu-stdout.wav | ffmpeg -f wav -i - xanadu.ogg
或者:
csound -W -o stdout xanadu.csd | cat > xanadu-cat.wav
那么为什么这会从直接管道失败:
csound -W -o stdout xanadu.csd | ffmpeg -f wav -i - xanadu.ogg
或者:
csound -W -o stdout xanadu.csd | cat > xanadu-cat.wav
ffmpeg -y -f wav -i xanadu-cat.wav xanadu.ogg
和:
[wav @ 0x56093284c6c0] invalid start code d[163][3][0] in RIFF header
xanadu-cat.wav: Invalid data found when processing input
所以看起来xanadu.wav
和xanadu-cat.wav
是不同的:
$ diff -u xanadu.wav xanadu-cat.wav
Binary files xanadu.wav and xanadu-cat.wav differ
这使得转换失败。
我知道:
csound --ogg -o xanadu.ogg xanadu.csd
这确实有效,但我只是想通过管道进入 ffmpeg 以获得乐趣。