Форум русскоязычного сообщества Ubuntu


Автор Тема: Перекодирование видеофайла "на лету"  (Прочитано 1730 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Здравствуйте!

Я пытаюсь сдлеать кодирование видеофайла "на лету" утилитой x264, но не получается.
При кодировании через сохранённый несжатый файл выходной *.mkv получается нормальный,
хотя mediainfo выводит для него не те опции, которые предполагает --preset veryslow.
При кодировании "на лету" опции сохраняются, но файл получается больше,
чем при кодировании несжатого файла и он оказывается испорченным - в рамке
плеера кадр плывёт слева направо, а вверху есть алая полоса с вертикальной жёлтой
широкой чёрточкой.

Tu-22M3.mp4,  4912297 - исходный.

/usr/bin/ffmpeg -i Tu-22M3.mp4 -an -sn -map 0 -f yuv4mpegpipe tu_22m3.y4mtu_22m3.y4m, 1098M - несжатый.

Из файла:
/usr/bin/x264 -v --log-level warning --preset veryslow -o tu_22m3_cmpr_file.mkv \
tu_22m3.y4m > tu_22m3_file.err 2>& 1
tu_22m3_cmpr_file.mkv, 2333075 - из несжатого.
Вот его опции:
ref=3 analyse=0x3:0x113 me=hex subme=7 me_range=16 trellis=1 bframes=3 b_adapt=1
direct=1 keyint_min=24 rc_lookahead=40

"На лету":
/usr/bin/ffmpeg -i Tu-22M3.mp4 -an -sn -map 0 -f yuv4mpegpipe 2>/dev/null - | \
/usr/bin/x264 -v --log-level warning --input-res 640x352 --preset veryslow \
-o tu_22m3_cmpr_fly1.mkv - > tu_22m3_fly1.err 2>& 1
tu_22m3_cmpr_fly.mkv, 4625643 - "на лету".
Вот его опции:
ref=16 analyse=0x3:0x133 me=umh subme=10 me_range=24 trellis=2 bframes=8 b_adapt=2
direct=3 keyint_min=25 rc_lookahead=60

Вот опции veryslow:
--ref 16 --partitions all --me umh --subme 10 --merange 24 --trellis 2  --bframes 8 --b-adapt 2
--direct auto --rc-lookahead 60

Не знаю, почему свойства *.mkv, построенного ис несжатого файла, не сопвадают с опциями veryslow.
Так как же построить *.mkv "на лету", без создания файла чудовищного размера?
Например, для другого исходного файла, *.mkv в FuulHD, длительностью 4:24, *.y4m получился
размером 23520M.
Ниже - вывод mediainfo для этих трёх файлов.
(Нажмите, чтобы показать/скрыть)








Пользователь добавил сообщение 25 Февраля 2021, 09:27:32:
Оказалось, что "на лету" надо кодировать с "-f rawvideo", создаётся файл с теми же характеристиками,
что и при кодировании файла, созданного с "-f yuv4mpegpipe", Bits/(Pixel*Frames) тоже совпадает.
Размер *.mkv тоже почти такой же - 2326375, а при создании из файла 2333075.
Ещё раз привожу команду:
/usr/bin/ffmpeg -i Tu-22M3.mp4 -an -sn -map 0 -f rawvideo 2>/dev/null - | \
/usr/bin/x264 -v --log-level warning --input-res 640x352 --preset veryslow \
-o tu_22m3_cmpr_fly.mkv - > tu_22m3_fly.err 2>& 1
« Последнее редактирование: 25 Февраля 2021, 21:02:15 от Peter_I »
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Re: Перекодирование видеофайла "на лету"
« Ответ #1 : 03 Марта 2021, 23:06:19 »
Хочу добавить, что таким способом я кодировал слабосжатые mkv. Когда попытался так перекодировать
mkv, сжатый с h264 размером 1297M, то не получилось - там фреймов оказалось вдвое больше,
кодировался 4 часа и при этом результат оказался раза в 3,5 больше исходного.
Но получилось сжать его через файл с "-f yuv4mpegpipe", файл получился размером 227G,
при этом потребовалось задать ещё опцию "-strict -1", но перекодировалось нормально - и фреймов около 35 тысяч,
как и было со слабосжатым mkv, и кодировался 1ч17м, и результат имеет размер 209112К. Вот скрипт с командой:
(Нажмите, чтобы показать/скрыть)
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Re: Перекодирование видеофайла "на лету"
« Ответ #2 : 10 Апреля 2021, 15:23:28 »
Оказалось, что сжатие "на лету" с rawvideo работает неправильно, результат получается короче оригинала.
Я попробовал на фильме "Забавные игры" ("Funny Games"). Длина фильма - 1:49:13, извлечённая аудиодорожка
имеет ту же длину, а сжатый видеофайл получается длиной 1:45:44.
Если же сохранять y4m-файл, полученный с yuv4mpegpipe и кодировать его отдельно, то размер видеофайла
сохраняется. Размер y4m-файла в этом случае получился 451GB.
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Re: Перекодирование видеофайла "на лету"
« Ответ #3 : 21 Апреля 2021, 21:28:46 »
Оказалось, что я неправ - сжатие "на лету", через канал, тоже работает правильно,
если при кодировании явно указать частоту кадров. Я пробовал на том же фильме - Funny_Games.mkv
и результат получается одинаковый. Я задал fps как в источнике. Вот последний скрипт:
(Нажмите, чтобы показать/скрыть)
Кодировалось три часа.
Пётр.

 

Страница сгенерирована за 0.062 секунд. Запросов: 25.