Как конвертировать 1080 @ 50i -> 720 @ 50p с помощью ffmpeg?

9

Мне действительно нравится видео со скоростью 50 кадров в секунду, но я не могу заставить ffmpeg конвертировать его в 50 кадров в секунду для себя.

Разрешение 720p меня устраивает, просто нужно больше FPS.

50i выглядит просто более плавно в соответствующих проигрывателях (например, GOM Player деинтерлейсирует видео и воспроизводит его с частотой 50 Гц. Очень большая разница с видео с 25 Гц.) ...

Моя текущая командная строка:

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi

Вот больше деталей видео. Исходное видео получено с видеокамеры Cannon HF10 AVCHD.

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi
ffmpeg version N-37541-g670229e Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb  3 2012 20:14:17 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope
ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en
able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben
c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-
libxvid --enable-zlib
  libavutil      51. 37.100 / 51. 37.100
  libavcodec     54.  0.102 / 54.  0.102
  libavformat    54.  0.100 / 54.  0.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
[h264 @ 000000000033FA30] Increasing reorder buffer to 1
Input #0, mpegts, from '00010.MTS':
  Duration: 00:03:13.92, start: 0.482156, bitrate: 16304 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1
080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, s16,
256 kb/s
File 'output.avi' already exists. Overwrite ? [y/N] y
w:1920 h:1080 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[yadif @ 0000000003CE95B0] mode:0 parity:-1 auto_enable:0
[scale @ 0000000003CE9550] w:1920 h:1080 fmt:yuv420p -> w:1280 h:720 fmt:yuv420p
 flags:0x4
Output #0, avi, to 'output.avi':
  Metadata:
    ISFT            : Lavf54.0.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720 [SAR 1:1 DA
R 16:9], q=2-31, 20000 kb/s, 50 tbn, 50 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16, 128 kb
/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press [q] to stop, [?] for help
frame=   15 fps=  0 q=2.0 size=     945kB time=00:00:00.62 bitrate=12481.3kbits/
frame=   32 fps= 32 q=2.0 size=    2132kB time=00:00:01.30 bitrate=13435.2kbits/
frame=   51 fps= 34 q=2.0 size=    3372kB time=00:00:02.06 bitrate=13409.2kbits/
frame=   70 fps= 35 q=2.0 size=    4641kB time=00:00:02.82 bitrate=13482.8kbits/
frame=   76 fps= 35 q=2.0 Lsize=    5047kB time=00:00:03.06 bitrate=13511.9kbits
BarsMonster
источник
Что вы имеете в виду, «не может сделать»? Это дает вам ошибки?
Просто Джейк
Он производит файл, который выглядит как 25p, а не такой гладкий, как 50i в соответствующем плеере.
BarsMonster
@slhck Вот и все
BarsMonster
Любая конкретная причина для кодирования в MPEG-4 Visual вместо использования h.264 снова (например, -vcodec libx264не то, чтобы это имело значение для ~ 20 Мбит / с, но все же.
slhck
@slhck хорошо, это просто по умолчанию :-)
BarsMonster

Ответы:

1

«В большинстве практических случаев невозможно получить полное прогрессивное видео из чересстрочного контента».

Также, если бы вы могли загрузить небольшой фрагмент видео, это бы очень помогло вашему делу.

Источник: mplayerhq.hu/DOCS/HTML/en/menc-feat-telecine.html

Стивен Пенни
источник
7

Подобно тому, как чересстрочное прогрессивное содержимое делит каждый кадр на 2 поля, удваивая частоту кадров, общий метод деинтерлейсинга состоит в объединении каждых 2 полей в 1 кадр, что уменьшает скорость на 2, таким образом, принимая 50 в 25 кадров в секунду. Конечно, вы можете удвоить каждый последний кадр, но это не дает никакой выгоды.

Во-первых, мы можем прочитать не использовать -deinterlace, а вместо этого yadif (что вы уже делаете):

 - deinterlace This option is deprecated since the deinterlacing is very low quality. Use the yadif filter with -filter:v yadif. 

Вы, вероятно, найдете раздел yadif документации FFMPEG довольно интересным:

Deinterlace the input video ("yadif" means "yet another deinterlacing filter"). 
It accepts the optional parameters: mode:parity:auto. 

MODE specifies the interlacing mode to adopt, accepts one of the following values: 
‘0’
output 1 frame for each frame
‘1’
output 1 frame for each field 
‘2’
like 0 but skips spatial interlacing check 
‘3’
like 1 but skips spatial interlacing check 
Default value is 0. 

PARITY default value is -1.
AUTO default value is 0. 

Обратите внимание, что по умолчанию MODE равен 0, что указывает FFMPEG выводить 1 кадр для каждых 2 полей, таким образом вдвое уменьшая число кадров в секунду. Я думаю, что вы ищете РЕЖИМ 1: один кадр на поле . Я не слишком уверен, как использовать эти необязательные параметры, но, возможно, что-то вроде

-filter:v yadif 1:-1:0 -s "1280x720" -r 50 
MTONE
источник
По крайней мере, он дает 50 кадров в секунду, но, к сожалению, 2 сгенерированных последовательных кадра очень похожи ... Хотя, когда я делаю шаг за шагом оригинальное видео 50i, я действительно вижу, что в быстром движении есть в два раза больше «шагов» и гораздо плавнее.
BarsMonster
@BarsMonster Во-первых, я постараюсь выяснить, что делает GOM-плеер, на случай, если это связано с какой-либо формой интерполяции. Мне любопытно - много ли чересстрочного контента, который содержит информацию с высокой частотой кадров? (В конце концов, преобразование 25p в 50i для широковещательной передачи не создает никакой новой информации о движении - вам нужен контент с прямым чередованием). Затем, если вы найдете метод деинтерлейсинга, который использует GOM (см. Википедию, их довольно много), вы должны попытаться найти фильтр для него, который можно использовать в AVISYNTH как часть процесса вместо использования метода -YADIF в FFMPEG. ,
Мтон
1

Согласно документации , -rопция устанавливает количество выходных файлов в секунду. Например, это устанавливает выход в 50 кадров в секунду:

ffmpeg -i input.avi -r 50 output.avi
Просто Джейк
источник
К сожалению, полученный файл примерно такой же, как и для -r 25. И он больше не работает. Похоже, он просто снял 25p видео, а затем удвоил его.
BarsMonster
Вы также пытались указать входную частоту кадров?
Просто Джейк
3
Это исключено. При деинтерлейсинге видео вы жертвуете плавным движением для совместимости с прогрессивными дисплеями.
Джейсон
@Jason Ну, мой видеоплеер (GOM Player) деинтерлейсирует видео 50i и показывает его плавно (т.е. с частотой 50 Гц) на моем TFT-мониторе с частотой 120 Гц, что, очевидно, является прогрессивным. Почему видео перекодировщик не может делать то же самое и производить плавный выход 50 Гц? Я понимаю, что у 50i меньше мелких деталей, но почему я не могу рассчитывать на выход 50Гц?
BarsMonster
Это зависит от используемого фильтра деинтерлейсинга. Очевидно, GOM Player делает хорошую работу в этом. Не слишком много знаю о том, как FFmpeg обрабатывает чересстрочное видео. @BarsMonster
slhck
1

ffmpeg -i input.avi -deinterlace -filter:v yadif -s "1280x720" output.avi

Джейсон
источник
1
К сожалению, он по-прежнему выдает всего 25 кадров в секунду ... Оригинальный файл гораздо более плавный ... Даже добавление -r 50 не помогло.
BarsMonster
0

Эта команда работает для меня:

ffmpeg -i source_50i.MTS -aspect 1920:1080 -vf yadif=1,scale=1920:1080 -c:v libx264 -preset fast -profile:v high -crf 23 -ac 2 -strict experimental -c:a aac -b:a 96k -movflags +faststart -y result_50p.mp4

Источником был файл видеокамеры Sony.

ecchphoto
источник