2016-04-13 32 views
2

Windows belgeleri neden bu kadar eksik? Yöntem ne yapmaya çalışıyorum (MediaCapture yoluyla) bir video kaynağından bir önizleme resmi olsun StartPreviewToCustomSinkAsyncMediaCapture.StartPreviewToCustomSinkAsync yöntemi nasıl çalışır?

çalışmak gerekiyordu nasıl bir örnek bulmak imkansız görünüyor ama özellikle (bu yöntem nasıl çalıştığını anlayamıyorum Ne ikinci parametre, IMediaExtension, olması gerektiği/yapılmalıdır.

Herhangi biriniz bana bu konuda yardımcı olabilir misiniz?

cevap

1

sağlaması koda benzer olmalıdır Microsoft github sayfasında bir örnek olduğunu ilgili olsa da, Windows 10'u hedefleseler de. Bu işlevi elde etmek için projenizi taşımakla ilgilenebilirsiniz.

GetPreviewFrame: Bu örnek, tam olarak üflenmiş fotoğrafların karşısındaki önizleme karelerini yakalayacaktır. Bir önizleme karesi olduğunda, üzerindeki pikselleri düzenleyebilir.

İşte alakalı parçasıdır:

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

    // Create the video frame to request a SoftwareBitmap preview frame 
    var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height); 

    // Capture the preview frame 
    using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame)) 
    { 
     // Collect the resulting frame 
     SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap; 

     // Add a simple green filter effect to the SoftwareBitmap 
     EditPixels(previewFrame); 
    } 
} 

private unsafe void EditPixels(SoftwareBitmap bitmap) 
{ 
    // Effect is hard-coded to operate on BGRA8 format only 
    if (bitmap.BitmapPixelFormat == BitmapPixelFormat.Bgra8) 
    { 
     // In BGRA8 format, each pixel is defined by 4 bytes 
     const int BYTES_PER_PIXEL = 4; 

     using (var buffer = bitmap.LockBuffer(BitmapBufferAccessMode.ReadWrite)) 
     using (var reference = buffer.CreateReference()) 
     { 
      // Get a pointer to the pixel buffer 
      byte* data; 
      uint capacity; 
      ((IMemoryBufferByteAccess)reference).GetBuffer(out data, out capacity); 

      // Get information about the BitmapBuffer 
      var desc = buffer.GetPlaneDescription(0); 

      // Iterate over all pixels 
      for (uint row = 0; row < desc.Height; row++) 
      { 
       for (uint col = 0; col < desc.Width; col++) 
       { 
        // Index of the current pixel in the buffer (defined by the next 4 bytes, BGRA8) 
        var currPixel = desc.StartIndex + desc.Stride * row + BYTES_PER_PIXEL * col; 

        // Read the current pixel information into b,g,r channels (leave out alpha channel) 
        var b = data[currPixel + 0]; // Blue 
        var g = data[currPixel + 1]; // Green 
        var r = data[currPixel + 2]; // Red 

        // Boost the green channel, leave the other two untouched 
        data[currPixel + 0] = b; 
        data[currPixel + 1] = (byte)Math.Min(g + 80, 255); 
        data[currPixel + 2] = r; 
       } 
      } 
     } 
    } 
} 

Ve sınıfının dışında bu beyan:

[ComImport] 
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
unsafe interface IMemoryBufferByteAccess 
{ 
    void GetBuffer(out byte* buffer, out uint capacity); 
} 

Ve tabii ki, proje çalışması için tüm bu güvensiz kod izin gerekecektir.

Tüm ayrıntıların nasıl alınacağını görmek için örneğe daha yakından bakın. Ya da, bir izlenim yapmak için, bazı kamera örneklerinde biraz gezinme gerektiren yeni bir // inşa/konferanstan camera session'u izleyebilirsiniz. Eğer 8,1 bağlısın Alternatif

, hangi notify you when there's a new preview frame available can, Lumia Imaging SDK içine bakabilirsiniz.

+0

Zaten sahip olduğum kodu saklamak istedim ve Lumia Imaging SDK kullanmıyordum ama WP 8.1'i de hedeflediğim için kullanıyorum. Teşekkürler – Moucheg

+0

Bu örnek bile 'StartPreviewToCustomSinkAsync' işlevini içermez. Hala nasıl kullanılacağını henüz bilmiyorum. – ThoAppelsin

1

GitHub'da çok fazla örnek vardır. Windows Phone 8.1 için geliştiriyorsanız - numuneler here
this örnek kayıt bu gibi bakarak göre şunlardır:

private StspMediaSinkProxy mediaSink; 
mediaSink = new StspMediaSinkProxy(); 

MediaEncodingProfile encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Qvga); 

var mfExtension = await mediaSink.InitializeAsync(encodingProfile.Audio, encodingProfile.Video); 
await mediaCapture.StartRecordToCustomSinkAsync(encodingProfile, mfExtension); 

Yani, bu örnekten MediaEncodingProfile gelen IMediaExtension nasıl anlayabiliriz.
herhangi kod sonrası değil, ama Önizleme yapma ben tek ihtiyacınız her şimdi ve sonra bir önizleme karesini almak için ise