Kontrol kamera manual untuk pengambilan video

Artikel ini menunjukkan kepada Anda cara menggunakan kontrol perangkat manual untuk mengaktifkan skenario pengambilan video yang disempurnakan, termasuk video HDR dan prioritas paparan.

Kontrol perangkat video yang dibahas dalam artikel ini semuanya ditambahkan ke aplikasi Anda dengan menggunakan pola yang sama. Pertama, periksa untuk melihat apakah kontrol didukung pada perangkat saat ini tempat aplikasi Anda berjalan. Jika kontrol didukung, atur mode yang diinginkan untuk kontrol. Biasanya, jika kontrol tertentu tidak didukung pada perangkat saat ini, Anda harus menonaktifkan atau menyembunyikan elemen UI yang memungkinkan pengguna untuk mengaktifkan fitur tersebut.

Semua API kontrol perangkat yang dibahas dalam artikel ini adalah anggota namespace layanan Windows.Media.Devices .

using Windows.Media.Devices;

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. Kami menyarankan 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.

Video HDR

Fitur video rentang dinamis tinggi (HDR) menerapkan pemrosesan HDR ke aliran video perangkat pengambilan. Tentukan apakah video HDR didukung dengan memilih properti HdrVideoControl.Supported .

Kontrol video HDR mendukung tiga mode: aktif, nonaktif, dan otomatis, yang berarti bahwa perangkat secara dinamis menentukan apakah pemrosesan video HDR akan meningkatkan pengambilan media dan, jika demikian, memungkinkan video HDR. Untuk menentukan apakah mode tertentu didukung pada perangkat saat ini, periksa untuk melihat apakah koleksi HdrVideoControl.SupportedModes berisi mode yang diinginkan.

Aktifkan atau nonaktifkan pemrosesan video HDR dengan mengatur HdrVideoControl.Mode ke mode yang diinginkan. Kontrol ini mengharuskan aliran berada pada status berhenti sebelum mode diatur, lihat KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.

private void SetHdrVideoMode(HdrVideoMode mode)
{
    if (!_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
    {
        ShowMessageToUser("HDR Video not available");
        return;
    }

    var hdrVideoModes = _mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;

    if (!hdrVideoModes.Contains(mode))
    {
        ShowMessageToUser("HDR Video setting not supported");
        return;
    }

    _mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}

Prioritas paparan

ExposurePriorityVideoControl, saat diaktifkan, mengevaluasi bingkai video dari perangkat pengambilan untuk menentukan apakah video menangkap adegan cahaya rendah. Jika demikian, kontrol menurunkan kecepatan bingkai video yang diambil untuk meningkatkan waktu paparan untuk setiap bingkai dan meningkatkan kualitas visual video yang diambil.

Tentukan apakah kontrol prioritas paparan didukung pada perangkat saat ini dengan memeriksa properti ExposurePriorityVideoControl.Supported .

Aktifkan atau nonaktifkan kontrol prioritas paparan dengan mengatur ExposurePriorityVideoControl.Enabled ke mode yang diinginkan.

if (!_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
    ShowMessageToUser("Exposure priority not available");
    return;
}
_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;

Penghanti temporal

Dimulai dengan Windows 10, versi 1803, Anda dapat mengaktifkan penghinaan temporal untuk video di perangkat yang mendukungnya. Fitur ini menggabungkan data gambar dari beberapa bingkai yang berdekatan secara real time untuk menghasilkan bingkai video yang memiliki lebih sedikit kebisingan visual.

VideoTemporalDenoisingControl memungkinkan aplikasi Anda menentukan apakah penghancur temporal didukung pada perangkat saat ini, dan jika demikian, mode denoising mana yang didukung. Mode pengnonaktifkan yang tersedia adalah Nonaktif, Aktif, dan Otomatis. Perangkat mungkin tidak mendukung semua mode, tetapi setiap perangkat harus mendukung Otomatis atau Aktif dan Nonaktif.

Contoh berikut menggunakan UI sederhana untuk menyediakan tombol radio yang memungkinkan pengguna untuk beralih di antara mode denoising.

<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
    <StackPanel x:Name="denoiseControls" Visibility="Collapsed">
        <TextBlock>Temporal Denoising</TextBlock>
        <RadioButton x:Name="denoiseOffButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="Off"/>
        <RadioButton x:Name="denoiseOnButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
        <RadioButton x:Name="denoiseAutoButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
    </StackPanel>
</StackPanel>

Dalam metode berikut, properti VideoTemporalDenoisingControl.Supported diperiksa untuk melihat apakah penghapusan sementara didukung sama sekali pada perangkat saat ini. Jika demikian, maka kami memeriksa untuk memastikan bahwa Nonaktif dan Otomatis atau Aktif didukung, dalam hal ini kami membuat tombol radio kami terlihat. Selanjutnya, tombol Otomatis dan Aktif dibuat terlihat jika metode tersebut didukung.

private void UpdateDenoiseCapabilities()
{
    if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
         IReadOnlyList<VideoTemporalDenoisingMode> modes = _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes;
        if(modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off) &&
           (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On) || 
           modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto)))
        {
            denoiseControls.Visibility = Visibility.Visible;

            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
            {
                denoiseOnButton.Visibility = Visibility.Visible;
            }
            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
            {
                denoiseAutoButton.Visibility = Visibility.Visible;
            }
        }
    }
}

Di penanganan aktivitas yang diperiksa untuk tombol radio, nama tombol dicentang dan mode yang sesuai diatur dengan mengatur properti VideoTemporalDenoisingControl.Mode .

private void denoiseButton_Checked(object sender, RoutedEventArgs e)
{
    var button = sender as RadioButton;
    if(button.Name == "denoiseOffButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
    }
    else if (button.Name == "denoiseOnButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
    }
    else if (button.Name == "denoiseAutoButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
    }
}

Menonaktifkan denoisasi temporal saat memproses bingkai

Video yang telah diproses menggunakan penghangu temporal dapat lebih menyenangkan mata manusia. Namun, karena denoisasi temporal dapat memengaruhi konsistensi gambar dan mengurangi jumlah detail dalam bingkai, aplikasi yang melakukan pemrosesan gambar pada bingkai, seperti pendaftaran atau pengenalan karakter optik, mungkin ingin menonaktifkan denoising secara terprogram saat pemrosesan gambar diaktifkan.

Contoh berikut menentukan mode denoising mana yang didukung dan menyimpan informasi ini di beberapa variabel kelas.

private bool _isVideoTemporalDenoisingOffSupported = false;
private bool _isProcessing = false;
private Windows.Media.Devices.VideoTemporalDenoisingMode? _videoDenoisingEnabledMode = null;
private void ConfigureDenoiseForFrameProcessing()
{
    if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
        // Query support for the VideoTemporalDenoising control Off mode
        _isVideoTemporalDenoisingOffSupported = _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off);

        // Query support for a mode that would enable VideoTemporalDenoising (On or Auto) and toggle it if supported
        if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
            _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
        else if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
            _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
    }

}

Saat aplikasi mengaktifkan pemrosesan bingkai, aplikasi mengatur mode denoising ke Nonaktif jika mode tersebut didukung sehingga pemrosesan bingkai dapat menggunakan bingkai mentah yang belum dinonaktifkan.

public void EnableFrameProcessing()
{
    // Toggle Off VideoTemporalDenoising
    if (_isVideoTemporalDenoisingOffSupported)
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
    }

    _isProcessing = true;
}

Saat aplikasi menonaktifkan rangka prcessing, aplikasi mengatur mode denoising ke Aktif atau Otomatis, bergantung pada mode mana yang didukung.

public void DisableFrameProcessing()
{
    _isProcessing = false;

    // If a VideoTemporalDenoising mode to enable VideoTemporalDenoising is supported, toggle it
    if (_videoDenoisingEnabledMode != null)
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
    }
}

Untuk informasi selengkapnya tentang mendapatkan bingkai video untuk pemrosesan gambar, lihat Memproses bingkai media dengan MediaFrameReader.