stopping media stream source gracefully

630 Views Asked by At

i have implemented media stream source class. I want to stop the camera feed when i click some. what is the right way to close media element and media stream source. so that my app will not crash.

here is my simple code in of my Mainpage.xaml.cs and CamerastreamSource which is derived from MediaStreamSource

MainPage.xaml.cs File code.

 async void MainPage_Loaded(object sender, RoutedEventArgs e) {
        Windows.Foundation.Size size;
        PhotoCaptureDevice m_camera;
        CameraStreamsource m_vf;
        Debug.WriteLine("supported capture resolution:");
        foreach (var i in PhotoCaptureDevice.GetAvailableCaptureResolutions
            (CameraSensorLocation.Back)) {
            Debug.WriteLine(i.Height + "," + i.Width);
        }
        size = PhotoCaptureDevice.GetAvailableCaptureResolutions
            (CameraSensorLocation.Back).First();



        m_camera = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, size);



        // Resolve and set the preview resolution
        Debug.WriteLine("supported preview resolution:");

        size.Width = 640; size.Height = 480; 
        await m_camera.SetPreviewResolutionAsync(size);
        m_vf = new CameraStreamSource(m_camera,this);
         //_mediaElement is the MediaElemet control in MainPage.xaml 
        _mediaElement.SetSource(m_vf);
    }

CameraStreamSource : MediaStreamSource Code

class CameraStreamSource : MediaStreamSource {



     //private AudioVideoCaptureDevice _device;
    public PhotoCaptureDevice _device;
    private long _currentTime;
    private readonly Dictionary<MediaSampleAttributeKeys, string> _emptySampleDict =
        new Dictionary<MediaSampleAttributeKeys, string>();

    //viewfinder display
    private MediaStreamDescription _videoStreamDes;
    private byte[] _byteBuf =null;      
    private MemoryStream _stream;
    MediaStreamSample _sample = null;


    public CameraStreamSource(PhotoCaptureDevice device,MainPage obj)
    {
        mainPage = obj;
        _device = device;

    }

    protected override void GetSampleAsync(MediaStreamType mediaStreamType)
    {
        _device.GetPreviewBufferYCbCr(_byteBuf);
        if (_sample == null)
        {
            _sample = new MediaStreamSample(_videoStreamDes, _stream, 0, _stream.Length, _currentTime, _emptySampleDict);
        }

        ReportGetSampleCompleted(_sample);
    }
    protected override void OpenMediaAsync()
    { 
        // todo
        Dictionary<MediaSourceAttributesKeys, string> mediaSourceAttributes =
            new Dictionary<MediaSourceAttributesKeys, string>();
        Dictionary<MediaStreamAttributeKeys, string> mediaStreamAttributes =
            new Dictionary<MediaStreamAttributeKeys, string>();
        List<MediaStreamDescription> mediaStreamDescriptions =
            new List<MediaStreamDescription>();


        mediaStreamAttributes[MediaStreamAttributeKeys.VideoFourCC] = "YV12";
        mediaStreamAttributes[MediaStreamAttributeKeys.Width] = _device.PreviewResolution.Width.ToString();
        mediaStreamAttributes[MediaStreamAttributeKeys.Height] = _device.PreviewResolution.Height.ToString();

        _videoStreamDes =
            new MediaStreamDescription(MediaStreamType.Video, mediaStreamAttributes);
        mediaStreamDescriptions.Add(_videoStreamDes);

        // a zero timespan is an infinite video
        mediaSourceAttributes[MediaSourceAttributesKeys.Duration] =
            TimeSpan.FromSeconds(0).Ticks.ToString(CultureInfo.InvariantCulture);

        mediaSourceAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString();

        // Report that we finished initializing its internal state and can now
        // pass in frame samples.
        ReportOpenMediaCompleted(mediaSourceAttributes, mediaStreamDescriptions);

        _byteBuf = new byte[(int)((_device.PreviewResolution.Width * _device.PreviewResolution.Height) * 1.5)];

        _stream = new MemoryStream(_byteBuf);


    }

    protected override void SeekAsync(long seekToTime)
    {
        // todo
        _currentTime = seekToTime;
        ReportSeekCompleted(seekToTime);
    }


    protected override void CloseMedia() {

        // No implementation required

    }
    protected override void GetDiagnosticAsync(MediaStreamSourceDiagnosticKind diagnosticKind) {
        throw new NotImplementedException();
    }

    protected override void SwitchMediaStreamAsync(MediaStreamDescription mediaStreamDescription) {
        throw new NotImplementedException();
    }

Can any bode help me that how i can close that on some like button click gracefully. i actually need the code to close the MediaElement and MediaStreamSource gracefully

0

There are 0 best solutions below