Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede MediaCapture sınıfını kullanarak fotoğraf ve video yakalamanın en basit yolu gösterilmektedir. MediaCapture sınıfı, yakalama işlem hattı üzerinde alt düzey denetim sağlayan ve gelişmiş yakalama senaryolarını etkinleştiren güçlü bir API kümesi sunar, ancak bu makale, uygulamanıza hızlı ve kolay bir şekilde temel medya yakalama eklemenize yardımcı olmak için tasarlanmıştır. MediaCapture'ın sağladığı özellikler hakkında daha fazla bilgi edinmek için bkz. Kamera.
MediaCapture nesnesini başlatma
Bu makalede açıklanan tüm yakalama yöntemleri , MediaCapture nesnesini başlatmanın ilk adımını gerektirir. Bu, nesnenin örneğini oluşturmayı, yakalama cihazını seçmeyi, başlatma parametrelerini ayarlamayı ve ardından InitializeAsync'i çağırmayı içerir. Genellikle kamera uygulamaları , MediaPlayerElement kullanarak kullanıcı arabiriminde fotoğraf veya video çekerken kamera önizlemesini görüntüler. MediaCapture'ı başlatma ve önizlemeyi XAML kullanıcı arabiriminde gösterme yönergeleri için bkz. WinUI uygulamasında kamera önizlemesini gösterme. Bu makaledeki kod örneklerinde, başlatılan bir MediaCapture örneğinin zaten oluşturulduğu varsayılır.
SoftwareBitmap'e fotoğraf yakalama
SoftwareBitmap sınıfı, birden çok özellik arasında görüntülerin ortak bir gösterimini sağlar. Bir fotoğraf yakalamak ve ardından yakalanan görüntüyü bir dosyaya yakalamak yerine XAML'de görüntüleme gibi uygulamanızda hemen kullanmak istiyorsanız, bir SoftwareBitmap'e yakalamanız gerekir. Görüntüyü daha sonra diske kaydetme seçeneğiniz devam ediyor.
LowLagPhotoCapture sınıfını kullanarak SoftwareBitmap'e fotoğraf çekin. PrepareLowLagPhotoCaptureAsync çağrısı yaparak, istediğiniz görüntü biçimini belirten bir ImageEncodingProperties nesnesi geçirerek bu sınıfın bir örneğini alın. CreateUncompressed, belirtilen piksel biçimine sahip sıkıştırılmamış bir kodlama oluşturur. CaptureAsync'i çağırarak fotoğraf yakalamayı başlatın, bu da bir CapturedPhoto nesnesi döndürür. Frameözelliğine ve ardından SoftwareBitmap özelliğine erişerek bir SoftwareBitmap alın.
CaptureAsync'i tekrar tekrar çağırarak birden çok fotoğraf yakalayabilirsiniz. Yakalamayı bitirdiğinizde, LowLagPhotoCapture oturumunu kapatmak ve ilişkili kaynakları boşaltmak için FinishAsync'i çağırın. FinishAsync'i çağırdıktan sonra, fotoğraf yakalamaya yeniden başlamak için CaptureAsync'i çağırmadan önce yakalama oturumunu yeniden başlatmak için PrepareLowLagPhotoCaptureAsync'i yeniden çağırmanız gerekir.
// Prepare and capture photo
var lowLagCapture = await m_mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
var capturedPhoto = await lowLagCapture.CaptureAsync();
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
// Capture more photos, if desired.
// Then call FinishAsync to clean up resources
await lowLagCapture.FinishAsync();
Bellek akışına fotoğraf kaydetme
MediaCapture'ı kullanarak bir fotoğrafı bellek içi bir akışa yakalayabilirsiniz. Bunu kullanarak fotoğrafı akıştan diskteki bir dosyaya kodlayabilirsiniz.
Akışa fotoğraf çekmek için bir InMemoryRandomAccessStream oluşturun ve ardından CapturePhotoToStreamAsync çağrısında bulunarak akışa ve kullanılacak görüntü formatını belirten bir ImageEncodingProperties nesnesi iletin. Nesneyi kendiniz başlatarak özel kodlama özellikleri oluşturabilirsiniz, ancak sınıfı yaygın kodlama biçimleri için ImageEncodingProperties.CreateJpeg gibi statik yöntemler sağlar.
Bellek akışındaki görüntünün kodunu çözmek için bir BitmapDecoder oluşturun. CreateForTranscodingAsync çağrısı yaparak görüntüyü dosyaya kodlamak için bir BitmapEncoder oluşturun.
İsteğe bağlı olarak bir BitmapPropertySet nesnesi oluşturabilir ve ardından görüntü dosyasına fotoğraf hakkındaki meta verileri eklemek için görüntü kodlayıcıda SetPropertiesAsync'i çağırabilirsiniz. Kodlama özellikleri hakkında daha fazla bilgi için bkz. Görüntü meta verileri.
Son olarak, fotoğrafı bellek içi akıştan dosyaya kodlamak için kodlayıcı nesnesinde FlushAsync'i çağırın.
// Prepare and capture photo
var lowLagCapture = await m_mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
var capturedPhoto = await lowLagCapture.CaptureAsync();
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
// Capture more photos, if desired.
// Then call FinishAsync to clean up resources
await lowLagCapture.FinishAsync();
Video yakalama
LowLagMediaRecording sınıfını kullanarak uygulamanıza hızlı bir şekilde video yakalama ekleyin.
İlk olarak, LowLagMediaRecording nesnesinin video kaydı sırasında kalıcı olması gerekir, bu nedenle bu nesne için bir sınıf değişkeni bildirin.
LowLagMediaRecording m_mediaRecording;
Medya kaydını başlatmak için PrepareLowLagRecordToStorageFileAsync çağrısı yapın, video için kodlamayı belirten storage dosyasını ve MediaEncodingProfile nesnesini geçirme. sınıfı, ortak video kodlama profilleri oluşturmak için CreateMp4 gibi statik yöntemler sağlar. Video yakalamaya başlamak için StartAsync'i arayın.
var myVideos = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Videos);
StorageFile file = await myVideos.SaveFolder.CreateFileAsync("video.mp4", CreationCollisionOption.GenerateUniqueName);
m_mediaRecording = await m_mediaCapture.PrepareLowLagRecordToStorageFileAsync(
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), file);
m_mediaCapture.RecordLimitationExceeded += m_mediaCapture_RecordLimitationExceeded;
await m_mediaRecording.StartAsync();
Video kaydını durdurmak için StopAsync'i arayın.
await m_mediaRecording.StopAsync();
Ek videolar yakalamak için StartAsync ve StopAsync'i çağırmaya devam edebilirsiniz. Videoları yakalamayı bitirdiğinizde, yakalama oturumunu atmak ve ilişkili kaynakları temizlemek için FinishAsync'i çağırın. Bu çağrıdan sonra, StartAsync'i çağırmadan önce yakalama oturumunu yeniden başlatmak için PrepareLowLagRecordToStorageFileAsync öğesini yeniden çağırmanız gerekir.
await m_mediaRecording.FinishAsync();
Video yakalarken, MediaCapture nesnesinin RecordLimitationExceeded olayı için bir işleyici kaydetmeniz gerekir. Bu olay, şu anda üç saat olan tek bir kayıt için sınırı aştığınızda işletim sistemi tarafından yükseltilir. Olayın işleyicisinde , StopAsync'i çağırarak kaydınızı son haline dönüştürmelisiniz.
private async void m_mediaCapture_RecordLimitationExceeded(MediaCapture sender)
{
await m_mediaRecording.StopAsync();
DispatcherQueue.TryEnqueue(() =>
{
tbStatus.Text = "Record limitation exceeded.";
});
}
PauseAsync'i ve ardından ResumeAsync'i çağırarak ayrı bir çıkış dosyası oluşturmadan bir video kaydını duraklatabilir ve kaydı sürdürebilirsiniz.
await m_mediaRecording.PauseAsync(Windows.Media.Devices.MediaCapturePauseBehavior.ReleaseHardwareResources);
await m_mediaRecording.ResumeAsync();
PauseWithResultAsync çağrısı bir MediaCapturePauseResult nesnesi döndürür. LastFrame özelliği, son kareyi temsil eden bir VideoFrame nesnesidir. Çerçeveyi XAML'de görüntülemek için video çerçevesinin SoftwareBitmap gösterimini alın. Şu anda, yalnızca önceden yüklenmiş veya boş alfa kanalına sahip BGRA8 biçimindeki görüntüler desteklenir, bu nedenle doğru biçimi almak için gerekirse Dönüştür'ü çağırın. PauseWithResultAsync , toplam ne kadar süre kaydedildiğini izlemeniz gerektiğinde önceki segmentte kaydedilen videonun süresini de döndürür.
Ayrıca StopWithResultAsync çağrısı yaparak videoyu durdurduğunuzda bir sonuç çerçevesi alabilirsiniz.
Yakalanan video dosyalarını oynatma ve düzenleme
Bir dosyaya video yakaladıkta, dosyayı yükleyip uygulamanızın kullanıcı arabiriminde oynatmak isteyebilirsiniz. Bunu MediaPlayerElement XAML denetimini ve ilişkili bir MediaPlayer'ı kullanarak yapabilirsiniz. XAML sayfasında medya yürütme hakkında bilgi için bkz. MediaPlayer ile ses ve video yürütme.
CreateFromFileAsync'i çağırarak bir video dosyasından MediaClip nesnesi de oluşturabilirsiniz. MediaComposition, MediaClip nesnelerinin sırasını düzenleme, video uzunluğunu kırpma, katman oluşturma, arka plan müziği ekleme ve video efektleri uygulama gibi temel video düzenleme işlevleri sağlar. Medya bileşimleriyle çalışma hakkında daha fazla bilgi için bkz. Medya kompozisyonları ve düzenleme.
Ses yakalama
Video yakalamak için yukarıda gösterilen tekniği kullanarak uygulamanıza hızlı bir şekilde ses yakalama ekleyebilirsiniz. Yakalama oturumunu başlatmak için PrepareLowLagRecordToStorageFileAsync öğesini çağırın. Bu örnekte, dosyayı ve CreateMp3 statik yöntemi tarafından oluşturulan bir MediaEncodingProfile geçirin. Kayda başlamak için StartAsync'i arayın.
m_mediaCapture.RecordLimitationExceeded += m_mediaCapture_RecordLimitationExceeded;
var myVideos = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Videos);
StorageFile file = await myVideos.SaveFolder.CreateFileAsync("audio.mp3", CreationCollisionOption.GenerateUniqueName);
m_mediaRecording = await m_mediaCapture.PrepareLowLagRecordToStorageFileAsync(
MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High), file);
await m_mediaRecording.StartAsync();
Ses kaydını durdurmak için StopAsync'i arayın.
await m_mediaRecording.StopAsync();
Birkaç ses dosyası kaydetmek için StartAsync ve StopAsync'i birden çok kez çağırabilirsiniz. Ses yakalamayı bitirdiğinizde, yakalama oturumunu atmak ve ilişkili kaynakları temizlemek için FinishAsync'i arayın. Bu çağrıdan sonra, StartAsync'i çağırmadan önce yakalama oturumunu yeniden başlatmak için PrepareLowLagRecordToStorageFileAsync öğesini yeniden çağırmanız gerekir.
Sistemin ses yakalama akışının ses düzeyini ne zaman değiştirdiğini algılama hakkında bilgi için bkz. Sistem tarafından yapılan ses düzeyi değişikliklerini algılama ve yanıtlama.
Windows developer