JavaCV FFmpegFrameRecorder Eigenschaften Erklärung benötigt

8

Ich verwende FFmpegFrameRecorder , um die Videoeingabe von meiner Webcam zu erhalten und sie in eine Videodatei aufzunehmen. Das Problem ist, dass ich meine Anwendung mit ein paar verschiedenen Demo-Quellcodes baue, die ich gefunden habe, und ich verwende Eigenschaften, von denen einige für mich nicht vollständig klar sind.

Hier ist mein Code-Snippet:

%Vor%
  • setVideoCodec (13) - Was bedeutet dieses (13) ? Wie kann ich verstehen, welcher Codec tatsächlich hinter einer Zahl steht?
  • setPixelFormat - Bekommen Sie das einfach, ich weiß nicht, was es im Allgemeinen macht
  • setFrameRate (30) - Ich denke, das sollte ziemlich klar sein, aber was ist die Logik hinter der Framerate, die wir wählen (ist nicht das High, desto besser?)
  • setVideoBitrate (10 * 1024 * 1024) - wieder fast keine Ahnung was das macht und welche Logik hinter den Zahlen steckt?

Am Ende möchte ich nur noch ein letztes Problem erwähnen, das ich so aufzeichnen kann. Wenn die tatsächliche Länge des Videos 20 Sekunden beträgt. Wenn ich die aus dem Programm erstellte Videodatei abspiele, läuft sie deutlich schneller. Kann nicht sagen, ob es genau 2 mal schneller ist, als es sein sollte, aber im Allgemeinen, wenn ich ein 20sek Video aufnehme, wird es ungefähr 10 Sekunden lang abgespielt. Was kann dies verursachen und wie kann ich es beheben?

    
Leron 02.01.2013, 16:44
quelle

1 Antwort

20

VideoCodec kann aus dieser Liste ausgewählt werden in avcodec.h / avcodec.java (Wie Sie sehen können, bekommt uns die Nummer 13 MPEG4, und es gibt andere, aber FFmpeg hat keine ein Encoder für alle):

%Vor%

PixelFormat kann aus dieser Liste in pixfmt.h / avutil.java ausgewählt werden, aber jeder Codec unterstützt nur einige davon (die meisten unterstützen mindestens AV_PIX_FMT_YUV420P ):

%Vor%

FrameRate gibt die Anzahl der Bilder pro Sekunde an, in denen das Video abgespielt werden soll (es hat nichts mit der Anzahl oder dem Timing von tatsächlich aufgenommenen Bildern zu tun, obwohl es eine Grundlage für die Codier-Bitrate). Also, im Falle von 30 FPS, um 20 Sekunden Video abzudecken, müssen Sie record() 30 * 20 = 600 mal aufrufen. Wenn Sie record() 600 Mal nicht aufrufen, ist dies die Ursache Ihres Problems.

VideoBitrate liefert die Videobitrate (in Bits pro Sekunde), in der der Videostream codiert werden soll. Wikipedia hat einen schönen Artikel dazu .

    
Samuel Audet 04.01.2013, 14:52
quelle

Tags und Links