モノラル44kHzオーディオファイルを16kHzオーディオファイルにリサンプリングするために、「sox」ユーティリティを2つのパイプコマンドに入れようとします。
単一のパイプでうまく機能します。
$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav
しかし、別のパイプを追加すると、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 `-'
どんなアイデアがありますか?
答え1
-t wav
2番目の出力の前に追加してsox出力タイプを宣言する必要があります-
。
ファイル名の場合、soxは名前を見てそこから型を推論しますが、stdoutの場合は型を宣言する必要があります。
最後に、指定された-b 16 -e signed -c 1
出力の前に入力から送信されたと仮定する代わりに、他のすべての設定()を宣言することもできます。-
答え2
たとえば、明示的なファイル名を指定すると、toto.wav
SoXは.wav
拡張子からWAV形式を使用する必要があると推定します。出力された「filename」の場合は-
派生できないため、明示的に指定されたタイプを使用する必要があります-t wav
。ファイルに別の拡張子を指定したいtoto.sound
場合()、または拡張子をまったく指定したくない場合()にもtoto
同様に適用されます。
無関係なメモでは、WAVファイルはファイルの先頭に含まれるオーディオの長さを保存します。あなたの場合、ファイルの対応する部分がパイプに書き込まれると、最終的な長さがわからないため、「不明な長さ」を示す値が記録されます。これは、ファイルで実行したい操作によっては問題になる可能性があります。
答え3
speexdec toto.oga - | \
sox -V \
-t raw -b 16 -e signed -c 1 -r 44.1k - \
-t raw -b 16 -e signed -c 1 -r 16k - | \
cat - > toto.wav