Extrahieren von Frames aus Video-und C#
Ich versuche zu machen, eine app, die die Kamera verwenden, um ein video aufzunehmen und zu verarbeiten, die Bilder von dem video. Hier ist, was ich will. Zuerst, meine app erfasst eine 10-Sekunden-video mit Fackel. Zweitens verwende ich eine Methode, um die Wiedergabe der video, um zu sehen, was ich aufnehme.
Bin ich stecken auf drei Dinge.
- Wie kann ich meine konvertieren video in einzelne frames (Bilder)?
- Ist es möglich, asynchron konvertieren Sie das video, während es aufgezeichnet wird?
- Wenn ich tun, konvertieren Sie das video in einzelne frames, wie kann ich mit Ihnen arbeiten? Sind Sie JPEGs? Kann ich einfach die Anzeige als Bilder? Etc.
Haupt-code:
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace App3
{
public sealed partial class MainPage : Page
{
DispatcherTimer D;
double basetimer = 0;
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
D = new DispatcherTimer();
D.Interval = new TimeSpan(0, 0, 1);
D.Tick += timer_Tick;
txt.Text = basetimer.ToString();
Play.IsEnabled = false;
}
public Library Library = new Library();
public object PreviewImage { get; private set; }
void timer_Tick(object sender, object e)
{
basetimer = basetimer - 1;
txt.Text = basetimer.ToString();
if (basetimer == 0)
{
D.Stop();
Preview.Source = null;
Library.Stop();
Record.IsEnabled = false;
Play.IsEnabled = true;
Clear.IsEnabled = true;
if (Library._tc.Enabled)
{
Library._tc.Enabled = false;
}
}
}
private void Record_Click(object sender, RoutedEventArgs e)
{
if (Library.Recording)
{
Preview.Source = null;
Library.Stop();
Record.Icon = new SymbolIcon(Symbol.Video);
}
else
{
basetimer = 11;
D.Start();
//D.Tick += timer_Tick;
Display.Source = null;
Library.Record(Preview);
Record.Icon = new SymbolIcon(Symbol.VideoChat);
Record.IsEnabled = false;
Play.IsEnabled = false;
}
}
private async void Play_Click(object sender, RoutedEventArgs e)
{
await Library.Play(Dispatcher, Display);
//Extract_Image_From_Video(Library.buffer);
}
private void Clear_Click(object sender, RoutedEventArgs e)
{
Display.Source = null;
Record.Icon = new SymbolIcon(Symbol.Video);
txt.Text = "0";
basetimer= 0;
Play.IsEnabled = false;
Record.IsEnabled =true;
if (Library.capture != null)
{
D.Stop();
Library.Recording = false;
Preview.Source = null;
Library.capture.Dispose();
Library.capture = null;
basetimer = 11;
}
}
}
}
Bibliothek-Klasse:
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Media.Capture;
using Windows.Media.Devices;
using Windows.Media.MediaProperties;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Graphics.Imaging;
using Emgu.CV.Structure;
using Emgu.CV;
using System.Collections.Generic;
public class Library
{
private const string videoFilename = "video.mp4";
private string filename;
public MediaCapture capture;
public InMemoryRandomAccessStream buffer;
public static bool Recording;
public TorchControl _tc;
public int basetimer ;
public async Task<bool> init()
{
if (buffer != null)
{
buffer.Dispose();
}
buffer = new InMemoryRandomAccessStream();
if (capture != null)
{
capture.Dispose();
}
try
{
if (capture == null)
{
var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
DeviceInformation cameraDevice =
allVideoDevices.FirstOrDefault(x => x.EnclosureLocation != null &&
x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back);
capture = new MediaCapture();
var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };
//Initialize
try
{
await capture.InitializeAsync(mediaInitSettings);
var videoDev = capture.VideoDeviceController;
_tc = videoDev.TorchControl;
Recording = false;
_tc.Enabled = false;
}
catch (UnauthorizedAccessException)
{
Debug.WriteLine("UnauthorizedAccessExeption>>");
}
catch (Exception ex)
{
Debug.WriteLine("Exception when initializing MediaCapture with {0}: {1}", cameraDevice.Id, ex.ToString());
}
}
capture.Failed += (MediaCapture sender, MediaCaptureFailedEventArgs errorEventArgs) =>
{
Recording = false;
_tc.Enabled = false;
throw new Exception(string.Format("Code: {0}. {1}", errorEventArgs.Code, errorEventArgs.Message));
};
}
catch (Exception ex)
{
if (ex.InnerException != null && ex.InnerException.GetType() == typeof(UnauthorizedAccessException))
{
throw ex.InnerException;
}
throw;
}
return true;
}
public async void Record(CaptureElement preview)
{
await init();
preview.Source = capture;
await capture.StartPreviewAsync();
await capture.StartRecordToStreamAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), buffer);
if (Recording) throw new InvalidOperationException("cannot excute two records at the same time");
Recording = true;
_tc.Enabled = true;
}
public async void Stop()
{
await capture.StopRecordAsync();
Recording = false;
_tc.Enabled = false;
}
public async Task Play(CoreDispatcher dispatcher, MediaElement playback)
{
IRandomAccessStream video = buffer.CloneStream();
if (video == null) throw new ArgumentNullException("buffer");
StorageFolder storageFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
if (!string.IsNullOrEmpty(filename))
{
StorageFile original = await storageFolder.GetFileAsync(filename);
await original.DeleteAsync();
}
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
StorageFile storageFile = await storageFolder.CreateFileAsync(videoFilename, CreationCollisionOption.GenerateUniqueName);
filename = storageFile.Name;
using (IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
{
await RandomAccessStream.CopyAndCloseAsync(video.GetInputStreamAt(0), fileStream.GetOutputStreamAt(0));
await video.FlushAsync();
video.Dispose();
}
IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
playback.SetSource(stream, storageFile.FileType);
playback.Play();
});
}
InformationsquelleAutor Ahmed | 2016-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich dachte mir, diese erst gestern.
Hier ist voll und leicht zu verstehen, beispielsweise mit dem aufnehmen von video-Datei und speichern snapshot in der 1. Sekunde des Videos.
Können Sie nehmen Teile, die passt zu Ihrem Projekt und einige von Ihnen ändern (d.h. video-Auflösung von der Kamera)
1) und 3)
Wenn Sie möchten, die Anzeige von frames in xaml-Bild verwenden, sollten Sie imageStream
Wenn Sie möchten, zu extrahieren, mehr frames, es ist auch
composition.GetThumbnailsAsync
2) Verwenden Sie Ihre mediaCapture, wenn Sie Ihre timer tickt
InMemoryRandomAccessStream buffer
, ist es ein Weg, um zu konvertierenInMemoryRandomAccessStream buffer
zustoregfile
dann kann ich die vielleicht verwenden ? Danke für die Hilfe.Sie haben MediaCapture-Objekt aus, wenn im Aufnahme-Methode, und offensichtlich Storage-Datei in der Play-Methode. Was nicht funktioniert?
Wenn Sie dies nutzen wollen, in einem standard .net-desktop-Anwendung, befolgen Sie diese Schritte, github.com/jbe2277/waf/wiki/...
Um videometa Daten kann man verwenden, anstatt die in den obigen code var props = erwarten pickedFile.Eigenschaften.GetVideoPropertiesAsync(); uint frameHeight = props.Höhe; uint frameWidth = props.Breite; var videolength = props.Dauer;
Ich kann nicht zählen die Widows.Media.Editing.dll fand ich in den WIndows-Ordner. VS sagt, dass kann es nicht zählen, weil das keine gültige Assembly oder COM. Wie genau kann ich die Klassen, die verwendet wurden, hier?
InformationsquelleAutor Alamakanambra
Landete ich mit MediaToolkit zu lösen ein ähnliches problem, nachdem eine Tonne von Schwierigkeiten mit Accord.
Ich brauchte, um ein Bild für jede Sekunde video:
Hoffe, dies hilft jemand einige Tag.
InformationsquelleAutor Brendan Kendrick
Verwenden Sie ffmpeg http://ffmpeg.org/
Das sieht aus wie Accord.net, die jetzt absorbiert Aforge. Eine Sache zu beachten ist, dass es ist veröffentlicht unter der GPL.
InformationsquelleAutor juan_dvd