Hallo, ich möchte mit ffmpeg so etwas wie in diesem Bild unten erreichen:
Anfangs habe ich den folgenden Befehl verwendet:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex
nullsrc=size=960x304 [base];
[0:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v0];
[1:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v1];
[2:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v2];
[base][v0] overlay=x=0:y=0[tmp0];
[tmp0][v1] overlay=x=320:y=0[tmp1];
[tmp1][v2] overlay=x=640:y=0[tmp2]
-map [tmp2] -c:v libx264 output.mp4
Es funktionierte gut, aber Audio fehlte in der Ausgabe, also habe ich den folgenden Befehl verwendet, um Audios von Eingabevideos zu mischen:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex
nullsrc=size=960x304 [base];
[0:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v0];
[1:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v1];
[2:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v2];
[base][v0] overlay=x=0:y=0[tmp0];
[tmp0][v1] overlay=x=320:y=0[tmp1];
[tmp1][v2] overlay=x=640:y=0[tmp2];
[0:a][1:a][2:a]amix=inputs=3:duration=shortest[audio]
-map [tmp2] -map [audio] -c:v libx264 output.mp4
Ich weiß nicht, was passiert ist, aber die Hinrichtung hört nie auf. Es geht weiter. Ich dachte, die Abtastrate und die Kanaltypen des Eingangsaudios stimmen nicht überein, also habe ich es unten versucht:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex
nullsrc=size=960x304 [base];
[0:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v0];
[1:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v1];
[2:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v2];
[base][v0] overlay=x=0:y=0[tmp0];
[tmp0][v1] overlay=x=320:y=0[tmp1];
[tmp1][v2] overlay=x=640:y=0[tmp2];
[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1[audio0];
[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1[audio1];
[2:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1[audio2];
[audio0][audio1][audio2]amix=inputs=3:duration=shortest[audio]
-map [tmp2] -map [audio] -c:v libx264 output.mp4
aber gleiches Ergebnis. Die Hinrichtung hört nie auf. Ich denke, es gibt etwas mit Audio-Handling. Wenn ich derzeit den Audioteil entferne und nur das Video ausgebe, stoppt das Ausgabevideo, wenn das kürzeste des Videos endet. Ich möchte, dass das Ausgabevideo die Länge des längsten Videos haben sollte. Die kurzen Clips sollten ihren letzten Frame anzeigen, bis das längste Video zu Ende ist. Irgendwelche Hilfe diesbezüglich?
PS: Protokolle von logcat:
ffmpeg version 3.3.4
Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.9 (GCC) 20140827 (prerelease)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input1.mp4':
Metadata:
major_brand :
isom
minor_version :
512
compatible_brands:
isomiso2avc1mp41
title :
1946246598843281
encoder :
Lavf56.40.101
Duration:
00:00:53.91
, start:
-0.022109
, bitrate:
256 kb/s
Stream #0:0
(und)
: Video: h264 (avc1 / 0x31637661), yuv420p, 400x304, 206 kb/s
,
25 fps,
25 tbr,
90k tbn,
50 tbc
(default)
Metadata:
handler_name :
VideoHandler
Stream #0:1
(und)
: Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 47 kb/s
(default)
Metadata:
handler_name :
SoundHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'input2.mp4':
Metadata:
major_brand :
isom
minor_version :
512
compatible_brands:
isomiso2avc1mp41
title :
617689615538740
encoder :
Lavf56.40.101
Duration:
00:00:15.37
, start:
-0.022109
, bitrate:
392 kb/s
Stream #1:0
(und)
: Video: h264 (avc1 / 0x31637661), yuv420p, 400x400, 349 kb/s
,
30 fps,
30 tbr,
90k tbn,
60 tbc
(default)
Metadata:
handler_name :
VideoHandler
Stream #1:1
(und)
: Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 47 kb/s
(default)
Metadata:
handler_name :
SoundHandler
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'input3.mp4':
Metadata:
major_brand :
isom
minor_version :
512
compatible_brands:
isomiso2avc1mp41
encoder :
Lavf57.25.100
Duration:
00:00:05.97
, start:
0.000000
, bitrate:
770 kb/s
Stream #2:0
(und)
: Audio: aac (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 128 kb/s
(default)
Metadata:
handler_name :
SoundHandler
Stream #2:1
(und)
: Video: h264 (avc1 / 0x31637661), yuv420p, 368x480, 608 kb/s
,
27.29 fps,
120 tbr,
12k tbn,
60 tbc
(default)
Metadata:
handler_name :
VideoHandler
Stream mapping:
Stream #0:0 (h264) -> crop
Stream #0:1 (aac) -> aformat
Stream #1:0 (h264) -> crop
Stream #1:1 (aac) -> aformat
Stream #2:0 (aac) -> aformat
Stream #2:1 (h264) -> crop
overlay
-> Stream #0:0 (libx264)
amix
-> Stream #0:1 (aac)
Press [q] to stop, [?] for help
Führen Sie ein Upgrade auf Version 4.3 durch und begrenzen Sie die Dauer des Basis-Layers, die standardmäßig unbegrenzt ist. Audio ist in Ordnung.
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex
nullsrc=size=960x304,trim=0:1 [base];
[0:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v0];
[1:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v1];
[2:v] crop=min(iw\,320):304:(iw-min(iw\,320))/2:0 [v2];
[base][v0] overlay=x=0:y=0[tmp0];
[tmp0][v1] overlay=x=320:y=0[tmp1];
[tmp1][v2] overlay=x=640:y=0[tmp2];
[0:a][1:a][2:a]amix=inputs=3:duration=longest[audio]
-map [tmp2] -map [audio] -c:v libx264 output.mp4
Bereits auf einer anderen Seite beantwortet
Ich kopiere es einfach
Der Überlagerungsfilter hat eine kürzeste Option:
Wenn auf 1 gesetzt, erzwingt die Beendigung der Ausgabe, wenn die kürzeste Eingabe endet. Der Standardwert ist 0.
Beispiel:
ffmpeg -i input -filter_complex "color[c];[0:v][c]overlay=shortest=1" output
Die Verwendung von shortest ist erforderlich, da die Farbdauer unbegrenzt ist (es sei denn, Sie verwenden die Option d).
Khawar Raza
Gyan