MPEG-Video pausiert nicht zum genauen Zeitstempel

421
ram4sof

Wir verwenden die Xuggle-API zum Erstellen einer MP4-Datei mit variabler Dauer zwischen Bildern. Es folgt der Beispielcode

final com.xuggle.mediatool.IMediaWriter writer = com.xuggle.mediatool.ToolFactory.makeWriter("C:\\Media\\img\\output.mp4"); writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4, 3840, 2060); String[] imgFiles = FileUtil.getFiles("chapter1");// List of image filenames  long nextFrameTime = 0;  for(int i=0;i<imgFiles.length();i++) { String fileName = imgFiles[i]; long delay = ImgUtil.getDelay(fileName); nextFrameTime += (delay * 1000); videoImage = ImageIO.read(new File("C:\\Media\\img\\img\\"+fileName)); writer.encodeVideo(0, videoImage,nextFrameTime, TimeUnit.MICROSECONDS); }  writer.close(); 

Das erzeugte Video wird ohne Probleme abgespielt, und die Verzögerungen zwischen den einzelnen Bildern werden erwartungsgemäß wiedergegeben. Wenn Sie jedoch das Video anhalten, scheint es pausiert zu sein, bewegt sich jedoch zum nächsten Bild.

Wenn wir zum Beispiel das Video bei der 2. Minute pausieren, wird es nach einigen Sekunden zur nächsten Folie bewegt und nicht dauerhaft angehalten.

Gibt es eine Möglichkeit, das Video mithilfe von ffmpeg neu zu codieren, um dieses Problem zu beheben?

Im Folgenden finden Sie die Informationen zu ffprobe:

> ffprobe output.mp4 -show_entries frame=key_frame,pkt_pts_time -select_streams v -of compact=p=0  key_frame=1|pkt_pts_time=0.000000 key_frame=0|pkt_pts_time=30.039994 key_frame=0|pkt_pts_time=122.095995 key_frame=0|pkt_pts_time=215.875990 key_frame=0|pkt_pts_time=298.108995 key_frame=0|pkt_pts_time=377.050996 key_frame=0|pkt_pts_time=457.769986 key_frame=0|pkt_pts_time=549.354986 key_frame=0|pkt_pts_time=632.162997 key_frame=0|pkt_pts_time=711.653986 key_frame=0|pkt_pts_time=800.103990 key_frame=0|pkt_pts_time=882.286000 key_frame=1|pkt_pts_time=963.317998 key_frame=0|pkt_pts_time=1051.639994 key_frame=0|pkt_pts_time=1134.159991 key_frame=0|pkt_pts_time=1217.589990 key_frame=0|pkt_pts_time=1302.699992 key_frame=0|pkt_pts_time=1382.899992 key_frame=0|pkt_pts_time=1471.059998 key_frame=0|pkt_pts_time=1556.299992 key_frame=0|pkt_pts_time=1635.629999 key_frame=0|pkt_pts_time=1720.739986 key_frame=0|pkt_pts_time=1817.729992 key_frame=0|pkt_pts_time=1902.109987 key_frame=1|pkt_pts_time=1993.459998 key_frame=0|pkt_pts_time=2090.628992 key_frame=0|pkt_pts_time=2174.539986 key_frame=0|pkt_pts_time=2269.279988 key_frame=0|pkt_pts_time=2357.029999 key_frame=0|pkt_pts_time=2452.429999 key_frame=0|pkt_pts_time=2532.179995 key_frame=0|pkt_pts_time=2614.539986 key_frame=0|pkt_pts_time=2690.719997 key_frame=0|pkt_pts_time=2777.419989 key_frame=0|pkt_pts_time=2868.429999 key_frame=0|pkt_pts_time=2961.759991 key_frame=1|pkt_pts_time=3044.649989 key_frame=0|pkt_pts_time=3134.589990 key_frame=0|pkt_pts_time=3220.479988 key_frame=0|pkt_pts_time=3300.079988 key_frame=0|pkt_pts_time=3379.829999 key_frame=0|pkt_pts_time=3457.699992 key_frame=0|pkt_pts_time=3542.619989 key_frame=0|pkt_pts_time=3623.209995 key_frame=0|pkt_pts_time=3720.569986 key_frame=0|pkt_pts_time=3798.439994 key_frame=0|pkt_pts_time=3878.949996 key_frame=0|pkt_pts_time=3968.969986 key_frame=1|pkt_pts_time=4064.179995 
0
Hmm, ich frage mich, ob Ihr Player nur bei Keyframes pausieren möchte, und da dies eine Diashow von Standbildern ist, werden die Keyframes nur angezeigt, wenn ein neues Bild angezeigt wird. Wenn ja, können Sie dies umgehen, indem Sie einen Player verwenden, der bei Nicht-Keyframes pausieren kann, oder indem Sie das Video so generieren, dass pro Standbild mehr als ein Keyframe vorhanden ist. Spiff vor 5 Jahren 0
Vielen Dank für Ihre Antwort. Wie kann ich das Video mit mehr als einem Keyframe pro Standbild mithilfe von ffmpeg erstellen? ram4sof vor 5 Jahren 0
Dies scheint auf den Spieler bezogen zu sein. Versuchen Sie es mit einem anderen Spieler. Welcher Spieler? Gyan vor 5 Jahren 0
Das Problem bleibt bestehen, wenn ich auf Google Drive hochlade und in Windows Media Player. Es wird ordnungsgemäß im VLC Player abgespielt. Meine Hauptanforderung ist, auf Google Drive zu spielen, um die Freigabe zu ermöglichen ram4sof vor 5 Jahren 0

1 Antwort auf die Frage

0
ram4sof

Mein Problem ist gelöst, ich habe mit avcon tool neu codiert (viel Zeit mit ffmpeg versuchend). Das einzige Problem ist, dass die Kodierung ca. 40 Minuten für 1,50 Minuten Video benötigt.

avconv -i output.mp4 -vcodec libx264 -crf 27 -preset veryfast -c:a copy -s 3840x2060 fixed_keyframe_output.mp4