2009-08-19 8 views
4

Ich schreibe gerade eine Anwendung, die Bilder von der Kamera liest, sie modifiziert und in einer Videodatei speichert. Ich plane es mit ffmpeg zu machen. Es gibt selten eine Dokumentation über ffmpeg. Ich kann keinen Weg finden. Weiß jemand wie es geht?Wie schreibe ich Frames in eine Videodatei?

Ich brauche es unter Unix, und in C oder C++ getan werden. Kann irgendjemand eine Anleitung geben?

Danke.

EDIT:

Sorry, ich habe nicht deutlich schreiben. Ich möchte, dass einige Entwickler-APIs Frames in eine Videodatei schreiben. Ich öffne den Kamerastream, ich bekomme jeden einzelnen Frame, dann speichere ich sie in eine Videodatei mit diesen APIs, die in ffmpegs öffentlichen APIs verfügbar sind. Das Befehlszeilen-Tool hilft mir also nicht. Und ich habe output_example.c im Ordner ffmpeg src gesehen. Es ist ziemlich gut, dass ich einige Teile des Codes direkt ohne Änderung kopieren kann. Und ich suche immer noch nach einem einfacheren Weg.

Außerdem denke ich über die Portierung meiner App auf das iPhone, soweit ich weiß, wurde nur ffmpeg auf dem iPhone portiert. GStreamer basiert auf Glib, und es ist alles GNU-Zeug. Ich bin mir nicht sicher, ob ich es auf dem iPhone funktionieren kann. Also ist ffmpeg immer noch die beste Wahl für jetzt.

Kommentare sind willkommen.

Antwort

4

Dies könnte Ihnen den Einstieg erleichtern - die Dokumentation ist verfügbar, aber neuere Funktionen sind in den Manpages von ffmpeg dokumentiert.

Die Frames müssen fortlaufend nummeriert werden.

ffmpeg -f image2 -r 25 -i frame_%d.jpg -vcodec libx264 -vpre hq -crf 22 video.mp4 
  • -f definiert das Format
  • -r die Rate Rahmen
  • -i definiert die Eingabedatei/s ... %d gibt an nummerierten Dateien .. 0 hinzufügen, die definiert padding angeben
  • -vcodec wählt den Videocodec
  • -vpre spezifiziert die Verwendung eines pres et genannt hq
  • -crf legt ein Ratensteuerverfahren verwendet, um festzulegen, wie der x264-Stream
  • codiert ist
  • video.mp4 wird die Ausgabedatei
0

Wenn andere Lösungen als ffmpeg für Sie machbar sind, können Sie sich GStreamer ansehen. Ich denke, es könnte genau das Richtige für Ihren Fall sein, und da draußen gibt es ziemlich viel Dokumentation.

0

Sie können tun, was Sie benötigen, ohne eine Bibliothek zu verwenden, wie in Unix Sie Rohr RGBA-Daten in ein Programm kann, so können Sie dies tun:

In Ihrem Programm:

char myimage[640*480*4]; 
// read data into myimage 
fputs(myimage,1,640*480*4,stdout); 

Und in einem Skript, das Ihr Programm läuft:

./myprogram | \ 
mencoder /dev/stdin -demuxer rawvideo -rawvideo w=640:h=480:fps=30:format=rgba \ 
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=9000000 \ 
-oac copy -o output.avi 

Ich glaube, Sie auch auf diese Weise ffmpeg verwenden oder x264.Sie können den Encoder auch in Ihrem Programm starten und in eine Pipe schreiben (was den gesamten Prozess so einfach macht, wenn Sie eine Library verwenden).

Obwohl nicht ganz, was Sie wollen, und nicht für die iPhone-Entwicklung geeignet, hat es den Vorteil, dass Unix automatisch einen zweiten Prozessor für die Codierung verwendet.