VlcMediaPlayer Audioデバイスを選択して再生する方法[Ubuntu Linux C言語 vlc サウンドカード選択]

プログラム
この記事は約7分で読めます。

今回は、Linuxで自作簡易プレイヤーを作成したのですが、サウンドカードの選択の仕方についてネットにあまり情報がなかったので、備忘録としてまとめてみようと思います。
実際にはQT(GUIフレームワーク)で、音楽プレイヤーを作成していたのですが、そこまで記載すると超大作となってしまうので、vlcのサウンドカード制御にしぼった形で紹介します。

動作環境

まず、家にLinuxを動かせる環境がないので、Windows上で仮想環境を入れてLinuxを動かしています。
仮想環境とは、Window上で仮想的に他のOSを動かせるようにするものです。
今回はUbuntuをインストールして使用しています。

ホストWindows11
仮想環境VirtualBox 6.1.32 r149290
LinuxUbuntu 18.04 LTS

VirtualBoxについて興味のある方は、無料で使用できますので、以下からダウンロードして使ってみてください。

Oracle VM VirtualBox

プログラミングするための前準備

ここでは、実際にプログラミングをするための前準備について記載します。
具体的には、必要なライブラリのインストールです。

まずは、仮想環境からUbuntuを起動してください。
※仮想環境のインストールおよびUbuntuのインストールについては割愛します。
起動できたら、ターミナルを起動してください。
ターミナルの起動方法は以下です。

ターミナルが起動できたら以下の通り順に入力してください。

これは、上2段がUbuntu自体のアップデートで、2段がvlcmediaplayerおよびライブラリのインストールです。

$sudo apt-get update
$sudo apt-get upgrade
$sudo apt-get install vlc
$sudo apt-get install libvlc-dev
※$は入力不要です。

あとはC言語をビルドするために以下2つも実行してインストールしてください。

$sudo apt-get gcc
$sudo apt-get make

これで準備は完了です。

※Ubuntuの環境によって、もっと必要となるものがあるかもしれませんが、ご了承ください。

プログラミング

まずはプログラム全体とMakefileをお見せします。
Makefileとは、プログラムをコンパイルするレシピみたいなものです。
今回は、vlcというライブラリだけロードしています。
※その他も色々ありますが、基本的なものしかありませんので調べてみてください。

Makefile

CC            = gcc
CFLAGS        = -O4 -Wall -I/usr/local/include
DEST          = /usr/local/bin
LDFLAGS       = -L/usr/local/lib
LIBS          = -lvlc
OBJS          = vlc_test.o
PROGRAM       = vlc_test

all:            $(PROGRAM)

$(PROGRAM):	$(OBJS)
			$(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM)

clean:;	rm -f *.o *~ $(PROGRAM)

install:	$(PROGRAM)
			install -s $(PROGRAM) $(DEST)

vlc_test.c

#include "stdio.h"
#include "string.h"
#include <unistd.h>
#include "vlc/vlc.h"

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;
}

int main(void)
{
    const char * const vlc_args[] = {
              "--verbose=2", //be much more verbose then normal for debugging purpose
    };

    libvlc_instance_t* instance;
    libvlc_media_player_t *media_player;
    libvlc_audio_output_t *audiooutput;
    libvlc_media_t* media;
    libvlc_audio_output_device_t *audioDevices;

    /* インスタンスの生成 */
    instance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
    audiooutput = serch_and_getaudiocard(instance);

    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;
            }
        }   
    } 
    /* プレイヤーの生成 */
    media = libvlc_media_new_path(instance, "/home/xxx/デスクトップ/test.mp3"); 
    media_player = libvlc_media_player_new_from_media(media);

    /* オーディオデバイスの設定 */
    libvlc_audio_output_set(media_player, audiooutput->psz_name );            /* ALSAに設定 */
    libvlc_audio_output_device_set(media_player,NULL, audioDevices->psz_device );  /* デバイスの設定 */
    
    libvlc_media_player_play(media_player);

    sleep(100);
}

続いてはプログラムの解説ですが、解説は次ページにて記載します。

コメント

タイトルとURLをコピーしました