FFMPEG создает неверную продолжительность источника

При перекодировании фильмов из AVI в mp4 иногда FFMPEG неправильно устанавливает «Продолжительность источника».

Это портит воспроизведение на устройствах IOS. В частности, это приводит к тому, что видео обрывается на «Исходной длительности», в то время как звук все еще воспроизводится.

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

Выходной транскод FFMPEG вообще не показывает ничего странного. Выглядит нормально, никаких ошибок или предупреждений.

  • Могу ли я заставить FFMPEG никогда не добавлять метаданные «Продолжительность источника»?
  • Как отредактировать метаданные трека, отображаемые mediainfo? Я попробовал Mp4box и несколько других, но не могу понять, как редактировать метаданные уровня трека.

Спасибо.

Лог ниже.

ffmpeg version N-77455-g4707497 Copyright (c) 2000-2015 the FFmpeg developers   built with gcc 5.2.0 (GCC)   configuration: --enable-gpl
    --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib   libavutil      55. 11.100 / 55. 11.100   libavcodec     57. 20.100 / 57. 20.100   libavformat    57. 20.100 / 57. 20.100   libavdevice    57.  0.100 / 57.  0.100   libavfilter     6. 21.101 / 
    6. 21.101   libswscale      4.  0.100 /  4.  0.100   libswresample   2.  0.101 /  2.  0.101   libpostproc    54.  0.100 / 54.  0.100 Input #0, avi, from 'E:\MEDIA\Central.Intelligence.2016.HC.HDRip.XviD.AC3-EVO\Central.Intelligence.2016.HC.HDRip.XviD.AC3-EVO.avi': Metadata:
        encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)   Duration: 01:51:43.27, start: 0.000000, bitrate: 1765 kb/s
        Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x304 [SAR 1:1 DAR 45:19], 1563 kb/s, 23.98 fps, 23.98 tbr, 23.98 tbn, 23.98 tbc
        Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s [libx264 @ 000000f3c80a0a80] using SAR=405/304 [libx264 @ 000000f3c80a0a80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2 [libx264 @ 000000f3c80a0a80] profile High, level 3.1 [libx264 @ 000000f3c80a0a80] 264 - core 148 r2638 7599210 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=23 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=1280 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'F:\STREAMS\Central.Intelligence.2016.HC.HDRip.XviD.AC3-EVO.avi.1280x720_1000kbps.TEMP.mp4': Metadata:
        encoder         : Lavf57.20.100
        Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 405:304 DAR 45:19], q=-1--1, 1280 kb/s, 23.98 fps, 10000k tbn, 23.98 tbc
        Metadata:
          encoder         : Lavc57.20.100 libx264
        Side data:
          unknown side data type 10 (24 bytes)
        Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 160 kb/s
        Metadata:
          encoder         : Lavc57.20.100 aac Stream mapping:   Stream #0:0 -> #0:0 (mpeg4 (native) -> h264 (libx264))   Stream #0:1 -> #0:1 (ac3 (native) -> aac (native)) Press [q] to stop, [?] for help [mpeg4 @ 000000f3c80ae220] Video uses a non-standard and wasteful way to store B-frames ('packed B-frames'). Consider using the mpeg4_unpack_bframes bitstream filter without encoding but stream copy to fix it. 
frame=   15 fps=0.0 q=0.0 size=       0kB time=00:00:01.18 bitrate=   0.3kbits/s dup=1 drop=0 speed=2.36x   
--SNIP---
frame=160704 fps= 16 q=30.0 size= 1180376kB time=01:51:43.08 bitrate=1442.6kbits/s dup=1 drop=0 speed=0.671x     
[libx264 @ 0000001f60c5d900] frame I:1167  Avg QP:19.08  size: 44465
[libx264 @ 0000001f60c5d900] frame P:63049 Avg QP:22.26  size: 12774
[libx264 @ 0000001f60c5d900] frame B:110691 Avg QP:24.81  size:  2739
[libx264 @ 0000001f60c5d900] consecutive B-frames:  6.0% 22.8% 18.3% 53.0%
[libx264 @ 0000001f60c5d900] mb I  I16..4: 14.0% 76.1%  9.9%
[libx264 @ 0000001f60c5d900] mb P  I16..4:  2.5%  6.6%  0.4%  P16..4: 44.5% 10.8%  5.2%  0.0%  0.0%    skip:30.0%
[libx264 @ 0000001f60c5d900] mb B  I16..4:  0.1%  0.3%  0.0%  B16..8: 32.1%  1.6%  0.2%  direct: 0.9%  skip:64.9%  L0:37.9% L1:58.7% BI: 3.5%
[libx264 @ 0000001f60c5d900] final ratefactor: 23.25
[libx264 @ 0000001f60c5d900] 8x8 transform intra:70.8% inter:85.8%
[libx264 @ 0000001f60c5d900] coded y,uvDC,uvAC intra: 47.1% 56.6% 19.5% inter: 10.7% 14.2% 0.4%
[libx264 @ 0000001f60c5d900] i16 v,h,dc,p: 46% 20%  8% 26%
[libx264 @ 0000001f60c5d900] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 17% 25%  5%  7%  7%  7%  6%  6%
[libx264 @ 0000001f60c5d900] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 20% 12%  5% 10%  9%  8%  5%  4%
[libx264 @ 0000001f60c5d900] i8c dc,h,v,p: 58% 18% 18%  6%
[libx264 @ 0000001f60c5d900] Weighted P-Frames: Y:1.4% UV:0.8%
[libx264 @ 0000001f60c5d900] ref P L0: 62.6% 12.9% 18.9%  5.6%  0.1%
[libx264 @ 0000001f60c5d900] ref B L0: 87.6% 11.0%  1.4%
[libx264 @ 0000001f60c5d900] ref B L1: 94.6%  5.4%
[libx264 @ 0000001f60c5d900] kb/s:1272.59
[aac @ 0000001f60b52180] Qavg: 954.859

Изменить

Это как-то связано с данными, когда я запускаю эту команду (сокращение на 10 минут)

ffmpeg.exe -i CI.mp4 -ss 00:00:00 -t 00:08:00 -vcodec copy  -map_metadata 0 -acodec copy CI2.mp4

Медиаинфо показывает

Duration                    : 9mn 49s
Source duration             : 2mn 40s

Когда я запускаю это (18 минут)

ffmpeg.exe -i CI.mp4 -ss 00:00:00 -t 00:18:00 -vcodec copy  -map_metadata 0 -acodec copy CI2.mp4

Медиаинфо шоу

Duration                    : 17mn 49s
Source duration             : 3mn 30s

Как я могу редактировать метаданные напрямую


person Byron Whitlock    schedule 03.08.2016    source источник
comment
Покажите команду преобразования и ее полный вывод на консоль. Вы можете добавить -report к команде и вставить созданный файл журнала.   -  person Gyan    schedule 03.08.2016
comment
@Mulvya Спасибо, я приложил журнал FFMPEG.   -  person Byron Whitlock    schedule 03.08.2016
comment
Команда отсутствует.   -  person Gyan    schedule 03.08.2016
comment
@ByronWhitlock Какие команды вы использовали для создания вывода? Их можно использовать для воссоздания проблемы и проверки на наличие исправления. Знаешь ffmpeg -i somefile.mp4 -options=showUsed ...etc etc.   -  person VC.One    schedule 03.08.2016
comment
я думаю, это как-то связано с исходными данными. Как я могу редактировать метаданные напрямую?   -  person Byron Whitlock    schedule 04.08.2016
comment
Вы не найдете конкретно исходную длительность в метаданных MP4, она даже не помещается туда FFmpeg. Просто рассчитывается МедиаИнфо (но как не знаю). В любом случае CI.mp4 — это результат преобразования avi в mp4, верно? Итак, если получилось плохо, то зачем использовать плохой файл в качестве входных данных для обрезки этих 10 и 18-минутных тестов? Результат все равно будет плохой... А звук avi был в формате ac3? Вы использовали -acodec copy в команде преобразования avi в mp4? MP4 ожидает аудио в формате mp3 или aac.   -  person VC.One    schedule 05.08.2016
comment
Я предлагаю (1) попробовать установить основной или базовый профиль для параметров видео FFmpeg (поскольку ваша проблема затрагивает мобильные устройства. Это только iOS, но Android подходит?), (2) пропустите параметры acodec (поскольку FFmpeg автоматически установит правильные параметры для вашего формата mp4).   -  person VC.One    schedule 05.08.2016
comment
Некоторые пояснения от создателя MediaInfo можно найти здесь. Кратко из него: Duration – это длительность из заголовка дорожки, а Source duration – это длительность из медиа-заголовка. (заголовок мультимедиа находится внутри заголовка дорожки, не пытайтесь понять, почему у одной и той же дорожки две длительности).   -  person MarianD    schedule 05.05.2021
comment
@Gyan, я добавил комментарий о терминах в MediaInfo от его создателя; может быть, это поможет вам помочь ОП (и мне тоже) - если вы будете так добры - как исправить такие поврежденные файлы MP4. Спасибо.   -  person MarianD    schedule 05.05.2021


Ответы (1)


Недавно столкнулся с похожей проблемой. У меня было 3 похожих (1080x1920, т.е. портрет) видео в формате MP4, снятых мобильным телефоном. Я преобразовал их в 1280x720 (пейзаж) с помощью следующей команды ffmpeg:

fmpeg -i input.MP4 -vf "scale=w=1280:h=720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" -c:a copy -y output.MP4

Он изменяет размер видео и добавляет широкие черные полосы с обеих сторон. Два из получившихся видео были в порядке, а на третьем произошел сбой моего видеоредактора. Однако VLC может отображать его. Я проверил с MediaInfo его теги, и у него был тег видео продолжительности источника (никогда не видел его раньше). Его значение составило 9 с 628 мс, а Duration — 48 с 21 мс. Два других видео не имели тегов длительности источника. Поскольку VLC может отображать его, я попытался использовать его для исправления видео следующим образом (в меню «Вид» у меня установлен флажок «Дополнительные элементы управления»):

  1. Выбранный носитель -> Конвертировать/Сохранить...
  2. Добавить... -> просмотрел вход.MP4 -> Открыть
  3. Преобразовать/Сохранить -> Преобразовать
  4. Выбранное видео профиля — H.264 + MP3 (MP4), нажата кнопка «Редактировать выбранный профиль».
  5. Вкладка «Инкапсуляция», MP4/MOV, все функции, кроме глав
  6. Вкладка «Видеокодек», установлен флажок «Видео» и «Сохранить исходную видеодорожку».
  7. Вкладка «Аудиокодек», отмечены «Аудио» и «Сохранить исходную звуковую дорожку».
  8. Вкладка «Субтитры», снимите флажок «Субтитры», потому что в видео их нет.
  9. Сохранять
  10. Просмотрите файл назначения, просмотрите выходную папку, введите имя фрагмента вывода.MP4
  11. Сохранять
  12. Начинать

VLC сделал преобразование быстро, и вуаля! Согласно MediaInfo больше не было тега длительности источника, и мой видеоредактор охотно принял полученное видео.

person user14270782    schedule 13.09.2020