問題タブ [24-bit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - SND_PCM_FORMAT_S24_3LE 形式の 24 ビット ファイルの初期化 ALSA に失敗する
ALSA ( ) を使用して、3 バイトのサンプル アラインメントで 24 ビットの wav ファイルを再生しようとしていますlibasound.so.2
。また、ALSA はバッファー サイズの設定に失敗し、Invalid argument
エラーが発生します (ALSA はドライバーに何も渡しません)。
wav
ファイルヘッダーの内容は次のとおりです。
残念ながら、クロスプラットフォーム プログラムの一部であり、個別にビルドできないため、適切なテスト プログラム ソースを提供できません。短い例は次のようになります
ALSA がsnd_pcm_hw_params_set_buffer_time_near()
呼び出し時にエラーで失敗する
(ALSA はドライバにデータを渡そうとせず、セット バッファで失敗するだけです) そのプログラムは 16 ビット オーディオに適しています。
バッファのさまざまな値 (0.001 .. 1 秒) を試しましたが、どれも機能しません。3LE を使用する 24 ビットに必要な ALSA 構成の一部を見逃していたとします。以前の初期化ステップの結果のチェックでしょうか?
残念ながら、24 ビットでの ALSA の使用例を見つけることができません。例/推奨事項/ドキュメントへのリンクをアドバイスしていただければ幸いです。
編集済み
aplay
このファイルの結果は次のとおりです。
c++ - 16 進数とゼロの連結
小数を 24 ビット (3 バイト、6 文字) の 16 進数に変換する簡単なコードを作成しました。
たとえば、0.5 を入力すると、16 進数が 0x400000 として提供されます。
答えは正しいですが、6文字の表現を維持したいので、0.1を= 0x0ccccd、
0.001を= 0x0020c5にしたいと思います。
- 考えられる方法の 1 つは、16 進数の結果を文字列に変換し、strlen を使用して桁数を確認し、結果を適切なゼロと連結することです。この方法の問題点は、16 進数の結果を変数に格納する方法がわからないことです。
- 16 進数を文字列に変換し、連結するゼロの数を見つけたとしても、プログラムは少しぎこちないだろうと考えました。私がやりたいことを達成するためのより簡単な方法があるかもしれません。方法がわかりません。誰かが私に道を示してくれることを願っています。私が書いたプログラムは以下です。
matlab - Matlab の高速データ型変換 4x1byte から 1x32byte
オーディオ サンプルを 24 ビット符号なし整数としてエンコードするバイナリ データのパケットを受信しています。これらは、出力用に 32 ビットの符号付き (2 の補数) 整数に変換する必要があります。
ただし、データがチャンク化される方法により、24 ビット ワードがパケット境界を越えて分割される可能性があります。したがって、各バイトを 8 ビットの符号なし整数としてバッファリングし、すべてのパケットが受信されたときに 3 つのグループ (+ ゼロ パディングの 1 バイト) で再キャストできるようにします。
これを行うために、次の関数を作成しました。ここで、input
は type の 1x3 配列ですuint8
。
以下のスニペットを使用して例を実行できます。
この関数は仕事をしますが、私の処理では数桁も遅いプロセスです。
同じ結果を達成するためのより効率的な方法はありますか? それとも、より難解なデータ型変換を処理できる組み込みの Matlab 関数ですか?
ありがとう