ffmpeg: Bilder zu 29.97fps mpeg2, Audio nicht synchron

4

Ich habe viel Zeit mit diesem Thema verbracht. Hoffe, jemand kann helfen.

Ich möchte 3147 Bilder + AC3-Audiodateien in ein MPEG2-Video mit 29,97 fps (ca. 1: 45 s) konvertieren. Mein Befehl:

~/ffmpeg/ffmpeg/ffmpeg -loop_input \
  -t 105 -i v%4d.tga -i final.ac3 \
  -vcodec mpeg2video -qscale 1 -s 400x400 -r 30000/1001 \
  -acodec copy -y out.mpeg 2> out.txt

Die Audiodatei endet jedoch vor der Bildsequenz. Das heißt, das Video ist langsamer als Audio .

Ich habe die Ausgabedatei mit imageinfo überprüft und sehe:

General
Complete name                    : out.mpeg
Format                           : MPEG-PS
File size                        : 7.18 MiB
Duration                         : 1mn 44s
Overall bit rate                 : 574 Kbps

Video
ID                               : 224 (0xE0)
Format                           : MPEG Video
Format version                   : Version 2
Format profile                   : Main@Main
Format settings, BVOP            : No
Format settings, Matrix          : Default
Format_Settings_GOP              : M=1, N=12
Duration                         : 1mn 44s
Bit rate mode                    : Variable
Bit rate                         : 103 Kbps
Width                            : 400 pixels
Height                           : 400 pixels
Display aspect ratio             : 1.000
Frame rate                       : 29.970 fps
Resolution                       : 8 bits
Colorimetry                      : 4:2:0
Scan type                        : Progressive
Bits/(Pixel*Frame)               : 0.021
Stream size                      : 1.29 MiB (18%)

Audio
ID                               : 128 (0x80)
Format                           : AC-3
Format/Info                      : Audio Coding 3
Duration                         : 1mn 44s
Bit rate mode                    : Constant
Bit rate                         : 448 Kbps
Channel(s)                       : 6 channels
Channel positions                : Front: L C R, Side: L R, LFE
Sampling rate                    : 44.1 KHz
Stream size                      : 5.61 MiB (78%)

Das Protokoll von ffmpeg zeigt viele doppelte Frames. Aber ich weiß nicht, wie ich das loswerden soll.

-loop_input is deprecated, use -loop 1
[image2 @ 0x9c17a80] max_analyze_duration 5000000 reached at 5000000
Input #0, image2, from 'v%4d.tga':
  Duration: 00:02:05.88, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: targa, bgr24, 400x400, 25 fps, 25 tbr, 25 tbn, 25 tbc
-loop_input is deprecated, use -loop 1
[ac3 @ 0x9ca5420] max_analyze_duration 5000000 reached at 5014400
[ac3 @ 0x9ca5420] Estimating duration from bitrate, this may be inaccurate
Input #1, ac3, from 'Final.ac3':
  Duration: 00:20:10.68, start: 0.000000, bitrate: 447 kb/s
    Stream #1:0: Audio: ac3, 44100 Hz, 5.1(side), s16, 448 kb/s
Incompatible pixel format 'bgr24' for codec 'mpeg2video', auto-selecting format 'yuv420p'
[buffer @ 0x9c1e060] w:400 h:400 pixfmt:bgr24 tb:1/1000000 sar:0/1 sws_param:
[buffersink @ 0x9dd56c0] auto-inserting filter 'auto-inserted scale 0' between the filter 'src' and the filter 'out'
[scale @ 0x9c178e0] w:400 h:400 fmt:bgr24 -> w:400 h:400 fmt:yuv420p flags:0x4
[mpeg @ 0x9d58060] VBV buffer size not set, muxing may fail
Output #0, mpeg, to 'out.mpeg':
  Metadata:
    encoder         : Lavf53.21.0
    Stream #0:0: Video: mpeg2video, yuv420p, 400x400, q=2-31, 200 kb/s, 90k tbn, 29.97 tbc
    Stream #0:1: Audio: ac3, 44100 Hz, 5.1(side), 448 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (targa -> mpeg2video)
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=  267 fps=  0 q=1.0 size=     564kB time=00:00:08.87 bitrate= 520.6kbits/s dup=43 drop=0    
frame=  544 fps=542 q=1.0 size=    1186kB time=00:00:18.11 bitrate= 536.2kbits/s dup=89 drop=0    
frame=  821 fps=546 q=1.0 size=    1818kB time=00:00:27.36 bitrate= 544.3kbits/s dup=135 drop=0    
frame= 1098 fps=548 q=1.0 size=    2444kB time=00:00:36.60 bitrate= 547.0kbits/s dup=181 drop=0    
frame= 1376 fps=549 q=1.0 size=    3072kB time=00:00:45.87 bitrate= 548.5kbits/s dup=227 drop=0    
frame= 1653 fps=550 q=1.0 size=    3700kB time=00:00:55.12 bitrate= 549.9kbits/s dup=273 drop=0    
frame= 1930 fps=550 q=1.0 size=    4326kB time=00:01:04.36 bitrate= 550.6kbits/s dup=319 drop=0    
frame= 2208 fps=551 q=1.0 size=    4960kB time=00:01:13.64 bitrate= 551.8kbits/s dup=365 drop=0    
frame= 2462 fps=546 q=1.0 size=    5746kB time=00:01:22.11 bitrate= 573.2kbits/s dup=407 drop=0    
frame= 2728 fps=544 q=1.0 size=    6354kB time=00:01:30.99 bitrate= 572.1kbits/s dup=451 drop=0    
frame= 3007 fps=545 q=1.0 size=    6980kB time=00:01:40.28 bitrate= 570.2kbits/s dup=498 drop=0    
frame= 3146 fps=546 q=1.0 Lsize=    7352kB time=00:01:44.93 bitrate= 573.9kbits/s dup=521 drop=0    

video:1518kB audio:5745kB global headers:0kB muxing overhead 1.230493%
Andy Le
quelle

Antworten:

6

Endlich habe ich die Lösung gefunden. Sehr einfach. Das Synchronisierungsproblem ist aufgetreten, weil der Eingabestream von Bildern standardmäßig als 25 fps betrachtet wird (auch wenn ich eine Ausgabebildrate ffmpegvon 29,97 fps angegeben habe). Duplizieren Sie daher die Bilder so, dass sie zwischen 25 fps und 29,97 fps liegen.

Um die Eingaberate zu erzwingen, setzen Sie einfach eine andere -r 30000/1001vor die Eingabe:

~/ffmpeg/ffmpeg/ffmpeg -loop_input \
  -t 105 -r 30000/1001 -i v%4d.tga -i final.ac3 \
  -vcodec mpeg2video -qscale 1 -s 400x400 -r 30000/1001 \
  -acodec copy -y out.mpeg 2> out.txt
Andy Le
quelle