Немонотонный DTS на concat (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 играбельно, но выглядит странно.

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

whitesiroi
источник
1
Можете ли вы предоставить оба входных файла, чтобы я мог выполнять тесты?
Llogan
@LordNeckbeard да, я послал это тебе, большое спасибо.
whitesiroi
1
Я не могу воспроизвести точную проблему. Я использую самую последнюю статическую сборку, доступную от tessus . Файлы примеров, похоже, отличаются от вашего скриншота, но в VLC и QuickTime он работает нормально, за исключением того, что поиск кажется испорченным. Я тестировал на машине с OS X, потому что это похоже на то, что вы используете.
Llogan
@LordNeckbeard Большое спасибо, да, с этой версией ffmpeg версии N-71996-g372aa07-tessus она отлично работает. Спасибо.
whitesiroi
ТЛ; др; удалить, -c copyчтобы разрешить перекодирование или использовать -c:a copyтолько. Тогда concat step еще можно использовать, -c copyпоскольку все видео уже перекодированы. Обратите внимание, что некоторые видео с этим предупреждением выглядят нормально после concat, и это -c copyнормально.
林果

Ответы:

10

Используя последние ffmpeg

Обычные пользователи всегда должны использовать ffmpegиз текущей ветки git master (последний доступный код):

  • При возникновении проблемы первым делом проверьте, используете ли вы сборку из git master.
  • Это считается стабильным.
  • Он будет иметь больше исправлений ошибок и функций.
  • Развитие FFmpeg очень активно .
  • Если вы хотите получить поддержку от официальных справочных ресурсов, вы должны использовать git master.
  • Релизы предназначены для дистрибьюторов.

См. Страницу загрузки FFmpeg для различных вариантов или обратитесь к FFmpeg Wiki: Руководства по компиляции .

Другие вещи

  • В вашей команде drawboxвы можете скопировать аудио с помощью -c:a copyвместо того, чтобы перекодировать его.

  • При использовании -ss, -toработает только как ожидается , если -ssиспользуются в качестве опции вывода.

llogan
источник
Большое спасибо, это работает лучше и быстрее. Можете ли вы проверить это тоже video.stackexchange.com/questions/15477/… Мне просто интересно, можно ли это упростить.
whitesiroi
@whitesiroi Конечно. Ответил, хотя, кажется, я сделал комментатор на этот вопрос несчастным.
Llogan
Простите за это.
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, который не имеет режима без потерь.
Гьян
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также принимается.

nisetama
источник
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
Hans-J. Schmid
источник
0

Когда я использую ffmpeg для повторного смешивания некоторого записанного видео (может быть TS, MP4 или MKV) и получаю немонотонную dts в выходном потоке - отметки времени и т. Д., И т. Д., Получающееся видео либо имеет только аудио, либо воспроизводится вяло. Единственный способ надежно справиться с этим - использовать AviDemux. С помощью настроек копирования для аудио и видео и выбора MP4V2 Muxer можно, под опцией Configure выбрать Optimize For Streaming. Полученный файл MP4 теперь можно использовать в ffmpeg без генерации сообщений об ошибках. Поверьте, это полезно.

gjdgjd
источник