ラベル WAVEファイル の投稿を表示しています。 すべての投稿を表示
ラベル WAVEファイル の投稿を表示しています。 すべての投稿を表示

2018年9月23日日曜日

Broadcast Wave Format に対応した WAVE 音声の読み込み

Broadcast Wave Format に対応した WAVE 音声の読み込みの例題です。
Broadcast Wave Format (BWF) は、マイクロソフトのWAV音声ファイルフォーマットの拡張であり、映画やテレビで使われているノンリニアデジタルレコーダーの録音フォーマットとしてよく使われている。
WAVEファイルの読込み/再生 での例題で WAVEファイルを読み込んだ際、ヘッダ部分がうまく取得できないWAVEファイルが存在していました。
中身を見ると、フォーマット用のチャンク部分に「fmt 」ではなく、「bext」と記載されているファイル形式のファイルでした。
PCMの音声データ部分のチャンクは「data」から始まり、PCM音声部分の抜き取りは正常に動作していたのですが、元の音声の形式がどのようなものかを正常に取得できていないので困ることになります。
なので、この「bext」のチャンクが含まれる Broadcast Wave Format の WAVE 形式にも対応した形で読み込み部を修正しています。

Broadcast Wave Format(BWF)は CM 位置へのスキップ等に対応した CUE というイベント情報等を含められるようですが、今回はヘッダ部分のパースと WAVE の保存形式を正常に認識するための修正のみを行っています(CUE が入った音声サンプルが手に入らないため)。

また、4GBの壁にも対応した修正になっています(本来はWAVE64というフォーマットがありますが、WAVEに4GB以上のデータが含まれるもの)。
WAVEファイルのヘッダ構造体は32bitですのでその部分で4GBの壁となります。
WAVEで保存するICレコーダー等で4GB以上の録音となる場合にこういった不具合が発生することがあります。
data チャンクの長ささえ取得できれば音声部は正しく保存されていますので、その部分から読み込みを開始すればデータ部は正しく取得できます。 実行結果

2017年6月22日木曜日

libasound によりPCM音声録音

libasound によるPCM音声録音の例題です。

Linux や Raspberry にてコマンドラインからマイクに接続し音声を WAVE ファイルとして保存します。
libasound がインストールされていない場合、下記のコマンドによりインストールしてください。 また、例題のような自分で録音用のコーディングをしなくてもツール群が提供されています。 alsa-utils に含まれる arecord コマンドにて録音、aplay コマンドにより再生が可能です。
この arecord コマンドにより、PC にマイク機器が接続されているかを確認することができます。 表示される「カード 1」が例題にて使用するマイク番号で、使用するマイクの記述方法は「hw:1」や「plughw:1」と言う形式になります。
「hw:1」を利用するとマイクからの入力がそのまま録音されるので 44100Hz 等のサンプリングレートを変えることはできませんが、「plughw:1」を利用するとソース上からダウンミックスした形でサンプリングレートを変更することができます(標準は 8000Hz で 他のサンプリングレートも指定できます)。

例題では、使用するマイクの番号、サンプリングレート、保存する秒数を指定して録音を開始し、ファイル名「record_マイク番号.wav」にて保存しています。
実行結果

2017年6月21日水曜日

WAVE/PCM 音声の生成

WAVE/PCM 音声を生成する例題です。

WAVE 音声に関して以前まとめたものはこちら(WAVEファイルの読込み/再生)

WAVE 音声のフォーマットに合わせてヘッダを書き込み(2ch, 44100Hz)、sin 波形の振幅を徐々に大きくした音声を生成しています。 実行結果(Audacity にて表示)

2011年5月14日土曜日

構造体データのバイナリファイル出力、読み取り

構造体データをバイナリファイルとして出力し、バイナリファイルから構造体データを読み取る例題です。

固定サイズの構造体の場合
読み取りの際には、構造体データのサイズ毎に読み取り、データが無くなるまで処理を行っています。
実行結果
サイズが変動する構造体の場合

上記の例題では、読み書きのサイズには sizeof(entry) にてサイズを指定していますが、文字列の長さが可変の場合には注意が必要で、文字列の長さに応じて構造体のサイズを毎回計算する必要があります。

以下の例題では、構造体のサイズが毎回異なる場合のファイル出力、読み込み、表示を行なっています。

ファイルフォーマット:
[格納する名前の数][リストのタイトル][格納数に応じた名前の長さ、文字列の繰り返し]
[格納する名前の数][リストのタイトル][格納数に応じた名前の長さ、文字列の繰り返し]
[格納する名前の数][リストのタイトル][格納数に応じた名前の長さ、文字列の繰り返し]
→ 格納する名前の数が読み取れなくなるまで構造体を読み取る
実行結果
既存のフォーマットファイルの場合(.bmp/.wav ファイル)

RFC 等により既定されている既存のファイルフォーマットは、構造体の形式を予め調べておくことにより入出力することができます(画像:ビットマップ形式、PNM形式、音声:AAC/ADTS形式)。

以下では、Windows PCM フォーマット(拡張子 .wav)のファイルを読み込み、チャンネル数やサンプリング周波数等の情報の表示を行なっています(WAVE/PCM 音声の生成)。
実行結果