web-dev-qa-db-ja.com

2本のパイプの間にソックス

「sox」ユーティリティを2つのパイプコマンドに入れて、モノラルの44kHzオーディオファイルを16kHzオーディオファイルにリサンプリングしようとしています。

単一のパイプで正常に動作します:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav

しかし、onatherパイプを追加すると、soxユーティリティは不平を言います。

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k - | cat - > toto.wav
sox FAIL formats: can't determine type of `-'

何か案が ?

3
SebMa

2番目の-t wavの前に-を追加して、sox出力のタイプを宣言する必要があります。

ファイル名の場合、soxはその名前をのぞき、そこから型を推定しますが、stdoutの場合は、型を宣言する必要があります。

また、入力から転送されると想定せずに、他のすべての設定(-b 16 -e signed -c 1)も宣言することもできます。出力を指定する最後の-より前のすべて。

4

toto.wavなどの明示的なファイル名を指定すると、SoXは.wav拡張子からWAV形式を使用すると想定されます。 -が出力「ファイル名」の場合、その推定は実行できないため、-t wavでタイプを明示的に指定する必要があります。ファイルに別の拡張子(toto.sound)を付けるか、まったく付けない(toto)場合も、同じことが当てはまります。

無関係な注記として、WAVファイルは、ファイルの先頭に含まれるオーディオの長さを格納します。あなたの場合、ファイルのその部分がパイプに書き込まれるとき、最終的な長さはわかりません。したがって、「不明な長さ」を示す値が代わりに書き込まれます。これは、ファイルをどのように処理するかによって、問題になる場合とそうでない場合があります。

2
chirlu