トップページ > 記事閲覧
音声の一部分を取り出して保存したい
名前:BayLeaf 日時: 2017/06/28 07:46

お世話になっております。 今回はWindows版での相談です。 ハンドルに読み込んだ音声の一部分を取り出して保存を行いたいと考えているのですが、 取り出した音声を新規に保存する方法があれば教えていただけたらと思います。 もしなければ、 「サウンドハンドルの再生開始位置と再生終了位置を指定してその間の音声を名前指定して新規保存する関数」 が欲しいです。 よろしくお願い致します。
メンテ

Page: 1 |

Re: 音声の一部分を取り出して保存したい ( No.1 )
名前:管理人 日時:2017/06/28 23:52

そのままの機能を持った関数はありませんが、既存のDXライブラリの機能だけでご希望の処理を実現できます リファレンスには載っていませんが、画像のピクセルへのアクセスに向いているソフトイメージと 同じようにサウンドの波形データのアクセスに向いているソフトサウンドというものがあります // ソフトウエアで扱う波形データハンドルをサウンドファイルから作成する int LoadSoftSound( char *FileName ) ; // ソフトウエアで扱う波形データハンドルのフォーマットを取得する int GetSoftSoundFormat( int SoftSoundHandle, int *Channels, int *BitsPerSample, int *SamplesPerSec, int *IsFloatType = NULL ) ; // ソフトウエアで扱う波形データハンドルのサンプル数を取得する int GetSoftSoundSampleNum( int SoftSoundHandle ) ; // ソフトウエアで扱う波形データハンドルのサンプルを読み取る int ReadSoftSoundData( int SoftSoundHandle, int SamplePosition, int *Channel1, int *Channel2 ) ; // ソフトウエアで扱う波形データハンドルのサンプルを読み取る( float型版 ) int ReadSoftSoundDataF( int SoftSoundHandle, int SamplePosition, float *Channel1, float *Channel2 ) ; // ソフトウエアで扱う波形データハンドルのサンプルを書き込む int WriteSoftSoundData( int SoftSoundHandle, int SamplePosition, int Channel1, int Channel2 ) ; // ソフトウエアで扱う波形データハンドルのサンプルを書き込む( float型版 ) int WriteSoftSoundDataF( int SoftSoundHandle, int SamplePosition, float Channel1, float Channel2 ) ; ソフトイメージと同じく普通のサウンドハンドルとは異なり、ソフトサウンドハンドルというもので扱います( LoadSoftSound の戻り値がソフトサウンドハンドルです ) そして空のソフトサウンドハンドルも作成することができます int MakeSoftSound( int UseFormat_SoftSoundHandle, int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( フォーマットは引数のソフトウエアサウンドハンドルと同じものにする ) int MakeSoftSound2Ch16Bit44KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:2 量子化ビット数:16bit サンプリング周波数:44KHz ) int MakeSoftSound2Ch16Bit22KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:2 量子化ビット数:16bit サンプリング周波数:22KHz ) int MakeSoftSound2Ch8Bit44KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:2 量子化ビット数: 8bit サンプリング周波数:44KHz ) int MakeSoftSound2Ch8Bit22KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:2 量子化ビット数: 8bit サンプリング周波数:22KHz ) int MakeSoftSound1Ch16Bit44KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:1 量子化ビット数:16bit サンプリング周波数:44KHz ) int MakeSoftSound1Ch16Bit22KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:1 量子化ビット数:16bit サンプリング周波数:22KHz ) int MakeSoftSound1Ch8Bit44KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:1 量子化ビット数: 8bit サンプリング周波数:44KHz ) int MakeSoftSound1Ch8Bit22KHz( int SampleNum ) ; // ソフトウエアで扱う空の波形データハンドルを作成する( チャンネル数:1 量子化ビット数: 8bit サンプリング周波数:22KHz ) int MakeSoftSoundCustom( int ChannelNum, int BitsPerSample, int SamplesPerSec, int SampleNum, int IsFloatType = 0 ) ; // ソフトウエアで扱う空の波形データハンドルを作成する 今回はサウンドファイルの一部を抜き出したいとのことですので、一番上の MakeSoftSound で良いと思います あとソフトサウンドハンドルが持つ波形データを無圧縮の PCM形式の wav ファイルで保存する関数もあります // ソフトウエアで扱う波形データハンドルをWAVEファイル(PCM)形式で保存する int SaveSoftSound( int SoftSoundHandle, char *FileName ) ; これらを使用して 1.取り出したい音声ファイルを LoadSoftSound で読み込む 2.取り出したい長さのソフトサウンドハンドルを MakeSoftSound で作成する 3.取り出したい部分を ReadSoftSoundData で読み込み、2 で作成したソフトサウンドハンドルに WriteSoftSoundData で書き込む  ( 一括転送の関数が無いので、面倒で申し訳ありませんが for文で 1サンプルづつ読み込み、書き込みを行ってください ) 4.取り出したい部分だけの波形データとなった 2 のソフトサウンドハンドルを SaveSoftSound で保存する という処理を行うことで、「音声の一部分を取り出して保存する」を実現することができます よろしければお試しください m(_ _)m
メンテ
Re: 音声の一部分を取り出して保存したい ( No.2 )
名前:BayLeaf(解決) 日時:2017/07/03 01:31

SoftSoundはこういったときにも使えるのですね。 実行も無事に行うことができました。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存