Показать сообщение отдельно
Старый 08.09.2010, 19:16 Вверх   #1
Fedoraвод
 
Аватар для Злой
Злой вне форума
Доп. информация
По умолчанию Быстрая конвертация любого видео в hd flv (f4v)

Пользователи винды радуются по любому возможному поводу когда находят любое преимущество их операционной системы над nix системами. Но эти плюсы часто являются минусами, так как кажущийся плюс на самом деле это не знание возможностей пингвина и только.
Итак на повестке дня - создание видео для онлайн просмотра. Обязательные условия - минимальный размер, хорошее качество и быстрая конвертация.
Инструменты: mencoder, ffmpeg, x264, MP4Box, и mediainfo. Соглашусь что многовато, но оно того стоит.
Приступим. Для начала нужно поставить на вашу линукс систему x264, мануалы есть для всех дистрибутивов, проблем возникнуть не должно, затем ставим mencoder, причем в опциях нужно указать поддержку x264 и aac, затем ставим ffmpeg, также указываем всевозможные отключенные опции, будь то несвободные библиотеки и все те же x264 и aac. Прошу заметить что пользователям убунты придется компилировать ffmpeg из исходников, так как в репозиториях он настолько обрезан что ничего с ним дельзя будет делать (зачем это сделано - для меня загадка). Итак если вы прошли успешно эти три пункта - то я вас обрадую, самое сложное позади. Осталось только поставить пакеты mediainfo и gpac (в состав которого входит MP4Box). В убунту все это ставится с помощью sudo apt-get install ... , причем в репах они вполне работоспособны.
Приступим к описанию самого процесса конвертации видео.
Берем любой видео файл, например video.avi или video.mkv.
Этап обработки будет следующий, нам нужно переконвертировать видеоряд в h264 а звук в aac, и запихнуть все это в flv.
Это делается при помощи ffmpeg с помощью одной строчки:
Код:
ffmpeg -i video.mkv -vcodec libx264 -b 500k -vpre hq -acodec libfaac -ab 112k -ac 2 -threads 0 -f flv video.flv
Вот так легко и просто. Но у этого метода есть существенный недостаток - низкая скорость кодирования, т.к. ffmpeg задействует только одно ядро процессора. Согласитесь что это очень неразумно в эпоху двух - четырех ядерных процов. Ваш покорный слуга сидит на двухведерном атлоне и рещил побороть проблему нерационального использования процессорного времени, которое переходит в нерациональную трату реального времени. И помог мне в этом mencoder, он лишен недостатка однопоточности.
Но это одна сторона медали, есть у менкодера и существенный недостаток, который мешает использовать его напрямую для создания flv. Все дело в том что он не может муксить h264 видео в контейнер flv, предальски доказывая что они не совместимы, но мы то знаем где собака порылась )))
Да и фиг с ним, главное чтобы в mp4 муксил, а дальше перемуксить при помощи ffmpeg будет не проблема. Но тут кроется второй подводный камень, хоть в конфигах и указано что mencoder подддерживает мукс в mp4 - это не так, на выходе фактически мы получаем avi с названием видео.mp4, что является очень большой досадой.
Но опятьже - фиг с ним, значит будет конвертить h264/aac и муксить в avi, делается это следующей командой:
Код:
mencoder -oac faac -faacopts br=112:object=2 -channels 2 -srate 48000 \
-ovc x264 -x264encopts threads=auto:crf=27 \
video.mkv -o "video.avi"
На выходе у нас получился чистый mp4 но в контейнере avi.
А нам нужен flv. Можно попытаться перемуксить в flv при помощи ffmpeg, команда выглядит вот так:
Код:
ffmpeg -i video.avi -vcodec copy -acodec copy -threads 0 -f flv "video.flv"
Мукс происходит со скоростью копирования, т.е. секунды. Метод рабочий, но не универсальный. с некоторыми типами видео можно получить афигительный рассинхрон видео и звука. По этому я рекомендую использовать второй способ.
полученное с помощью менкодера видео разбиваем на потоки, например тем же менкодером:
Код:
mencoder temp.avi -ovc copy -oac copy -of rawvideo -o video.h264 -nosound
mencoder temp.avi -ovc copy -oac copy -of rawaudio -o audio.aac
на выходе получаем чистый звук и видео без контейнера, можно было изначально конвертить только звук и только видео из исходника, кому как больше нравится.
далее нам нужно собрать эту солянку в mp4 контейнер, припомощи MP4Box. Для этого нам нужно знать частоту кадров нашего видеоряда. Поскольку частоту кадров мы не меняли прикодировании менкодером то она будет такой же как и у исходного видео. Тут на помощь придет утилита mediainfo.
Можно посмотреть fps через её гуи и поставить в командную строку, но я не сторонник такого метода, пусть лучше скрипт сам все смотрит, синтаксис будет следующим:
Код:
FR=$(mediainfo --Inform="Video;%FrameRate%" "tmp/temp.avi");

MP4Box -add video.h264 -fps "$FR" -add audio.aac output.mp4
В первой строке через mediainfo получаем fps нашего видео, во второй собираем с помощью MP4Box наши исходники видео с mp4 контейнер.
Итак, мы имеем mp4 видео, его нам нужно перемуксить в flv, как я писал выше, делается это вот как
Код:
ffmpeg -i output.mp4 -vcodec copy -acodec copy -threads 0 -f flv temp.flv
Конечная цель достигнута. на выходе мы имеем flv файл готовый к выкладке на любой видеосервер и будет проигрываться в любом плеере.

Но это не все, у нашего файла есть оин маленький недостаток, у него не прописаны метаданные, которые нужны для перемотки (стриминга) в неподгруженную область видео. Т.е. видео бужет показывать, и перематывать по загруженной области, а неподгруженную - нет.
Исправить это можно утилитой yamdi, ставится она из репозиториев и успешно фунциклирует. Прогон ей выглядит вот как
Код:
yamdi -i temp.flv -o temp2.flv -l
Теперь перемотка пашет
Это был заключительный этап создания видео. С первого взгляда покажется все очень сложным и муторным, и не каждый отважится набирать столько команд в консоли. А я вам отвечу - и не нужно, создаем пустой файл под названием flv.sh, делаем его исполняемым и закидываем в него следующее
Код:
rename 's/ /_/gi' *.mkv *.avi *.srt *.mp4
mkdir out;
mkdir tmp; 

for f in *.mkv *.avi *.flv *.mp4;
do
 if [ -f "$f" ]
 then
  {

mencoder -oac faac -faacopts br=112:object=2 -channels 2 -srate 48000 \
-ovc x264 -x264encopts threads=auto:crf=27 \
"$f" -o "tmp/temp.avi"

mencoder "tmp/temp.avi" -ovc copy -oac copy -of rawvideo -o "tmp/video.h264" -nosound
mencoder "tmp/temp.avi" -ovc copy -oac copy -of rawaudio -o "tmp/audio.aac"

FR=$(mediainfo --Inform="Video;%FrameRate%" "tmp/temp.avi");

MP4Box -add "tmp/video.h264" -fps "$FR" -add "tmp/audio.aac" "tmp/output.mp4"

ffmpeg -i "tmp/output.mp4" -vcodec copy -acodec copy -threads 0 -f flv "tmp/temp.flv"

yamdi -i "tmp/temp.flv" -o "out/${f%.avi}.flv" -l

rm "tmp/temp.avi" ;
rm "tmp/video.h264" ;
rm "tmp/audio.aac" ;
rm "tmp/output.mp4" ;
rm "tmp/temp.flv" ;

}
 else
  echo "нет файла: $f"
 fi
done
sleep 1800s;
Кидаем этот скрипт в папку с видео которое хотим переконвертить, кликаем два раза мышкой, выбираем пункт "выполнить" и данный скрипт сам уберет пробелы из имен видеофайлов, переконвертирует по всем правилам и положит видео в папочку out.
Вот как все легко и просто.
Скорость конвертирования данным методом на 30 - 50 % выше чем при использовании только ffmpeg.
Качество выходного вайла регулируется опцией crf=27 в команде менкодера, эта опция принимает значение от 0 до 50, 0 - исходное качество, 50 - наихудшее качество, я для себя остановился на 27, качество практически не страдает и скорость конвертиования примерно 10-12 минут на 23 минутный ролик ))
Скажу еще что такое кодирования на виндовс займет примерно в 4 раза больше времени, что не может не радовать все линкусоидов )) Пингвины рулят как всегда!
Всем пис, задавайте вопросы если что не понятно, рад буду ответить


ЗлойЪ, Специально для Бормотухи.НеТ

Последний раз редактировалось Serberg; 08.09.2010 в 20:53..
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
 
Время генерации страницы 0.08243 секунды с 10 запросами