パイプラインを停止せずに出力ファイルを変更する方法

パイプラインを停止せずに出力ファイルを変更する方法

私はDSPを実行するためにオーディオファイルを取得するためにarecordを使用しています。問題は、i2sマイクで入力キャプチャを開始するたびに、ファイルの先頭に1秒間ポップが発生することです。この問題を解決するためにパイプを使用しようとしています。私が望むのは、パイプラインを停止せずにパイプラインの出力を変更して、これらのポップを防ぎ、オーディオの空白を防ぐことです。

たとえば、soundfile1とsoundfile2を切り替えて別のファイルが録音されている間に1つのファイルを分析できるように、このようなことをしたいと思います。録音を開始するときにポップが出ても構いませんが、前後に切り替えるたびにポップが出ることはできません。

arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v > soundfile1.wav

arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v > soundfile2.wav

残念ながら、これは「デバイスまたはリソースが使用中です」というメッセージのみが表示されます。

ベストアンサー1

シェルで実行して実行するようにします。

arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v \
| while :; do dd bs=384000 count=1 iflag=fullblock 2>/dev/null >>output; done

それぞれはdd個別に開封されます。それぞれを個別に開封して取り付けることがoutput重要です。これは、youまたはanewがnextで書かれると、新しいものがすぐに作成されることを意味します。outputddrm outputmv output soundfile1.wavddoutputoutput

単一ファイルシステム内で発生した場合、mv output soundfile1.wavデータは失われません。つまり、soundfile1.wav新しいストリームをリンクすると、output元のストリームが再生成されます。これは、ファイル名を変更または削除しても、すでにファイルが開いているプロセスを妨げないためです。

cp他のファイルシステムへの移動は実際には+と同じですunlink。この場合、ddとの間にいくつかの追加が発生する可能性があり、ブロックが失われます。したがって、他のファイルシステムに直接移動しないでください。これを行う必要がある場合は、単一のファイルシステム内で名前を変更し、新しいファイルが表示されるのを待ち、名前の変更されたファイルを別のファイルシステムに移動します。outputcpunlinkoutputoutput

別の方法はシンボリックリンクを使用することです。output名前へのシンボリックリンクを作成します。

ln -s soundfile2.wav output

その後、コマンドを実行します。ターゲットファイルが存在しない可能性があり、生成されます。存在する場合、データが追加されます。

別のファイルに切り替えたい場合は、シンボリックリンクを自動的に更新します。

ln -sf soundfile3.wav output

新しいファイルが別のファイルシステムに存在する可能性がありますが、これは問題ではありません。また、シンボリックリンクを使用すると、停止せずにデータの保存を停止できますarecord。継続的に実行されているコマンドを次にリダイレクトするだけです/dev/null

ln -sf /dev/null output

これは、シンボリックリンクを再度変更して通常のファイルに保存し始めると、ポップアップが実行されない可能性が高いため便利です。

メソッドはシンボリックリンクなしで、またはシンボリックリンクで使用できます。シンボリックリンクの場合、output単に削除すると、次は一般ファイルとしてdd生成されます。通常のファイルoutputoutputデータを失うことなくシンボリックリンクに置き換えるには、ファイルを新しい名前(たとえば)にハードリンクし、自動的にシンボリックリンクにln output soundfile4.wav置き換えます。output

メモ:

  • iflag=fullblock持ち運びが簡単ではありません。ddサポートしていない場合はお試しくださいbs=8 count=48000。それにもかかわらず、私たちはサンプルの途中で新しいファイルに変換する必要はありません。サンプルの1つは8バイト(32ビット×2チャンネル)です。私はLinuxのパイプについて十分に慣れていないarecordので、ツールがサンプルを複数の書き込みに分割しないことを願っているので、dd bs=8そうでなくiflag=fullblockてもわかりません。dd読んだ内容が少ない場合(比較これ) これで中間サンプルの作成が終了することがあります。新しいファイルに変更すると、新しいファイルが不完全なサンプルで始まり、正しく再生されません。ですから、使えばiflag=fullblock使えます。覚えるdd正しく使いづらい奇妙なツールです。;iflag=fullblock過敏性を減らします。
  • 粒度を変更bsおよび/または増減できます。countたとえば、1 秒あたりbs=38400 count=110 のプロセスが実行されるため、設定全体がほぼすぐに新しいファイルに切り替わる可能性があります。dd一方、1秒あたり10のプロセスは不要な負担になる可能性があります。あなたに合うものは何でも可能です。ただbs8の倍数に保ちます。
  • CtrlC現在+を使用してコマンドを終了すると、書き込みなしでdd終了できます。bs=384000 count=1キャプチャされたデータのうち最大約1秒が失われる可能性があります。大切なものを録音するときは、Ctrl+をC1~2秒程度延期してください。

おすすめ記事