Немонотонний DTS на конкаті (ffmpeg)


17

Після запуску цієї команди ffmpeg -f concat -i mylist.txt -c copy output.mp4- я отримую пошкоджений output.mp4файл і це повідомлення:

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%

Зміст mylist.txt

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

cut.mp4 вихід з 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

cut2.mp4 вихід з 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 Я отримав цю команду ffmpeg -ss 00:00:11 -i myfile.mp4 -to 00:00:39 -vf 'drawbox= : x=0 : y=0 : color=invert' cut.mp4

cut2.mp4 Я отримав цю команду ffmpeg -ss 00:00:00 -i myfile.mp4 -to 00:00:10 -c copy cut2.mp4

Я багато шукав - не знайшов рішення, можливо, хтось може мені допомогти з цим.

output.mp4 грає, але виглядає дивно.

введіть тут опис зображення


1
Чи можете ви надати обидва вхідні файли, щоб я міг виконувати тести?
логіан

@LordNeckbeard так, я надіслав це вам, дуже дякую.
whitesiroi

1
Я не можу дублювати точну проблему. Я використовую останню статичну збірку, доступну з тессу . Зразкові файли, схоже, відрізняються від скріншоту, але, схоже, вони працюють добре у VLC та QuickTime, за винятком того, що пошук здається зіпсованим. Я протестував на машині OS X, тому що це схоже на те, що ви використовуєте.
логіан

@LordNeckbeard Дякую велике, так, з цією версією ffmpeg версії N-71996-g372aa07-tessus це чудово працює. Дякую.
whitesiroi

tl; dr; видалити, -c copyщоб дозволити перекодування або використання -c:a copyлише. Тоді лаконічний крок все ще можна використовувати, -c copyоскільки всі відео вже перекодовані. Зауважте, що деякі відео з цим попередженням все ще виглядають нормально після скреттів, і тому -c copyце добре.
林果 皞

Відповіді:


10

Використовуючи останні ffmpeg

Загальні користувачі завжди повинні використовувати ffmpegз поточної гілки git master (останній доступний код):

  • Якщо ви зіткнулися з проблемою, перше, що потрібно зробити, це перевірити, чи ви використовуєте збірку від git master.
  • Вважається стабільним.
  • У ньому буде більше виправлень та можливостей помилок.
  • Розробка FFmpeg дуже активна .
  • Якщо ви хочете отримати підтримку з офіційних довідкових ресурсів, ви повинні скористатися git master.
  • Випуски призначені для дистриб'юторів.

Дивіться сторінку завантаження FFmpeg для різних варіантів або зверніться до Відомості про FFmpeg Wiki: Посібники зі збирання .

Інші речі

  • У вашій команді з drawboxвами можна копіювати звук на пару,-c:a copy а не перекодувати його.

  • При використанні -ss, -toпрацює тільки як очікується , якщо -ssвикористовуються в якості опції виводу.


Дякую велике, це працює краще та швидше. Чи можете ви, будь ласка, перевірити цей відео.stackexchange.com/questions/15477/… Мені просто цікаво, чи можна його спростити.
whitesiroi

@whitesiroi Звичайно. Відповів, хоча, здається, я зробив незадоволеним коментарем цього питання.
логіан

Вибачте за це.
whitesiroi

1

Відповідно до https://trac.ffmpeg.org/wiki/Concatenate

У мене був цей самий випуск. Я запускаю ffmpeg версії 2.6.3 на mac. Я перетворив свої вихідні кліпи у формат .MTS з доданим тегом -q 0, оновив розширення в текстовому файлі та встановив вихідний файл на .MTS, коли я запустив команду concat у ffmpeg. Це спрацювало як шарм. Ось мій робочий процес.

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

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

оновив текстовий файл (mylist.txt), щоб прочитати:

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

потім запустив команду concat наступним чином:

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

Працювали для мене! Ви можете конвертувати кінцевий висновок.MTS у будь-який потрібний вам формат.


це протокол без втрат?
бекко

Ні, перша команда перетворюється на MPEG-2, який не має режиму без втрат.
Gyan

1

У мене виникли подібні помилки, і звук у моїх вихідних відео іноді не синхронізувався, а іноді повністю відсутній, але я mkvmergeзамість цього використовував mkvtoolnix.

Мої відеозаписи були закодовані з різними налаштуваннями, і вони мали різні розміри, тому я спершу змінив розмір і повторно кодував їх за допомогою 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

Деякі з моїх вхідних відео не мали аудіоканалу, тому я використав таку команду, як ця, щоб додати до них безшумний аудіо канал:

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

Після цього я з'єднав відео:

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

Якщо ваші вхідні файли мають однакові розміри, однакову кількість аудіоканалів, однакову швидкість вибірки звуку тощо, ви можете використовувати лише mkvmergeдля об'єднання файлів без втрат. Вхідні файли для mkvmergeтакож можуть мати контейнер MP4, але у вихідному файлі буде контейнер MKV, навіть якщо його розширення імені файлу вказано як .mp4. Ви можете запустити, ffmpeg -i output.mkv -c copy output.mp4щоб змінити контейнер.

mkvmergeмає синтаксис як mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv, де mkvmerge -o output.mkv file1.mkv +file2.mkv +file3.mkvтакож приймається.


1

На основі дійсно корисної відповіді Дункана:

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

Тоді це:

ffmpeg -f concat -safe 0 -i <(for f in ./*.mts; do echo "file '$PWD/$f'"; done) -c copy All.mts

0

Коли я використовую ffmpeg для ремуксації деяких записаних відео (може бути TS, MP4 або MKV) і отримую не одноманітні dts у вихідному потоці - часові позначки і т. Д. Помилка, в результаті відео або, як видається, має лише аудіо, або відтворює ривком. Єдиний спосіб, з якого я надійно впорався з цим, - це використовувати AviDemux. За допомогою параметрів "Копіювати" як для аудіо, так і для відео та вибору MP4V2 Muxer можливо, під опцією Налаштувати вибрати Оптимізувати для потокової передачі. Отриманий файл MP4 тепер може використовуватися у ffmpeg без генерування повідомлень про помилки. Довіряйте, це корисно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.