enumerate dshow deviceを使う
のフォローです。まず、

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

のように、前記事のEnumerateCaptureDevices.cppとvlcwrapper.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のサイズと解像度が合わない場合は、左右に黒い帯がでることがあります。
コメント