LINUX.ORG.RU

Переработка видео с помошью ffmpeg


0

1

Была такая идея: разложить видеоряд некоторого *.mkv на кадры, изменить всем картинкам параметры «ширины» и «высоты», после чего слепить новый видеоряд и приклеить к нему звук их исходного файла. (Попрошу не обвинять меня в тупости - это не моя идея, но мне поручено выполнить данную прихоть). По идее, если соблюдать FPS, то вся операция ложится в три команды, однако:
1) При разборе на кадры с помощью FFMpeg за 24-27 минут видеоряда потерялось примерно 11 кадров;
2) При сборе видеоряд стал короче по времени более чем на 2,5 МИНУТЫ!
Как итог - жуткая рассинхронизация...
Подскажите как можно разложить видеоряд, обработать покадрово и слепить всё в новый файл...
ЗАРАНЕЕ НАСТОЯТЕЛЬНО ПРОШУ НЕ ПРЕДЛАГАТЬ МЕНКОДЕР И РЕКОДИНГ В НОВЫЙ РАЗМЕР ТИПА «FFMPEG -S» - моя задача РАЗОБРАТЬ видеоряд И СОБРАТЬ его с изменёнными кадрами (над которыми не я работаю). Количество кадров одно и то же, FPS всегда указывал вручную. Основной инструмент работы - ffmpeg-dev.

★★
Ответ на: комментарий от zzdnx

И видео промоталось за считанные секунды

Попробуй обновить mplayer. Похоже mplayer на -fps 24000/1001 не обращает внимания, хотя и пишет FPS forced to be 23.976 (ftime: 0.042). У меня команда mplayer -fps 24000/1001 video.h264 выполняется правильно, в логе нет строчек No pts value from demuxer to use for frame!,?% 0 0 (они были бы если не указать fps).

nickliverpool
()
Ответ на: комментарий от nickliverpool

Что такое мергуй?

GUI MkvToolNix ^_^

zzdnx ★★
() автор топика
Ответ на: комментарий от nickliverpool

mmg

Смотрю исходное видео - fps=24, добавляю в матрёшку так:

mkvmerge -o video.mkv  --forced-track 0:no --default-duration 0:24fps -d 0 -A -S -T --no-global-tags --no-chapters video.h264 --track-order 0:0
На что имею трек длинной 1:29, а исходный кусок был 1:31. Соответственно, при увеличении времени длительности видеопотока пропорционально будет расти и рассинхронизация, ибо собраный видеопоток будет становиться короче (проверил на аналогичном примере - видео 5:17 стало 5:11)

zzdnx ★★
() автор топика
Ответ на: mmg от zzdnx

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

nickliverpool
()
Ответ на: Разложил на кадры, после чего: от zzdnx

ИМХО, для этого удобно пользоваться графическим интерфейсом, добавил дорожки, проставил при необходимости fps у видеопотока, добавил теги и нажал Start muxing. На вкладке Muxing -> Show the command line можно посмотреть на сгенерированную команду (пригодится, например, если необходимо написать скрипт для обработки нескольких файлов). А значение «24000/1001» мергуй спокойно скушает.

nickliverpool
()
Ответ на: комментарий от nickliverpool

Я давно пользуюсь мергуем, и видеопоток запихивал в матрёшку именно через ГПИ, а команду скопировал только чтобы привести готовое выражение консоли, с назначенным вручную fps. Теперь о видео. Оно собирается 1:1 при условии разобрать-собрать (проверял), а если разобрать-ресайзнуть_кадры-собрать - происходит рассинхронизация. Возможно, моя рассинхронизация связана с тем фактом что я назначил fps как «24», когда надо «24000/1001». О передаче тестового видео - сегодня я отчаливаю из дома и вернусь только 10-11-го числа и очень надеюсь на помошь по моему возвращению.

zzdnx ★★
() автор топика
Ответ на: комментарий от nickliverpool

Хорошо, договорились. Пока докладываю о новом эксперементе:

$ mencoder mf://*.png -mf fps=24000/1001:type=png -of rawvideo -nosound -ovc x264 -x264encopts crf=19 -o video.h264
После чего собрал мерГУЙем с FPS=«24000/1001». Исходное видео было 1:31, а врезультате получил 1:29. Входной поток кадров был создан из разложения исходного ролика с последующим изменением размера до 10% от оригинала и корректировки результата командой «mogrify -type palettematte PNG24:*.png»

zzdnx ★★
() автор топика
Ответ на: комментарий от zzdnx

Думаю, проблема в

изменением размера до 10% от оригинала

Вполне возможно при этом преобразовании у нескольких кадров меняется цветовое пространство и попытка это исправить с помощью команды mogrify -type palettematte PNG24:*.png в твоем случае ничего не исправляет.

Чтобы убедиться в этом попробуй:

Уменьшать размер кадра сразу при захвате, добавив опцию scale, как-то так:

mplayer -vo png:z=3 -nosound -vf scale=192:108 inputfile
После этого закодировав, все должно быть хорошо.

И, думаю, стоит посчитать у исходного и полученного файла количество кадров. Сделать это можно так (http://superuser.com/questions/84631/how-do-i-get-the-number-of-frames-in-a-video-on-the-linux-command-line):

ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1
Если имя файла содержит пробелы, имя файла необходимо заключить в двойные кавычки.

nickliverpool
()
Ответ на: комментарий от nickliverpool

Отвечу после завтра - внеплановая контрольная по ТФКП, некогда эксперементы ставить...

zzdnx ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.