Home > Software design >  I want to save a video come from camera as mp4 on wpf
I want to save a video come from camera as mp4 on wpf

Time:03-28

I am trying to save the image from the camera as mp4(etc) on WPF application. But so far I have not been successful. Thanks for your help.

CodePudding user response:

Sorry for my bad english at first.I am receiving the image from the webcam. Below are the codes.

public partial class MainWindow : Window { private FilterInfoCollection cihazlar; private VideoCaptureDevice yakala_resim ; public MainWindow() { InitializeComponent(); cihazlar = new FilterInfoCollection(FilterCategory.VideoInputDevice); foreach (FilterInfo device in cihazlar) { kameralar.Items.Add(device.Name); kameralar.SelectedIndex = 2; } }

    private void Başla_Click(object sender, RoutedEventArgs e)
    {
        yakala_resim = new VideoCaptureDevice(cihazlar[kameralar.SelectedIndex].MonikerString);
        yakala_resim.NewFrame  = Yakala_NewFrame1;
        yakala_resim.Start(); 
    }

    private void Yakala_NewFrame1(object sender, NewFrameEventArgs eventArgs)
    {
        try
        {
            BitmapImage bi;
            using (var bitmap = (Bitmap)eventArgs.Frame.Clone())
            {
                bi = bitmap.ToBitmapImage();
            }
            bi.Freeze();
            Dispatcher.BeginInvoke(new ThreadStart(delegate { video.Source = bi; })); 
        }
        catch (Exception)
        {

            
        }

    }

no problem currently. But I don't know what to do when I want to save the image come from webcam as mp4.

CodePudding user response:

You can use from OpenCvSharp

namespace BlackBears.Recording
{
    using System;
    using System.Drawing;
    using System.Threading;

    using OpenCvSharp;
    using OpenCvSharp.Extensions;

    using Size = OpenCvSharp.Size;

    public class Recorder : IDisposable
    {
        private readonly VideoCaptureAPIs _videoCaptureApi = VideoCaptureAPIs.DSHOW;
        private readonly ManualResetEventSlim _writerReset = new(false);
        private readonly VideoCapture _videoCapture;
        private VideoWriter _videoWriter;
        private Thread _writerThread;

        private bool IsVideoCaptureValid => _videoCapture is not null && _videoCapture.IsOpened();

        public Recorder(int deviceIndex, int frameWidth, int frameHeight, double fps)
        {
            _videoCapture = VideoCapture.FromCamera(deviceIndex, _videoCaptureApi);
            _videoCapture.Open(deviceIndex, _videoCaptureApi);

            _videoCapture.FrameWidth = frameWidth;
            _videoCapture.FrameHeight = frameHeight;
            _videoCapture.Fps = fps;
        }

        /// <inheritdoc />
        public void Dispose()
        {
            GC.SuppressFinalize(this);
            Dispose(true);
        }

        ~Recorder()
        {
            Dispose(false);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                StopRecording();

                _videoCapture?.Release();
                _videoCapture?.Dispose();
            }
        }

        public void StartRecording(string path)
        {
            if (_writerThread is not null)
                return;

            if (!IsVideoCaptureValid)
                ThrowHelper.ThrowVideoCaptureNotReadyException();

            _videoWriter = new VideoWriter(path, FourCC.XVID, _videoCapture.Fps, new Size(_videoCapture.FrameWidth, _videoCapture.FrameHeight));

            _writerReset.Reset();
            _writerThread = new Thread(AddCameraFrameToRecordingThread);
            _writerThread.Start();
        }

        public void StopRecording()
        {
            if (_writerThread is not null)
            {
                _writerReset.Set();
                _writerThread.Join();
                _writerThread = null;
                _writerReset.Reset();
            }

            _videoWriter?.Release();
            _videoWriter?.Dispose();
            _videoWriter = null;
        }

        private void AddCameraFrameToRecordingThread()
        {
            var waitTimeBetweenFrames = (int)(1_000 / _videoCapture.Fps);
            using var frame = new Mat();
            while (!_writerReset.Wait(waitTimeBetweenFrames))
            {
                if (!_videoCapture.Read(frame))
                    return;
                _videoWriter.Write(frame);
            }
        }
    }
}

Recording Video from Webcam with OpenCvSharp - Resulting File playback to fast

  • Related