Mendapatkan bingkai pratinjau

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

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, dan Anda memiliki CaptureElement dengan aliran pratinjau video aktif.

Selain namespace layanan yang diperlukan untuk pengambilan media dasar, menangkap bingkai pratinjau memerlukan namespace layanan berikut.

using Windows.Media;

Saat meminta bingkai pratinjau, Anda dapat menentukan format tempat Anda ingin menerima bingkai dengan membuat objek VideoFrame dengan format yang Anda inginkan. Contoh ini membuat bingkai video dengan resolusi yang 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 diinisialisasi dan Anda memiliki aliran pratinjau aktif, panggil GetPreviewFrameAsync untuk mendapatkan aliran pratinjau. Teruskan 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 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 cara Anda memanggil GetPreviewFrameAsync dan juga tergantung pada perangkat tempat aplikasi Anda berjalan.

  • Jika Anda memanggil kelebihan beban GetPreviewFrameAsync yang menerima argumen VideoFrame , VideoFrame yang dikembalikan akan memiliki SoftwareBitmap non-null dan properti Direct3DSurface akan null.
  • Jika Anda memanggil 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 memanggil 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 null sebelum mencoba mengoperasikan objek yang dikembalikan oleh properti SoftwareBitmap atau Direct3DSurface .

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

previewFrame.Dispose();
previewFrame = null;