Дополнительный фрейм добавлен после конкатенации ffmpeg - PullRequest
0 голосов
/ 07 мая 2020

У меня есть куча файлов mp4 (h.264, 25 кадров в секунду), которые я хочу объединить. Файл Concat:

file 'clip1.mp4'
outpoint 4

file 'clip2.mp4'
outpoint 4

file 'clip3.mp4'
outpoint 4

file 'clip4.mp4'
outpoint 4

file 'clip5.mp4'
outpoint 4

Затем я запускаю

\ffmpeg -f concat -i listd.txt -vcodec copy -y testtttt.mp4

Результат:

ffmpeg -f concat -i listd.txt -vcodec copy -y testtttt.mp4
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.2.1 (GCC) 20200122
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002027d363080] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from 'listd.txt':
  Duration: N/A, start: 0.000000, bitrate: 193 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 193 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
    Metadata:
      handler_name    : VideoHandler
Output #0, mp4, to 'testtttt.mp4':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 193 kb/s, 25 fps, 25 tbr, 12800 tbn, 12800 tbc
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002027d36b900] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 000002027d376500] Non-monotonous DTS in output stream 0:0; previous: 50688, current: 50688; changing to 50689. This may result in incorrect timestamps in the output file.
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002027d36b900] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 000002027d376500] Non-monotonous DTS in output stream 0:0; previous: 101888, current: 101888; changing to 101889. This may result in incorrect timestamps in the output file.
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002027d36b900] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 000002027d376500] Non-monotonous DTS in output stream 0:0; previous: 153088, current: 153088; changing to 153089. This may result in incorrect timestamps in the output file.
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002027d36b900] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 000002027d376500] Non-monotonous DTS in output stream 0:0; previous: 204288, current: 204288; changing to 204289. This may result in incorrect timestamps in the output file.
frame=  505 fps=0.0 q=-1.0 Lsize=     661kB time=00:00:19.96 bitrate= 271.4kbits/s speed= 238x
video:656kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.823749%

Все входные файлы - 25 кадров в секунду, поэтому я ожидаю, что на выходе будет файл длиной 500 кадров 20 секунд. Однако я получаю 505.

mediainfo выглядит так:

enter image description here

Дальнейшее расследование:

ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv testtttt.mp4 >1.txt

Я вижу, что ключевые кадры - 0, 101, 202, 303, 404. Похоже, ffmpeg добавляет дополнительный кадр к каждой серии из 100 кадров.

Вот мои настройки (всего 2 МБ)

https://www.dropbox.com/s/fjvhcoxywhw1hb3/1080p.zip?dl=0

Как мне получить файл длиной 500 кадров, 20 секунд, 25 кадров в секунду?

UPD:

Я читал ffmpeg docs

Эта директива лучше всего работает с внутрикадровыми кодеками и форматами, в которых все потоки строго чередуются. Для кодеков, не являющихся внутрикадровыми, вы обычно получаете дополнительные пакеты с отметкой времени представления после точки выхода, поэтому декодированный контент, скорее всего, будет содержать кадры и после точки выхода. Если ваши потоки не чередуются строго, вы можете не получить все пакеты из всех потоков до точки выхода, и вы сможете декодировать только самый ранний поток до точки выхода.

Означает ли это, что это нормально поведение? Как мне получить желаемый результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...