Menemukan dan memilih kemampuan kamera dengan profil kamera

Artikel ini membahas cara menggunakan profil kamera untuk menemukan dan mengelola kemampuan perangkat pengambilan video yang berbeda. Ini termasuk tugas seperti memilih profil yang mendukung resolusi atau kecepatan bingkai tertentu, profil yang mendukung akses simultan ke beberapa kamera, dan profil yang mendukung HDR.

Catatan

Artikel ini dibangun berdasarkan konsep dan kode yang dibahas dalam pengambilan foto, video, dan audio Dasar dengan MediaCapture, yang menjelaskan langkah-langkah untuk menerapkan pengambilan foto dan video dasar. Disarankan agar Anda membiasakan diri dengan pola pengambilan media dasar dalam artikel tersebut sebelum beralih ke skenario pengambilan yang lebih canggih. Kode dalam artikel ini mengasumsikan bahwa aplikasi Anda sudah memiliki instans MediaCapture yang telah diinisialisasi dengan benar.

 

Tentang profil kamera

Kamera pada perangkat yang berbeda mendukung kemampuan yang berbeda termasuk serangkaian resolusi pengambilan yang didukung, kecepatan bingkai untuk pengambilan video, dan apakah HDR atau pengambilan kecepatan bingkai variabel didukung. Kerangka kerja pengambilan media Platform Windows Universal (UWP) menyimpan serangkaian kemampuan ini dalam MediaCaptureVideoProfileMediaDescription. Profil kamera, yang diwakili oleh objek MediaCaptureVideoProfile , memiliki tiga koleksi deskripsi media; satu untuk pengambilan foto, satu untuk pengambilan video, dan satu lagi untuk pratinjau video.

Sebelum menginisialisasi objek MediaCapture , Anda dapat mengkueri perangkat pengambilan di perangkat saat ini untuk melihat profil apa yang didukung. Saat Anda memilih profil yang didukung, Anda tahu bahwa perangkat pengambilan mendukung semua kemampuan dalam deskripsi media profil. Ini menghilangkan kebutuhan akan pendekatan percobaan dan kesalahan untuk menentukan kombinasi kemampuan mana yang didukung pada perangkat tertentu.

var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };

Contoh kode dalam artikel ini menggantikan inisialisasi minimal ini dengan penemuan profil kamera yang mendukung berbagai kemampuan, yang kemudian digunakan untuk menginisialisasi perangkat pengambilan media.

Menemukan perangkat video yang mendukung profil kamera

Sebelum mencari profil kamera yang didukung, Anda harus menemukan perangkat pengambilan yang mendukung penggunaan profil kamera. Metode pembantu GetVideoProfileSupportedDeviceIdAsync yang ditentukan dalam contoh di bawah ini menggunakan metode DeviceInformation.FindAllAsync untuk mengambil daftar semua perangkat pengambilan video yang tersedia. Ini mengulangi semua perangkat dalam daftar, memanggil metode statis, IsVideoProfileSupported, untuk setiap perangkat untuk melihat apakah mendukung profil video. Selain itu , properti EnclosureLocation.Panel untuk setiap perangkat, memungkinkan Anda menentukan apakah Anda menginginkan kamera di bagian depan atau belakang perangkat.

Jika perangkat yang mendukung profil kamera ditemukan di panel yang ditentukan, nilai Id , yang berisi string ID perangkat, dikembalikan.

public async Task<string> GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel panel)
{
    string deviceId = string.Empty;

    // Finds all video capture devices
    DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
    
    foreach (var device in devices)
    {
        // Check if the device on the requested panel supports Video Profile
        if (MediaCapture.IsVideoProfileSupported(device.Id) && device.EnclosureLocation.Panel == panel)
        {
            // We've located a device that supports Video Profiles on expected panel
            deviceId = device.Id;
            break;
        }
    }

    return deviceId;
}

Jika ID perangkat yang dikembalikan dari metode pembantu GetVideoProfileSupportedDeviceIdAsync adalah null atau string kosong, tidak ada perangkat pada panel yang ditentukan yang mendukung profil kamera. Dalam hal ini, Anda harus menginisialisasi perangkat penangkapan media tanpa menggunakan profil.

string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);

if (string.IsNullOrEmpty(videoDeviceId))
{
    // No devices on the specified panel support video profiles. .
    return;
}

Pilih profil berdasarkan resolusi dan kecepatan bingkai yang didukung

Untuk memilih profil dengan kemampuan tertentu, seperti dengan kemampuan untuk mencapai resolusi dan kecepatan bingkai tertentu, Anda harus terlebih dahulu memanggil metode pembantu yang ditentukan di atas untuk mendapatkan ID perangkat tangkapan yang mendukung penggunaan profil kamera.

Buat objek MediaCaptureInitialization Pengaturan baru, melewati ID perangkat yang dipilih. Selanjutnya, panggil metode statis MediaCapture.FindAllVideoProfiles untuk mendapatkan daftar semua profil kamera yang didukung oleh perangkat.

Contoh ini menggunakan metode kueri Linq, yang disertakan dalam namespace layanan System.Linq menggunakan, untuk memilih profil yang berisi objek SupportedRecordMediaDescription di mana properti Lebar, Tinggi, dan FrameRate cocok dengan nilai yang diminta. Jika kecocokan ditemukan, VideoProfile dan RecordMediaDescription dari MediaCaptureInitialization Pengaturan diatur ke nilai dari jenis anonim yang dikembalikan dari kueri Linq. Jika tidak ada kecocokan yang ditemukan, profil default akan digunakan.


var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = videoDeviceId };

IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(videoDeviceId);

var match = (from profile in profiles
             from desc in profile.SupportedRecordMediaDescription
             where desc.Width == 640 && desc.Height == 480 && Math.Round(desc.FrameRate) == 30
             select new { profile, desc }).FirstOrDefault();

if (match != null)
{
    mediaInitSettings.VideoProfile = match.profile;
    mediaInitSettings.RecordMediaDescription = match.desc;
}
else
{
    // Could not locate a WVGA 30FPS profile, use default video recording profile
    mediaInitSettings.VideoProfile = profiles[0];
}

Setelah Anda mengisi MediaCaptureInitialization Pengaturan dengan profil kamera yang Anda inginkan, Anda cukup memanggil InitializeAsync pada objek pengambilan media Anda untuk mengonfigurasinya ke profil yang diinginkan.

await _mediaCapture.InitializeAsync(mediaInitSettings);

Menggunakan grup sumber bingkai media untuk mendapatkan profil

Dimulai dengan Windows 10, versi 1803, Anda dapat menggunakan kelas MediaFrameSourceGroup untuk mendapatkan profil kamera dengan kemampuan tertentu sebelum menginisialisasi objek MediaCapture. Grup sumber bingkai memungkinkan produsen perangkat untuk mewakili grup sensor atau kemampuan pengambilan sebagai satu perangkat virtual. Ini memungkinkan skenario fotografi komputasi seperti menggunakan kamera kedalaman dan warna bersama-sama, tetapi juga dapat digunakan untuk memilih profil kamera untuk skenario pengambilan sederhana. Untuk informasi selengkapnya tentang menggunakan MediaFrameSourceGroup, lihat Memproses bingkai media dengan MediaFrameReader.

Contoh metode di bawah ini menunjukkan cara menggunakan objek MediaFrameSourceGroup untuk menemukan profil kamera yang mendukung profil video yang diketahui, seperti yang mendukung HDR atau urutan foto variabel. Pertama, panggil MediaFrameSourceGroup.FindAllAsync untuk mendapatkan daftar semua grup sumber bingkai media yang tersedia di perangkat saat ini. Perulangan melalui setiap grup sumber dan panggil MediaCapture.FindKnownVideoProfiles untuk mendapatkan daftar semua profil video untuk grup sumber saat ini yang mendukung profil yang ditentukan, dalam hal ini HDR dengan foto WCG. Jika profil yang memenuhi kriteria ditemukan, buat objek MediaCaptureInitialization Pengaturan baru dan atur VideoProfile ke profil pilih dan properti VideoDeviceId ke Id dari grup sumber bingkai media saat ini. Jadi, misalnya, Anda dapat meneruskan nilai KnownVideoProfile.HdrWithWcgVideo ke dalam metode ini untuk mendapatkan pengaturan pengambilan media yang mendukung video HDR. Teruskan KnownVideoProfile.VariablePhotoSequence untuk mendapatkan pengaturan yang mendukung urutan foto variabel.

private async Task<MediaCaptureInitializationSettings> GetKnownVideoProfile(KnownVideoProfile knownVideoProfile)
{
    IReadOnlyList<MediaFrameSourceGroup> sourceGroups = await MediaFrameSourceGroup.FindAllAsync();
    MediaCaptureInitializationSettings settings = null;

    foreach (MediaFrameSourceGroup sg in sourceGroups)
    {
        // Find a device that support VariablePhotoSequence
        IReadOnlyList<MediaCaptureVideoProfile> profileList = MediaCapture.FindKnownVideoProfiles(
                                      sg.Id,
                                      knownVideoProfile); // e.g. KnownVideoProfile.HdrWithWcgVideo

        if (profileList.Count > 0)
        {
            settings = new MediaCaptureInitializationSettings();
            settings.VideoProfile = profileList[0];
            settings.VideoDeviceId = sg.Id;
            break;
        }
    }
    return settings;

    
}

Gunakan profil yang diketahui untuk menemukan profil yang mendukung video HDR (teknik warisan)

Catatan

API yang dijelaskan di bagian ini tidak digunakan lagi dimulai dengan Windows 10, versi 1803. Lihat bagian sebelumnya, Gunakan grup sumber bingkai media untuk mendapatkan profil.

Memilih profil yang mendukung HDR dimulai seperti skenario lainnya. Buat MediaCaptureInitialization Pengaturan dan string untuk menahan ID perangkat pengambilan. Tambahkan variabel boolean yang akan melacak apakah video HDR didukung.

MediaCaptureInitializationSettings mediaInitSettings = new MediaCaptureInitializationSettings();
string videoDeviceId = string.Empty;
bool HdrVideoSupported = false;

Gunakan metode pembantu GetVideoProfileSupportedDeviceIdAsync yang ditentukan di atas untuk mendapatkan ID perangkat untuk perangkat tangkapan yang mendukung profil kamera.

// Select the first video capture device found on the back of the device
videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);

if (string.IsNullOrEmpty(videoDeviceId))
{
    // No devices on the specified panel support video profiles. .
    return;
}

Metode statis MediaCapture.FindKnownVideoProfiles mengembalikan profil kamera yang didukung oleh perangkat yang ditentukan yang dikategorikan oleh nilai KnownVideoProfile yang ditentukan. Untuk skenario ini, nilai VideoRecording ditentukan untuk membatasi profil kamera yang dikembalikan ke profil yang mendukung perekaman video.

Perulangan daftar profil kamera yang dikembalikan. Untuk setiap profil kamera, loop melalui setiap VideoProfileMediaDescription dalam pemeriksaan profil untuk melihat apakah properti IsHdrVideoSupported benar. Setelah deskripsi media yang sesuai ditemukan, pecahkan perulangan dan tetapkan objek profil dan deskripsi ke objek MediaCaptureInitialization Pengaturan.

IReadOnlyList<MediaCaptureVideoProfile> profiles =
    MediaCapture.FindKnownVideoProfiles(videoDeviceId, KnownVideoProfile.VideoRecording);

// Walk through available profiles, look for first profile with HDR supported Video Profile
foreach (MediaCaptureVideoProfile profile in profiles)
{
    IReadOnlyList<MediaCaptureVideoProfileMediaDescription> recordMediaDescription =
        profile.SupportedRecordMediaDescription;
    foreach (MediaCaptureVideoProfileMediaDescription videoProfileMediaDescription in recordMediaDescription)
    {
        if (videoProfileMediaDescription.IsHdrVideoSupported)
        {
            // We've located the profile and description for HDR Video, set profile and flag
            mediaInitSettings.VideoProfile = profile;
            mediaInitSettings.RecordMediaDescription = videoProfileMediaDescription;
            HdrVideoSupported = true;
            break;
        }
    }

    if (HdrVideoSupported)
    {
        // Profile with HDR support found. Stop looking.
        break;
    }
}

Menentukan apakah perangkat mendukung pengambilan foto dan video secara bersamaan

Banyak perangkat mendukung pengambilan foto dan video secara bersamaan. Untuk menentukan apakah perangkat pengambilan mendukung ini, panggil MediaCapture.FindAllVideoProfiles untuk mendapatkan semua profil kamera yang didukung oleh perangkat. Gunakan kueri tautan untuk menemukan profil yang memiliki setidaknya satu entri untuk SupportedPhotoMediaDescription dan SupportedRecordMediaDescription yang berarti bahwa profil mendukung pengambilan simultan.

var simultaneousPhotoAndVideoSupported = false;

IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(videoDeviceId);

var match = (from profile in profiles
             where profile.SupportedPhotoMediaDescription.Any() &&
             profile.SupportedRecordMediaDescription.Any()
             select profile).FirstOrDefault();

if (match != null)
{
    // Simultaneous photo and video supported
    simultaneousPhotoAndVideoSupported = true;
}
else
{
    // Simultaneous photo and video not supported
    simultaneousPhotoAndVideoSupported = false;
}

Anda dapat menyempurnakan kueri ini untuk mencari profil yang mendukung resolusi tertentu atau kemampuan lain selain rekaman video simultan. Anda juga dapat menggunakan MediaCapture.FindKnownVideoProfiles dan menentukan nilai BalancedVideoAndPhoto untuk mengambil profil yang mendukung pengambilan simultan, tetapi mengkueri semua profil akan memberikan hasil yang lebih lengkap.