2011-02-24 22 views
13

Lo que quiero esFFmpeg Cómo escribir vídeo a un archivo

1. Get video packet from stream source 
2. Decode it 
3. And write that decoded data as video file(avi, mpeg etc) 

puedo capaz de obtener los paquetes de vídeo desde un archivo (como AVPacket) y también puede decodificar y guardar como una imagen. (Cruda) (Los tutoriales de FFmpeg muestran cómo hacerlo). Pero no puedo (no sé) escribir esos datos de video en un archivo (otro) que pueden ser reproducidos por reproductores multimedia (como VLC).

mejores deseos

Sal: ejemplos de código real será grande si es posible ...

ahora hago prueba con av_interleaved_write pero me dio error extraño "marcas de tiempo no monótonas" (no tengo control sobre los valores pts de fuente de medios de comunicación)

algo de información extra

En FFmpeg tengo que

  1. Lea los paquetes de medios del origen de los medios (puede ser un archivo real (.avi, mov) o incluso el servidor rtsp).
  2. luego escribir los paquetes de medios a un archivo real (.avi física, .mov archivo etc)

necesito lector y escritor. Puedo leer el archivo fuente de medios (incluso codificar paquetes de acuerdo con el formato dado). Pero no puedo escribir en el archivo ... (que puede jugar cualquier jugador)

Y algunos pseudocódigo

File myFile("MyTestFile.avi"); 

while (source ->hasVideoPackets) 
{ 
    packet = source->GetNextVideoPacket(); 
    Frame decodedFrame = Decode(packet); 
    VideoPacket encodedPacket = Encode(decodedFrame); 
    myFile.WriteFile(encodedPacket); 
} 

o simplemente escribir el archivo original sin codificar decodificar

 File myFile("MyTestFile.avi"); 

    while (source ->hasVideoPackets) 
    { 
     packet = source->GetNextVideoPacket(); 
     myFile.WriteFile(packet); 
    } 

Entonces

I can able to open MyTest.avi file with a player. 
+0

Bounty Award a la persona que proporciona un enlace a un buen ejemplo que implementa esto. utilizando av_interleaved_write_frame o av_write_frame –

+0

revise este enlace que muestra el archivo de video de escritura usando las librerías FFMPEG: https://stackoverflow.com/a/43464269/6180077 –

Respuesta

0

Hice algo como esto en algún momento usando libx264 y vorbis.

Un ejemplo de código. https://github.com/Themaister/SSNES/blob/master/record/ffemu.c

La idea básica es que usted tiene que configurar las marcas de tiempo usted mismo en el AVFrame cuando desee codificarlo. Luego puede tomar ese paquete y escribirlo con av_interleaved_write().

+0

Ok. Voy a ver. gracias por responder. – NoviceAndNovice

+0

Bueno, no puedo descifrar cómo decir a la función "av_interleaved_write_frame" los paquetes de escritura a qué archivo físico (como los paquetes de lectura y escribir en el archivo "mytest.avi". – NoviceAndNovice

+0

Bueno, me doy cuenta. Ctx-> oformat = av_guess_format (NULL, ctx-> filename, NULL); Pero dado que tengo un archivo fuente y un archivo de destino, ¿debo crear 2 AVFormatContext: uno para leer y otro para escribir? – NoviceAndNovice

0

tiene que escribir un codificador para convertir los datos en bruto a formato de vídeo requerida

ffmpeg encoding sample wanted?

Encode audio to aac with libavcodec

+0

Puedo codificar y decodificar datos usando la biblioteca ffmpeg (no cli) , use api). Lo que no puedo hacer es escribir en el archivo real usando la función av_interleaved_write para que cualquier jugador pueda jugarlo (el jugador seguro tiene codecs necesarios). – NoviceAndNovice

4

Probablemente este enlace puede ayudarle a:

Output a media file in any supported libavformat format

Espero que ayude.

+0

El ejemplo usa 'av_interleaved_write_frame'. – bacchus

+0

El ejemplo anterior genera un video ficticio archivo. Lo que esta pregunta pide es un ejemplo para decodificar y codificar video. El problema aquí es con el uso real de avcodec_ecode_video y avcodec_decode_video como el el uso inadecuado da como resultado varias fallas de segmentación y subdesbordamientos de búfer. Ya he ido a través de todos los ejemplos predeterminados. Me parece que un buen ejemplo probablemente lo eliminaría de ffmpeg.c –

+0

@AdityaGameProgrammer ¿No se puede combinar el código de enlace anterior con este [uno] (http://www.inb.uni-luebeck.de/~ boehme/using_libavcodec.html) solo para tener lo que quieres? El de arriba explica cómo escribir marcos, el de este comentario para leer y decodificar. Si combina ambos puede tener el efecto deseado. – bacchus

Cuestiones relacionadas