プログラム解説
サウンドカードを選択して音声を再生するまでの流れは以下の通りです。
- vlcプレイヤーのインスタンスを取得
- 使用できるAudio情報を取得
- 使用するオーディオカードを取得
- 使用するオーディオデバイスを取得
- 再生パスを指定してプレイヤーを生成
- オーディオデバイスを設定
- 再生
1.vlcプレイヤーのインスタンスを取得
以下がインスタンスを取得している部分となります。
libvlc_newというAPIを呼べばインスタンスを取得できます。
ここで与えているvlc_argsは、オプションの設定です。
近騎亜はログを出力するためにverboseというオプションを2に設定してあります。
const char * const vlc_args[] = {
"--verbose=2", //be much more verbose then normal for debugging purpose
};
libvlc_instance_t* instance;
/* インスタンスの生成 */
instance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
2.使用できるAudio情報を取得
次は、Audioカード情報の取得です。
こちらは、libvlc_audio_output_t *serch_and_getaudiocard(libvlc_instance_t *p_instance)関数の以下の部分で取得しています。引数に、1で取得したインスタンスを与える必要があります。
これで使用できるサウンドカードの情報を取得できます。
libvlc_audio_output_t * list = libvlc_audio_output_list_get ( p_instance );
3.使用するオーディオカードを取得
以下が、オーディオカードの一覧から使用するデバイスを取得するプログラムとなります。
2で取得した使用可能なオーディオカード一覧から使用するデバイスをサーチしています。
psz_nameという要素に名前が格納されていますので、そちらを文字列でサーチします。
こちらは、配列ではなくリスト構造となっていますので、次のデバイスに行くときは、p_nextに移動していけばサーチできます。
終端はNULLになっているので、NULLを見つければサーチ終了とすればよいです。
ちなみに今回は、ALSAのカードをサーチ対象にしています。
ALSA ・・・ Advanced Linux Sound Architectureの略で、Linux用のサウンドシステムを提供するためのソフトウェアのことです。
libvlc_audio_output_t *serch_and_getaudiocard(libvlc_instance_t *p_instance)
{
libvlc_audio_output_t * list = libvlc_audio_output_list_get ( p_instance );
if( list != NULL )
{
while(1)
{
if( list->p_next != NULL )
{/* 次デバイスがあれば */
if( strcmp(list->psz_name,"alsa") == 0)
{
break;
}
else
{
list = list->p_next;
}
}
else
{/* 終端 */
break;
}
}
}
return list;
}
4.使用するオーディオデバイスを取得
次はオーディオデバイスを取得する方法です。
まず、libvlc_audio_output_device_list_getを呼び出して、オーディオデバイスの一覧を取得します。
この時に引数として、1で取得したインスタンスと3で取得したオーディオデバイスを与えます。
これで、オーディオデバイスの一覧が取得できるので、あとは3と同じような方法でデバイスをサーチします。
ただし、今回は、psz_descriptionという要素を文字列で検索します。
audioDevices = libvlc_audio_output_device_list_get(instance, audiooutput->psz_name);
if( audioDevices != NULL )
{
while(1)
{
if( audioDevices->p_next != NULL )
{
if( strcmp(audioDevices->psz_description,"Intel 82801AA-ICH, Intel 82801AA-ICH Default Audio Device")==0 )
{
break;
}
else{
audioDevices = audioDevices->p_next;
}
}
else
{
break;
}
}
}
psz_descriptionで何を検索すれば分からないという方は、実際にVlcMediaPlayerを起動してそこから名前を調べてみてください。
5.再生パスを指定してプレイヤーを生成
以下が再生ファイルの指定とプレイヤーの生成部分となります。
libvlc_media_new_pathというAPIに1で生成したインスタンスとファイルパスを指定します。
それで生成されたオブジェクトをlibvlc_media_player_new_from_mediaに指定するとプレイヤーの実態が生成されます。
/* プレイヤーの生成 */
media = libvlc_media_new_path(instance, "/home/xxx/デスクトップ/test.mp3");
media_player = libvlc_media_player_new_from_media(media);
6.オーディオデバイスを設定
つついては、3・4で取得した情報をプレイヤーに与えて、オーディオデバイスを指定します。
libvlc_audio_output_set及びlibvlc_audio_output_device_setで、それぞれオーディオカードおよびデバイスの指定を行います。
引数には5で生成したプレイヤー情報とカード名(psz_name)とデバイス情報(psz_device)を指定します。
/* オーディオデバイスの設定 */
libvlc_audio_output_set(media_player, audiooutput->psz_name );
/* デバイスの設定 */
libvlc_audio_output_device_set(media_player,NULL, audioDevices->psz_device );
7.再生
最後は以下で再生です。
5で生成したプレイヤー情報を指定して、libvlc_media_player_playを呼び出せば、指定したオーディオデバイスで音声が再生されます。
libvlc_media_player_play(media_player);
まとめ
今回は、Vlc Media Playerでのオーディオデバイスの指定の方法について記載してきましたが、意外と簡単にできるもんだなと思いました。
ただ、やっている人が少ないのか、インターネット上にあまり情報がなく色々調べながら手探りでやってみて何とかできたという感じでした。
同じように困っている方がいればと思い今回記事にしてみましたので、ぜひ参考にしてみてください!!
追記 2022/3/23
サウンドカードの指定についてですが、プレイヤーの作りにもよりますが、停止->再生を繰り返していると、何かの拍子に別のサウンドカードがある場合に別のサウンドカードに切り替わってしまうことがあるようです。
※私の場合は、裏で別の音源をGstreamerで再生することをしているので、これが主たる要因だとは思います。
ですので、プレイヤーの再生を行う時には毎回 サウンドカードを指定した方がよさそうです。
私は、再生時間とプログレスを表示するために1秒間隔でコールバックがくるようにしているのですが、この時にも念のためにサウンドカードの再設定を実行しています。
これで勝手に切り替わってしまう問題は解消しました。
Gstreamer とは、マルチメディア用のフレームワークのことで、よくLinuxの動画や音声の再生・カメラ動画の再生なんかに使われています。
コメント