2016-06-28 5 views
0

Ich brauche zwei verschiedene Videos, die von einer gemeinsamen Eingangsquelle ausgehen. Der Einfachheit halber sagen wir, dass sie nur in Startzeit und Dauer unterschiedlich sind, aber der Produktionscode ist komplexer und ich muss filter_complex verwenden, also sind keine -ss -to-Optionen verfügbar.Unterschiedliches Trimmen der Multi-Videoausgabe mit ffmpeg filter_complex

Dies ist meine aktuelle Skript:

/Users/Luca/Downloads/ffmpeg-macosx -y \ 
-i "/Users/Luca/Downloads/2_dongiovanni_mov.mov" \ 
-filter_complex "\ 
[0:v]split=2[v1][v4];\ 
[v1]\ 
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\ 
trim=start=4:duration=10,\ 
setpts=PTS-STARTPTS\ 
[vout1];\ 
[v4]\ 
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\ 
trim=start=0:duration=247,\ 
setpts=PTS-STARTPTS\ 
[vout4];\ 
[0:a]asplit=2[a1][a4];\ 
[a1]\ 
atrim=start=4:duration=10,\ 
asetpts=PTS-STARTPTS\ 
[aout1];\ 
[a4]\ 
atrim=start=0:duration=247,\ 
asetpts=PTS-STARTPTS\ 
[aout4]" \ 
-map [vout1] -map [aout1] -codec:v libx264 -b:v 1000k -codec:a aac -b:a 384k -strict experimental "/Users/Luca/Downloads/preview.mp4" \ 
-map [vout4] -map [aout4] -codec:v libx264 -b:v 5000k -codec:a aac -b:a 384k -strict experimental "/Users/Luca/Downloads/large.mp4" \ 
2>&1 

preview.mp4 (die [v1] [a1] Segment) ist in Ordnung, da es nur 10 Sekunden dauert (und es beginnt bei 4. Sekunde Original-Video) . Audio ist auch ok.

large.mp4 ([v4] [a4]) dauert 247 Sekunden, aber das Video wird bei genau 14 Sekunden (das sind 4 + 10 der ersten Ausgabe) eingefroren, während Audio hat kein Problem (dauert 247 Sekunden ohne Einfrieren)).

wie erwartet funktioniert, wenn:

1) I entfernen beide "scale" Filter

OR

2) I tauschen die Filter "Trim" so im Grunde kann ffmpeg die längste verarbeiten erste und dann der kürzeste (siehe unten stehenden Code)

/Users/Luca/Downloads/ffmpeg-macosx -y \ 
-i "/Users/Luca/Downloads/2_dongiovanni_mov.mov" \ 
-filter_complex "\ 
[0:v]split=2[v1][v4];\ 
[v1]\ 
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\ 
trim=start=0:duration=247,\ 
setpts=PTS-STARTPTS\ 
[vout1];\ 
[v4]\ 
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\ 
trim=start=4:duration=10,\ 
setpts=PTS-STARTPTS\ 
[vout4];\ 
[0:a]asplit=2[a1][a4];\ 
[a1]\ 
atrim=start=0:duration=247,\ 
asetpts=PTS-STARTPTS\ 
[aout1];\ 
[a4]\ 
atrim=start=4:duration=10,\ 
asetpts=PTS-STARTPTS\ 
[aout4]" \ 
-map [vout1] -map [aout1] -codec:v libx264 -b:v 1000k -codec:a aac -b:a 384k -strict experimental "/Users/Luca/Downloads/preview.mp4" \ 
-map [vout4] -map [aout4] -codec:v libx264 -b:v 5000k -codec:a aac -b:a 384k -strict experimental "/Users/Luca/Downloads/large.mp4" \ 
2>&1 

Jeder kann das erklären?

Antwort

2

Merkwürdiges Verhalten. Ich kann es hier mit einer aktuellen Windows-Binärdatei reproduzieren. Sie sollten einen Fehlerbericht einreichen.

Umgehungen

# 1 Platz Skala vor Split und Prozess Kind in gewünschter Reihenfolge Ströme.

[0:v]scale='if(gt(a,16/9),640,-2)':'if(gt(a,16/9),-2,360)',split=2[v1][v4];\ 

# 2 Prozess Kind Ströme in gewünschter Reihenfolge, aber anstelle Skala nach trimmen.

[v1]trim=..., scale=..., setpts=PTS-STARTPTS[vout1]; \ 
[v4]trim=..., scale=..., setpts=PTS-STARTPTS[vout2]; \ 

# 3 Wenn direkt am Eingang arbeitet, keine Notwendigkeit, aufgeteilt.

[0:v]scale=..., trim=..., setpts=PTS-STARTPTS[vout1]; \ 
[0:v]scale=..., trim=..., setpts=PTS-STARTPTS[vout2]; \ 
+0

Problemumgehung # 2 erzeugt korrekte Ausgaben. Danke, dass du das auch in Windows ausprobierst (ich habe einen Mac). – LucaM