2011-02-24 28 views
13

Quello che voglio èFFmpeg Come scrivere video in un file

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

posso in grado di ottenere pacchetti video da un file (come AVPacket) e anche in grado di decodificare e salvare come immagine. (RAW) (I tutorial di FFmpeg mostrano come farlo). Ma non posso (non so) scrivere i dati video in un file (altro) che può essere riprodotto da lettori multimediali (come VLC).

auguri

Ps: esempi di codice reale sarà grande, se possibile ...

ora faccio test con av_interleaved_write ma ho ottenuto strano errore "timestamp non monotone" (non ho il controllo sui valori pts di sorgente media)

qualche informazione in più

In FFmpeg devo

  1. Leggere i pacchetti multimediali dalla sorgente multimediale (può essere file reale (.avi, mov) o anche server rtsp).
  2. Quindi scrivere quei mezzi di pacchetti in un file vero e proprio (.avi fisica, .mov file etc)

ho bisogno di lettore e scrittore. Posso leggere il file sorgente multimediale (anche codificare i pacchetti in base al formato specificato). Ma non posso scrivere sul file ... (che ogni giocatore può giocare)

E alcuni pseudocodice

File myFile("MyTestFile.avi"); 

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

o solo scrivere il file originale senza codificare decodificare

 File myFile("MyTestFile.avi"); 

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

Poi

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

Bounty Award per la persona che fornisce un collegamento a un buon esempio che implementa questo. usando av_interleaved_write_frame o av_write_frame –

+0

controlla questo link che dimostra la scrittura del file video usando lib di FFMPEG: https://stackoverflow.com/a/43464269/6180077 –

risposta

0

Ho fatto qualcosa del genere ad un certo punto usando libx264 e vorbis.

Un esempio di codice. https://github.com/Themaister/SSNES/blob/master/record/ffemu.c

L'idea di base è che è necessario impostare la data e l'ora in AVFrame quando si desidera codificarlo. Quindi puoi prendere quel pacchetto e scriverlo con av_interleaved_write().

+0

Ok. Controllerò. grazie per la risposta. – NoviceAndNovice

+0

Beh, non riesco a capire come scrivere i pacchetti di scrittura della funzione "av_interleaved_write_frame" a cui il file fisico (come i pacchetti di lettura e scrivere sul file "mytest.avi". – NoviceAndNovice

+0

Beh, ho capito ctx-> oformat = av_guess_format (NULL, ctx-> nomefile, NULL), ma dato che ho un file sorgente e un file di destinazione, dovrei creare 2 AVFormatContext: uno per la lettura e uno per scrivere? – NoviceAndNovice

0

è necessario scrivere un encoder per convertire i dati grezzi in formato video richiesto

ffmpeg encoding sample wanted?

Encode audio to aac with libavcodec

+0

Posso codificare e decodificare i dati usando la libreria ffmpeg (non cli , usa api). Quello che non posso fare è scrivere sul file reale usando la funzione av_interleaved_write in modo che ogni giocatore possa giocarci (sicuramente un lettore ha codec necessari) – NoviceAndNovice

4

Probabilmente questo link può aiutare:

Output a media file in any supported libavformat format

Spero che aiuti.

+0

L'esempio usa 'av_interleaved_write_frame'. – bacchus

+0

L'esempio sopra genera un video fittizio file. Ciò che questa domanda richiede è un esempio per decodificare e codificare il video. Il problema qui è con l'uso effettivo di avcodec_ecode_video e avcodec_decode_video come l'uso improprio causa diversi errori di segmentazione e buffer underflow. Ho già seguito tutti gli esempi predefiniti forniti. Mi sembra che un buon esempio probabilmente lo escluderebbe da ffmpeg.c –

+0

@AdityaGameProgrammer Non puoi combinare il codice del link qui sopra con questo [uno] (http://www.inb.uni-luebeck.de/~ boehme/using_libavcodec.html) solo per avere quello che vuoi? Quanto sopra spiega come scrivere i frame, quello in questo commento da leggere e decodificare. Se si combinano entrambi si può avere l'effetto desiderato. – bacchus

Problemi correlati