Anda di halaman 1dari 5

10/2/2019 Extraer marcos de video C # - Desbordamiento de pila

Pregunta

Estoy tratando de hacer una aplicación que use la cámara para


grabar un video y procesar las imágenes del video. Esto es lo
que quiero. Primero, mi aplicación graba un video de 10
3 segundos con Torch. Segundo, uso un método para reproducir el
video para ver lo que grabo.

Estoy atascado en tres cosas.


6
1. ¿Cómo puedo convertir mi video en cuadros individuales
(imágenes)?
2. ¿Es posible convertir asíncronamente el video mientras se
está grabando?
3. Cuando convierto el video en cuadros individuales, ¿cómo
trabajo con ellos? ¿Son JPEG? ¿Puedo simplemente
mostrarlos como imágenes? Etc.

Código principal:

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.Requ
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;

Clase de biblioteca

https://stackoverflow.com/questions/35380868/extract-frames-from-video-c-sharp 1/5
10/2/2019 Extraer marcos de video C # - Desbordamiento de pila

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)

c# video -procesamiento de imágenes win-universal-app

compartir mejorar esta pregunta Editado el 15 de octubre de 18 a 1:51


CyanCoding
452 2 22

preguntó 13 de febrero de 16 a las 14:04


Ahmed
18 1 1 4
añadir un comentario

3 respuestas votos más antiguos activos

Me di cuenta de esto ayer.

Este es un ejemplo completo y fácil de entender con la selección


5 de un archivo de video y el almacenamiento de instantáneas en
el primer segundo del video.

Puede tomar partes que se ajusten a su proyecto y cambiar


algunas de ellas (es decir, obtener resolución de video de la
https://stackoverflow.com/questions/35380868/extract-frames-from-video-c-sharp 2/5
10/2/2019 Extraer marcos de video C # - Desbordamiento de pila

cámara)

1) y 3)

TimeSpan timeOfFrame = new TimeSpan(0, 0, 1);

//pick mp4 file


var picker = new Windows.Storage.Pickers.FileOpenP
picker.SuggestedStartLocation = Windows.Storage.Pi
picker.FileTypeFilter.Add(".mp4");
StorageFile pickedFile = await picker.PickSingleFi
if (pickedFile == null)
{
return;
}
///

//Get video resolution


List<string> encodingPropertiesToRetrieve = new Li
encodingPropertiesToRetrieve.Add("System.Video.Fra
encodingPropertiesToRetrieve.Add("System.Video.Fra
IDictionary<string, object> encodingProperties = a
uint frameHeight = (uint)encodingProperties["Syste
uint frameWidth = (uint)encodingProperties["System
///

//Use Windows.Media.Editing to get ImageStream


var clip = await MediaClip.CreateFromFileAsync(pic
var composition = new MediaComposition();
composition.Clips.Add(clip);

var imageStream = await composition.GetThumbnailAs


///

//generate bitmap
var writableBitmap = new WriteableBitmap((int)fram
writableBitmap.SetSource(imageStream);

Si desea mostrar marcos en imagen xaml, debe usar


imageStream

BitmapImage bitmapImage = new BitmapImage();


bitmapImage.SetSource(imageStream);

XAMLImage.Source = bitmapImage;

Si quieres extraer más marcos, también


hay composition.GetThumbnailsAsync

2) Use su mediaCapture, cuando su temporizador está


marcando

compartir mejorar esta respuesta respondió el 13 de febrero de 16 a las 16:06


Alamakanambra
1,889 14 22

Creo que esto funcionará mejor. Mi video no se seleccionará de la


ruta, estoy grabando en transmisión de
video InMemoryRandomAccessStream buffer ¿hay alguna forma
https://stackoverflow.com/questions/35380868/extract-frames-from-video-c-sharp 3/5
10/2/2019 Extraer marcos de video C # - Desbordamiento de pila
video InMemoryRandomAccessStream buffer , ¿hay alguna forma
de conversión InMemoryRandomAccessStream
buffer para storegfile luego puedo usarlo? Gracias por la
ayuda. - Ahmed 18 de febrero de 2016 a las 7:13

Tienes el objeto MediaCapture cuando estás en el método de


grabación, y obviamente el archivo de almacenamiento en el método
de reproducción. ¿Qué no está funcionando? - Alamakanambra 18
de febrero de 2016 a las 7:57

Si desea usar esto en una aplicación de escritorio .net estándar, siga


estos pasos github.com/jbe2277/waf/wiki/… - Hans Nov 28 '16 a las
22:37

Para obtener datos de videometa, se puede usar esto en su lugar en


el código anterior var props = await
pickedFile.Properties.GetVideoPropertiesAsync (); uint frameHeight =
props.Height; uint frameWidth = props.Width; var videolength =
props.Duration; - Hans Nov 28 '16 a las 23:46

No puedo incluir el archivo Widows.Media.Editing.dll que encontré en


la carpeta WIndows. VS dice que no puede incluirlo porque no es una
Asamblea o COM válida. ¿Cómo puedo usar exactamente las clases
que se usaron aquí? - Smogen Nov 16 '18 a las 17:29

añadir un comentario

Terminé usando MediaToolkit para resolver un problema similar


después de tener un montón de problemas con Accord.
4 Necesitaba guardar una imagen para cada segundo de un video:

using (var engine = new Engine())


{
var mp4 = new MediaFile { Filename = mp4FilePath };

engine.GetMetadata(mp4);

var i = 0;
while (i < mp4.Metadata.Duration.Seconds)
{
var options = new ConversionOptions { Seek = TimeSpan
var outputFile = new MediaFile { Filename = string.Fo
engine.GetThumbnail(mp4, outputFile, options);
i++;
}
}

Espero que esto ayude a alguien algún día.

compartir mejorar esta respuesta Editado el 28 de agosto de 18 a las 8:13


Koray
823 1 12 24

Respondió Mar 2 '18 a las 0:02


Brendan Kendrick
360 2 12
añadir un comentario

Utilice ffmpeg http://ffmpeg.org/


https://stackoverflow.com/questions/35380868/extract-frames-from-video-c-sharp 4/5
10/2/2019 Extraer marcos de video C # - Desbordamiento de pila

using (var vFReader = new VideoFileReader())


2 {
vFReader.Open("video.mp4");
for (int i = 0; i < vFReader.FrameCount; i++)
{
Bitmap bmpBaseOriginal = vFReader.ReadVideoFrame();
}
vFReader.Close();
}

compartir mejorar esta respuesta Respondió el 22 de abril de 17 a las 20:09.


juan_dvd
33 4

¿Qué envoltorio has usado para ffmpeg en c #? - Majid Hojati el 3 de


octubre de 17 a las 12:06

@MajidHojati Esto se parece a Accord.net, que ahora ha absorbido a


Aforge. Una cosa a tener en cuenta es que se publica bajo licencia
GPL. - Gui 25 de enero de 18 a 12:1

https://stackoverflow.com/questions/35380868/extract-frames-from-video-c-sharp 5/5

Anda mungkin juga menyukai