Łączenie wideo z nakładką

1

Mam wideo nagrane z gopro, które jest podzielone na 3 części, ponieważ maksymalny rozmiar pliku jest osiągany po około 17 minutach, a gopro automatycznie dzieli go na wiele części. Mam również nagranie camstudio na pulpicie.

Muszę połączyć 3 filmy gopro, a także nakładać nagranie camstudio jako widok typu obraz w obrazie.

To znaczy, że skończyłoby się tak, jak poniżej, gdzie 9 to nakładka, a 1,2,3 to filmy gopro

99999999999999999

111111222222333

Muszę to robić regularnie (i wiele filmów), więc chcę napisać plik wsadowy, aby wygenerować pożądane wyjście, w formacie odtwarzanym przez Windows Media Player bez pobranych kodeków. Przydatne byłoby również zmniejszenie rozmiaru pliku do maksymalnie 1 gb / 45 min.

Czy ktoś może zasugerować sposób na wykonanie tego w FFmpeg lub libav? Mogę wykonać konkatenację LUB nakładkę w FFmpeg, ale nie mogę uzyskać obu. Może po prostu muszę najpierw wykonać konkatenację pliku tymczasowego, a następnie użyć go jako danych wejściowych nakładki?

Obecnie używam następujących 2 poleceń w ffmpeg, aby to osiągnąć, ale rozmiar pliku jest ogromny, a jakość nie jest świetna, a ponadto zajmuje dużo czasu. Obecnie wydajność wynosi około 1 gb przez 7 minut, ale moje filmy mogą trwać do 45 minut, więc naprawdę muszę zmniejszyć rozmiar pliku, najlepiej do około 1-2 gb przez 45 minut

ffmpeg -i concat:1.mp4|2.mp4|3.mp4" -an -q:v 9 -preset veryslow -crf 28 -vcodec wmv2 temp.wmv
ffmpeg -i temp.wmv -an -vf"movie=overlay.avi, scale=iw:ih; [in][small] overlay =0:0 [out]" -q:v 9 -preset veryslow -crf 28 -vcodec wmv2 output.wmv

Dane wyjściowe z ffmpeg concat to:

>ffmpeg -i "concat:GOPR0133.mp4|GP010133.mp4|GP020133.mp4" -an -q:v 9 -vcodec wm
v2 70-70KMtemp.wmv
ffmpeg version N-61191-gea9399f Copyright (c) 2000-2014 the FFmpeg developers
  built on Mar  8 2014 22:01:33 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --ena
ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aa
cenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavp
ack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable
-zlib
  libavutil      52. 66.101 / 52. 66.101
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 34.100 / 55. 34.100
  libavdevice    55. 11.100 / 55. 11.100
  libavfilter     4.  3.100 /  4.  3.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 18.100 /  0. 18.100
  libpostproc    52.  3.100 / 52.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 027c29c0] Found duplicated MOOV Atom. Skipped it
    Last message repeated 1 times
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'concat:GOPR0133.mp4|GP010133.mp4|GP0201
33.mp4':
  Metadata:
    creation_time   : 2014-04-17 09:47:21
    minor_version   : 0
    major_brand     : avc1
    compatible_brands: avc1isom
  Duration: 00:17:24.30, start: 0.000000, bitrate: 71321 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709
), 1280x720 [SAR 1:1 DAR 16:9], 30002 kb/s, 100 fps, 100 tbr, 180k tbn, 200 tbc
(default)
    Metadata:
      creation_time   : 2014-04-17 09:47:21
      handler_name    :  GoPro AVC
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 12
8 kb/s (default)
    Metadata:
      creation_time   : 2014-04-17 09:47:21
      handler_name    :  GoPro AAC
[swscaler @ 036088a0] deprecated pixel format used, make sure you did set range
correctly
Output #0, asf, to '70-70KMtemp.wmv':
  Metadata:
    compatible_brands: avc1isom
    minor_version   : 0
    major_brand     : avc1
    WM/EncodingSettings: Lavf55.34.100
    Stream #0:0(eng): Video: wmv2 (WMV2 / 0x32564D57), yuv420p, 1280x720 [SAR 1:
1 DAR 16:9], q=2-31, 200 kb/s, 1k tbn, 100 tbc (default)
    Metadata:
      creation_time   : 2014-04-17 09:47:21
      handler_name    :  GoPro AVC
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> wmv2)
Press [q] to stop, [?] for help
frame=    6 fps=0.0 q=9.0 size=      60kB time=00:00:00.06 bitrate=8195.6kbits/s
frame=   15 fps= 14 q=9.0 size=     132kB time=00:00:00.15 bitrate=7203.6kbits/s
frame=   25 fps= 16 q=9.0 size=     207kB time=00:00:00.25 bitrate=6779.7kbits/s
frame=   33 fps= 16 q=9.0 size=     235kB time=00:00:00.33 bitrate=5834.4kbits/s
frame=   39 fps= 15 q=9.0 size=     294kB time=00:00:00.39 bitrate=6183.9kbits/s
frame=   47 fps= 15 q=9.0 Lsize=     326kB time=00:00:00.47 bitrate=5677.5kbits/
s
etc....

Następnie dane wyjściowe otrzymuję podczas wykonywania nakładki

>ffmpeg -i GOPR0131.mp4 -an -vf "movie=20140417_0930_55.avi, scale=iw:ih [small]
; [in][small] overlay =0:0 [out]" -q:v 9 -preset veryslow -crf 28 37-38KM.wmv
ffmpeg version N-61191-gea9399f Copyright (c) 2000-2014 the FFmpeg developers
  built on Mar  8 2014 22:01:33 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --ena
ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aa
cenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavp
ack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable
-zlib
  libavutil      52. 66.101 / 52. 66.101
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 34.100 / 55. 34.100
  libavdevice    55. 11.100 / 55. 11.100
  libavfilter     4.  3.100 /  4.  3.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 18.100 /  0. 18.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'GOPR0131.mp4':
  Metadata:
    major_brand     : avc1
    minor_version   : 0
    compatible_brands: avc1isom
    creation_time   : 2014-04-17 09:29:13
  Duration: 00:11:59.29, start: 0.000000, bitrate: 30160 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709
), 1280x720 [SAR 1:1 DAR 16:9], 30005 kb/s, 100 fps, 100 tbr, 180k tbn, 200 tbc
(default)
    Metadata:
      creation_time   : 2014-04-17 09:29:13
      handler_name    :  GoPro AVC
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 12
8 kb/s (default)
    Metadata:
      creation_time   : 2014-04-17 09:29:13
      handler_name    :  GoPro AAC
Codec AVOption preset (Set the encoding preset (cf. x264 --fullhelp)) specified
for output file #0 (37-38KM.wmv) has not been used for any stream. The most like
ly reason is either wrong type (e.g. a video option with no video streams) or th
at it is a private option of some encoder which was not actually used for any st
ream.
Codec AVOption crf (Select the quality for constant quality mode) specified for
output file #0 (37-38KM.wmv) has not been used for any stream. The most likely r
eason is either wrong type (e.g. a video option with no video streams) or that i
t is a private option of some encoder which was not actually used for any stream
.
[swscaler @ 0401a560] deprecated pixel format used, make sure you did set range
correctly
Output #0, asf, to '37-38KM.wmv':
  Metadata:
    major_brand     : avc1
    minor_version   : 0
    compatible_brands: avc1isom
    WM/EncodingSettings: Lavf55.34.100
    Stream #0:0(eng): Video: msmpeg4v3 (msmpeg4) (MP43 / 0x3334504D), yuv420p, 1
280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1k tbn, 100 tbc (default)
    Metadata:
      creation_time   : 2014-04-17 09:29:13
      handler_name    :  GoPro AVC
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> msmpeg4)
Press [q] to stop, [?] for help
frame=    6 fps=0.0 q=9.0 size=      23kB time=00:00:00.06 bitrate=3075.9kbits/s
frame=   16 fps= 15 q=9.0 size=      57kB time=00:00:00.16 bitrate=2913.4kbits/s
frame=   25 fps= 16 q=9.0 size=      91kB time=00:00:00.25 bitrate=2991.0kbits/s
frame=   32 fps= 15 q=9.0 Lsize=     113kB time=00:00:00.32 bitrate=2898.9kbits/
s
etc...
użytkownik3550682
źródło
Czy możesz podać nam nieco więcej informacji o tym, jakie kodeki / format mają GoPro i nagrania na pulpicie? Gra w WMP bez dodatkowych kodeków jest trudna, chyba że uruchomisz najnowszą wersję systemu Windows. Pełna zgodność wsteczna z, powiedzmy Windows XP, może zostać osiągnięta tylko poprzez wybór nieefektywnego kodeka.
slhck,
Jasne, nagrywanie na pulpicie jest wykonywane przez camstudio i używa bezstratnego kodeka camstudio 1.5. Kamera gopro nagrywa w plikach MPEG4 (.mp4) przy użyciu kompresji h.264. Mogę żyć bez wstecznej kompatybilności z XP, pod warunkiem, że można go odtwarzać w odtwarzaczu multimedialnym na
Windowsie
Właśnie zredagowałem również oryginalne pytanie, aby pokazać, co aktualnie robię
użytkownik3550682,
Dzięki! Byłoby wspaniale, gdybyś mógł wyświetlić również pełny wynik wiersza poleceń. W ten sposób możemy zobaczyć, co się dzieje.
slhck,
Pewnie, że próbowałem edytować go w swoim pytaniu (przepraszam, jeśli jest bałagan, jestem nowy w tym)
user3550682

Odpowiedzi:

2

Można użyć setpts, scale, concat, overlayoraz formatfiltry. Zakładam, że wszystkie dane wejściowe mają rozmiar 1280 x 720, ponieważ rozmiar pliku, który chcesz nałożyć, jest obecnie nieznany.

Przykład

ffmpeg -i gopro0.mp4 -i gopro1.mp4 -i gopro2.mp4 -i over.avi -filter_complex \
"[0:v]setpts=PTS-STARTPTS[v0]; \
 [1:v]setpts=PTS-STARTPTS[v1]; \
 [2:v]setpts=PTS-STARTPTS[v2]; \
 [3:v]setpts=PTS-STARTPTS,scale=iw/4:-2[fg]; \
 [v0][v1][v2]concat=n=3:v=1:a=1[bg][a]; \
 [bg][fg]overlay=W-w-10:10,format=yuv420p[v]"
-map "[v]" -map "[a]" output.mp4

Co robi każdy filtr

  • setptssprawia, że ​​znaczniki czasu zaczynają się od 0, co jest zalecane przez concati overlay.

  • scalespowoduje over.avizmniejszenie rozmiaru ramki.

  • concat połączy każde wejście.

  • overlayumieści skalowane over.aviw prawym górnym rogu z wypełnieniem 10 pikseli. Zapoznaj się z overlaydokumentacją, aby uzyskać dodatkowe opcje dotyczące danych wejściowych, które mają różne czasy trwania ( shortesta eof_actionkonkretnie).

  • formatupewni się, że twoje wyjście używa schematu podpróbkowania kolorów, który jest kompatybilny ze wszystkimi odtwarzaczami (zakładając, że używasz kodera, libx264który jest domyślny dla MP4, jeśli jest obsługiwany przez twoją ffmpegkompilację).

Notatki

  • Jeśli chcesz, aby wyjście miało mniejszy rozmiar ramki, dodaj kolejny scale:

    [bg][fg]overlay=W-w-10:10,scale=640:-2,format=yuv420p[v]"
    
  • W tej chwili nie byłem w stanie przetestować tych przykładów, więc zostaw komentarz, jeśli coś nie działa zgodnie z oczekiwaniami, i przyjrzę się temu w niedzielę, chyba że inni zapewnią dodatkową pomoc.

  • Typy plików obsługiwane przez Windows Media Center (Windows 7) są prawie bezwartościowe, ponieważ nie zawierają szczegółowych informacji, więc być może będziesz musiał poeksperymentować lub inni, którzy są bardziej zaznajomieni z Windows 7, mogą edytować tę odpowiedź.

Llogan
źródło
To wielkie dzięki, działa idealnie. Wynik jest znacznie lepszej jakości i ma mniejszy rozmiar pliku, a proces przebiega znacznie szybciej niż to, co sam zarządzałem.
user3550682