Mendapatkan bingkai pratinjau

Topik ini menunjukkan kepada Anda cara mendapatkan satu bingkai pratinjau dari aliran pratinjau tangkapan media.

Catatan

Artikel ini didasarkan pada 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. Sebaiknya biasakan diri Anda dengan pola pengambilan media dasar dalam artikel itu sebelum beralih ke skenario pengambilan yang lebih maju. Kode dalam artikel ini mengasumsikan bahwa aplikasi Anda sudah memiliki instance MediaCapture yang telah diinsialisasi dengan benar, dan bahwa Anda memiliki CaptureElement dengan aliran pratinjau video aktif.

Selain ruang nama yang diperlukan untuk pengambilan media dasar, menangkap bingkai pratinjau memerlukan ruang nama berikut.

using Windows.Media;

Saat Anda meminta bingkai pratinjau, Anda dapat menentukan format di mana Anda ingin menerima bingkai dengan membuat objek VideoFrame dengan format yang Anda inginkan. Contoh ini membuat bingkai video yang resolusinya sama dengan aliran pratinjau dengan memanggil VideoDeviceController.GetMediaStreamProperties dan menentukan MediaStreamType.VideoPreview untuk meminta properti untuk aliran pratinjau. Lebar dan tinggi aliran pratinjau digunakan untuk membuat bingkai video baru.

// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

// Create a video frame in the desired format for the preview frame
VideoFrame videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);

Jika objek MediaCapture Anda diinsialisasi dan Anda memiliki aliran pratinjau aktif, hubungi GetPreviewFrameAsync untuk mendapatkan aliran pratinjau. Lewati bingkai video yang dibuat pada langkah terakhir untuk menentukan format bingkai yang dikembalikan.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Dapatkan representasi SoftwareBitmap dari bingkai pratinjau dengan mengakses properti SoftwareBitmap dari objek VideoFrame . Untuk informasi tentang menyimpan, memuat, dan memodifikasi bitmap perangkat lunak, lihat Pencitraan.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Anda juga bisa mendapatkan representasi IDirect3DSurface dari bingkai pratinjau jika Anda ingin menggunakan gambar dengan API Direct3D.

var previewSurface = previewFrame.Direct3DSurface;

Penting

Properti SoftwareBitmap atau properti Direct3DSurface dari VideoFrame yang dikembalikan mungkin null tergantung pada bagaimana Anda memanggil GetPreviewFrameAsync dan juga tergantung pada perangkat tempat aplikasi Anda berjalan.

  • Jika Anda menyebut kelebihan beban GetPreviewFrameAsync yang menerima argumen VideoFrame , VideoFrame yang dikembalikan akan memiliki SoftwareBitmap non-null dan properti Direct3DSurface akan null.
  • Jika Anda menyebut kelebihan beban GetPreviewFrameAsync yang tidak memiliki argumen pada perangkat yang menggunakan permukaan Direct3D untuk mewakili bingkai secara internal, properti Direct3DSurface akan non-null dan properti SoftwareBitmap akan null.
  • Jika Anda menyebut kelebihan beban GetPreviewFrameAsync yang tidak memiliki argumen pada perangkat yang tidak menggunakan permukaan Direct3D untuk mewakili bingkai secara internal, properti SoftwareBitmap akan non-null dan properti Direct3DSurface akan null.

Aplikasi Anda harus selalu memeriksa nilai nol sebelum mencoba mengoperasikan objek yang dikembalikan oleh properti SoftwareBitmap atau Direct3DSurface .

Ketika Anda selesai menggunakan bingkai pratinjau, pastikan untuk memanggil metode Tutupnya (diproyeksikan untuk Buang dalam C #) untuk membebaskan sumber daya yang digunakan oleh bingkai. Atau, gunakan pola penggunaan , yang secara otomatis membuang objek.

previewFrame.Dispose();
previewFrame = null;