Non-Monotonous DTS on concat (ffmpeg)

17

Po uruchomieniu tego polecenia ffmpeg -f concat -i mylist.txt -c copy output.mp4- otrzymuję uszkodzony output.mp4plik i ten komunikat:

ffmpeg -f concat -i mylist.txt -c copy output.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, concat, from 'mylist.txt':
  Duration: N/A, start: 0.000000, bitrate: 829 kb/s
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1440x900, q=2-31, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598061, current: 467644; changing to 598062. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598062, current: 468044; changing to 598063. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598063, current: 468444; changing to 598064. This may result in incorrect timestamps in the output file.
...
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598362, current: 588044; changing to 598363. This may result in incorrect timestamps in the output file.
frame= 1472 fps=0.0 q=-1.0 Lsize=    5825kB time=00:00:49.04 bitrate= 973.0kbits/s
video:4903kB audio:877kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.776358%

Zadowolony z mylist.txt

file 'cut.mp4'
file 'cut2.mp4'

Dane wyjściowe cut.mp4 z ffmpeg:

ffmpeg -i cut.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:39.04, start: 0.036281, bitrate: 837 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Dane wyjściowe cut2.mp4 z ffmpeg:

ffmpeg -i cut2.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:10.07, start: 0.000000, bitrate: 1498 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1440x900, 1271 kb/s, 30 fps, 30 tbr, 12k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 218 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

cut.mp4 Dostałem to polecenie ffmpeg -ss 00:00:11 -i myfile.mp4 -to 00:00:39 -vf 'drawbox= : x=0 : y=0 : color=invert' cut.mp4

cut2.mp4 Dostałem to polecenie ffmpeg -ss 00:00:00 -i myfile.mp4 -to 00:00:10 -c copy cut2.mp4

Dużo szukałem - nie znalazłem rozwiązania, być może ktoś może mi w tym pomóc.

output.mp4 jest grywalny, ale wygląda dziwnie.

wprowadź opis zdjęcia tutaj

whitesiroi
źródło
1
Czy możesz podać oba pliki wejściowe, abym mógł przeprowadzić testy?
llogan
@ LordNeckbeard tak, wysłałem to do ciebie, dziękuję bardzo.
whitesiroi
1
Nie mogę zduplikować dokładnego problemu. Korzystam z najnowszej wersji statycznej dostępnej od tessus . Przykładowe pliki wyglądają inaczej niż zrzut ekranu, ale wydaje się, że działają dobrze w VLC i QuickTime, z wyjątkiem tego, że wyszukiwanie wydaje się pomieszane. Przetestowałem na komputerze z systemem OS X, ponieważ wygląda to tak, jak używasz.
llogan
@ LordNeckbeard Dziękuję bardzo, tak z tą wersją ffmpeg wersja N-71996-g372aa07-tessus to działa świetnie. Dziękuję Ci.
whitesiroi
tl; dr; usuń, -c copyaby umożliwić ponowne kodowanie lub -c:a copytylko użycie . Następnie krok konkat może być nadal używany, -c copyponieważ wszystkie filmy są już ponownie kodowane. Pamiętaj, że niektóre filmy z tym ostrzeżeniem nadal wyglądają dobrze po konkat i tak -c copyjest w porządku.
林果 皞

Odpowiedzi:

10

Korzystanie z najnowszych ffmpeg

Ogólni użytkownicy powinni zawsze korzystać ffmpegz bieżącej gałęzi git master (najnowszy dostępny kod):

  • W przypadku wystąpienia problemu najpierw sprawdź, czy używasz kompilacji z git master.
  • Jest uważany za stabilny.
  • Będzie miał więcej poprawek i funkcji.
  • Rozwój FFmpeg jest bardzo aktywny .
  • Jeśli chcesz uzyskać wsparcie z oficjalnych zasobów pomocy, musisz użyć git master.
  • Wydania są dla dystrybutorów.

Zobacz stronę pobierania FFmpeg, aby uzyskać różne opcje, lub zajrzyj na stronę FFmpeg Wiki: Przewodniki kompilacji .

Inne rzeczy

  • W swoim poleceniu drawboxmożesz przekopiować dźwięk za pomocą pary-c:a copy zamiast go ponownie kodować.

  • Podczas korzystania -ss, -totylko działa zgodnie z oczekiwaniami, jeśli -ssstosowany jest jako opcja wyjścia.

Llogan
źródło
Dziękuję bardzo, działa lepiej i szybciej. Czy możesz też to sprawdzić video.stackexchange.com/questions/15477/ ... Jestem tylko ciekawy, czy można to uprościć.
whitesiroi
@whitesiroi Sure. Odpowiedziałem, chociaż wydaje się, że skomentowałem to pytanie niezadowolony.
llogan
Przepraszam za to.
whitesiroi
1

Zgodnie z https://trac.ffmpeg.org/wiki/Concatenate

Miałem ten sam problem. Używam ffmpeg w wersji 2.6.3 na komputerze Mac. Przekształciłem klipy źródłowe do formatu .MTS z dodanym znacznikiem -q 0, zaktualizowałem rozszerzenia w pliku tekstowym i ustawiłem plik wyjściowy na .MTS, gdy uruchomiłem polecenie concat w ffmpeg. Działa jak urok. Oto mój przepływ pracy.

ffmpeg -i clip-1.MOV -q 0 clip-1.MTS

ffmpeg -i clip-2.MOV -q 0 clip-2.MTS

zaktualizowałem plik tekstowy (mylist.txt) do odczytu:

file clip-1.MTS
file clip-2.MTS

następnie uruchomił polecenie concat w następujący sposób:

ffmpeg -f concat -i mylist.txt -c copy output.MTS

Pracował dla mnie! Możesz przekonwertować końcowy wynik.MTS na dowolny potrzebny format.

Duncan Lindsey
źródło
czy ten protokół jest bezstratny?
becko
Nie, pierwsze polecenie konwertuje na MPEG-2, który nie ma trybu bezstratnego.
Gyan
1

Wystąpiły podobne błędy, a dźwięk w moich wyjściowych filmach czasami był niezsynchronizowany, a czasem zupełnie go brakowało, ale mkvmergezamiast tego użyłem z mkvtoolnix.

Moje wejściowe filmy wideo zostały zakodowane przy użyciu różnych ustawień i miały różne wymiary, więc najpierw zmieniłem ich rozmiar i ponownie zakodowałem za pomocą ffmpeg:

for f in *.mp4;do w=1280;h=720;ffmpeg -i $f -filter:v "scale=iw*min($w/iw\,$h/ih):ih*min($w/iw\,$h/ih),pad=$w:$h:($w-iw*min($w/iw\,$h/ih))/2:($h-ih*min($w/iw\,$h/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done

Niektóre z moich wejściowych filmów wideo nie miały kanału audio, więc użyłem takiego polecenia, aby dodać do nich cichy kanał audio:

for f in *.mkv;do ffprobe $f|&grep -q '1: Audio'||ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv {temp-,}$f;done

Następnie połączyłem filmy:

mkvmerge -o /tmp/output.mkv $(printf %s\\n *.mkv|sed '1!s/^/+/')

Jeśli twoje pliki wejściowe mają takie same wymiary, tę samą liczbę kanałów audio, tę samą częstotliwość próbkowania audio itd., Możesz użyć tylko mkvmergedo bezstratnego połączenia plików. Pliki wejściowe dla mkvmergemogą również mieć kontener MP4, ale plik wyjściowy będzie miał kontener MKV, nawet jeśli jego rozszerzenie nazwy pliku jest określone jako .mp4. Możesz uruchomić, ffmpeg -i output.mkv -c copy output.mp4aby zmienić kontener.

mkvmergema składnię typu mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv, gdzie mkvmerge -o output.mkv file1.mkv +file2.mkv +file3.mkvjest również akceptowane.

nisetama
źródło
1

Na podstawie naprawdę pomocnej odpowiedzi Duncana:

for f in ./*.mp4; do ffmpeg -i $f -q 0 "${f%.*}.mts"; done

Wtedy to:

ffmpeg -f concat -safe 0 -i <(for f in ./*.mts; do echo "file '$PWD/$f'"; done) -c copy All.mts
Hans-J. Schmid
źródło
0

Kiedy używam ffmpeg do remuxingu niektórych nagranych filmów (może to być TS, MP4 lub MKV) i otrzymuję niemonotyczny dts w strumieniu wyjściowym - znaczniki czasu itp. Itd., Powstałe wideo albo wydaje się mieć tylko dźwięk, albo gra się gwałtownie. Jedynym sposobem, w jaki udało mi się rzetelnie sobie z tym poradzić, jest użycie AviDemux. Przy ustawieniach kopiowania audio i wideo oraz wybraniu MP4V2 Muxer możliwe jest ,, pod opcją Konfiguruj, aby wybrać Optymalizuj do przesyłania strumieniowego. Wynikowy plik MP4 może być teraz używany w ffmpeg bez generowania komunikatów o błędach. Ufaj, że to się przyda.

gjdgjd
źródło