Libvlcwrapperからdshowデバイスを利用する

enumerate dshow deviceを使う

のフォローです。まず、

こんなフォームを作ります。肝要なのは、二つのTComboBoxです。左がカメラリスト、右が選ばれたカメラがサポートする解像度のリストになります。

のように、前記事のEnumerateCaptureDevices.cppvlcwrapper.hをプロジェクトに加えます。上図のようにターゲットプラットフォームをWindows 64 ビットに忘れずにセット。最終的なUnit1.cppは、

#include <vcl.h>
#pragma hdrstop

#include <vector>
#include <StrUtils.hpp>
#include "vlcwrapper.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct adevice {
	String dname;
	std::vector<String> resolutions;
} aentry;

//extern adevice aentry;


std::vector<adevice> dlist;
VLC* vlc;

void EnumerateCaptureDevices();

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Memo1->Lines->Clear();

	EnumerateCaptureDevices();

	for( int i = 0 ; i < dlist.size() ; i++ ){
		Memo1->Lines->Add(IntToStr(i));
		Memo1->Lines->Add(dlist[i].dname);
		ComboBox1->Items->Add(dlist[i].dname);
		for( int j = 0 ; j < dlist[i].resolutions.size() ; j++ )
			Memo1->Lines->Add(" " + dlist[i].resolutions[j]);

		Memo1->Lines->Add("-----------------");
	}


}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
	int index = ComboBox1->ItemIndex;

	for( int j = 0 ; j < dlist[index].resolutions.size() ; j++ )
		ComboBox2->Items->Add(dlist[index].resolutions[j]);
}
//---------------------------------------------------------------------------
// :dshow-vdev=Integrated Camera :dshow-adev=none :dshow-size=1280x720 :dshow-aspect-ratio=16\:9 :dshow-chroma= :dshow-fps=0 :no-dshow-config :no-dshow-tuner :dshow-tuner-channel=0 :dshow-tuner-frequency=0 :dshow-tuner-country=0 :dshow-tuner-standard=0 :dshow-tuner-input=0 :dshow-video-input=-1 :dshow-video-output=-1 :dshow-audio-input=-1 :dshow-audio-output=-1 :dshow-amtuner-mode=1 :dshow-audio-channels=0 :dshow-audio-samplerate=0 :dshow-audio-bitspersample=0 :live-caching=300

void __fastcall TForm1::PlayClick(TObject *Sender)
{
	String x,y;

	vlc = new VLC("dshow://");
	vlc->Option(":dshow-vdev=" + dlist[Form1->ComboBox1->ItemIndex].dname);
	String resolution = dlist[Form1->ComboBox1->ItemIndex].resolutions[Form1->ComboBox2->ItemIndex];
	TStringDynArray array = SplitString(resolution, "x");
	vlc->Option(":dshow-size=" + dlist[Form1->ComboBox1->ItemIndex].resolutions[Form1->ComboBox2->ItemIndex]);
	//vlc->Option(":dshow-aspect-ratio=4\\:3");
	Edit1->Text = array[0];
	Edit2->Text = array[1];

	vlc->Option(":dshow-aspect-ratio="+Edit1->Text+"\\:"+Edit2->Text);
	if( !Floating->Checked )
		vlc->SetHWND(Panel1->Handle);
	vlc->SetVolume(25);
	vlc->Play();

}
//---------------------------------------------------------------------------

void __fastcall TForm1::StopClick(TObject *Sender)
{
	vlc->Stop();
	delete vlc;

}

これだけです。

動かすと、

ここで左のComboBox1をクリックすると、

システムが認識しているカメラのリストが得られるので、どちらかを選択します。

例えばHikvisionを選んでから、ComboBox2をクリックすると、得られる解像度のリストが表示されるので、どれかを選択します。今は下の方の1280×720を選んでみましょう。それからPlay

Floatingにチェックを入れると、

解像度に合わせて、別のwindowが開きます。

システムが把握しているカメラを任意に選んで、さらにサポートされている解像度を選んで再生することができます。アスペクト比は自動で設定されます。TPanelに押し込むこともできるし、外のWindowに表示することもできます。TPanelに押し込むと、TPanelのサイズと解像度が合わない場合は、左右に黒い帯がでることがあります。

コメント