Бормотухи.НЕТ

Вернуться   Бормотухи.НЕТ > Компьютеры > Операционные системы > Linux
Расширенный поиск

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 20: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 в 21:53..
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Старый 08.09.2010, 21:54 Вверх   #2
Коварный тип
 
Аватар для Serberg
Serberg вне форума
Доп. информация
По умолчанию

Респект.

ps
Нашел в тексте одна грамматическую ошибку.
исправил )
  Ответить с цитированием
Старый 17.02.2012, 19:16 Вверх   #3
Опытный пользователь
 
Аватар для Tauren
Tauren вне форума
Доп. информация
По умолчанию

Здравствуйте Злой! А Вы можете описать подробно, как этот скрипт использовать если стоит Windows 7
У меня не получается. Я создаю файл только с расширением .cmd туда вставляю этот скрипт, и ложу вместе с video запускаю его. И в итоге быстро появляются две пустые папки tmp и out. Подскажите в чем ошибка
Код:
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;
  Ответить с цитированием
Старый 17.02.2012, 22:07 Вверх   #4
Fedoraвод
 
Аватар для Злой
Злой вне форума
Доп. информация
По умолчанию

Tauren, это скрипт командной оболочки bash, которая является той самой ненавистной всеми командной строкой линукса, хотя на самом деле это манна небесная и нужно за неё руки целовать разработчикам.

По умолчанию в винде он работать не будет. Возможно есть порт bash"а на винду, так как большинство опен сорс программ легко переписать под любую операциоку. Но я не вкурсе этих дел. Гугли сам. Если найдешь баш под винду то думаю что с небольшими переделками он заработает. Но это будет что то подобное некрофилии, так как обрабатывает видео не сам скрипт а программы, про которые здесь написано, а скрипт просто управляет ими. Это подводит к логическому результату, что не стоит вообще этим заниматься, так как придется из винды сделать по сути линукс.

ЗЫ папки создаются только по случайному стечению обстоятельств, при которых консольные команды создания папок в баш и кмд винды одинаковы.

Последний раз редактировалось Злой; 17.02.2012 в 22:17..
  Ответить с цитированием
Cказали cпасибо:
Старый 17.02.2012, 22:27 Вверх   #5
Опытный пользователь
 
Аватар для Tauren
Tauren вне форума
Доп. информация
По умолчанию

Спасибо за ответ.
А есть ли другой способ конвертации видео в hd flv?
  Ответить с цитированием
Старый 17.02.2012, 22:50 Вверх   #6
Fedoraвод
 
Аватар для Злой
Злой вне форума
Доп. информация
По умолчанию

Tauren, открою маленький секрет, способ конвертации в hd онлайн видео всего один, независимо от операционной системы.
Во всех программах используется кодек x264, при желании можно только им видео конвертировать. Но это не всегда удобно.
Если без винды никак то почитай вот это http://www.bormotuhi.net/showthread.php?t=10441
  Ответить с цитированием
Cказали cпасибо:
Старый 17.02.2012, 22:56 Вверх   #7
Опытный пользователь
 
Аватар для Tauren
Tauren вне форума
Доп. информация
По умолчанию

Спасибо тебе Злой за советы буду изучать
  Ответить с цитированием
Старый 24.06.2012, 18:03 Вверх   #8
Новичок
 
Аватар для rulet
rulet вне форума
Доп. информация
По умолчанию

Злой, а какую бы ты команду порекомендовал для сжатия исходного mp4 в тот же mp4 только меньшего размера? Т.е., не используя формат flv.
  Ответить с цитированием
Старый 25.06.2012, 12:46 Вверх   #9
Fedoraвод
 
Аватар для Злой
Злой вне форума
Доп. информация
По умолчанию

Цитата Сообщение от rulet Посмотреть сообщение
а какую бы ты команду
не команду а программу, имя ей x264, но напрямую работать с ней неудобно, лучше использовать ffmpeg или mencoder. Что собственно и описано в этой статье.
  Ответить с цитированием
Старый 25.06.2012, 13:55 Вверх   #10
Новичок
 
Аватар для rulet
rulet вне форума
Доп. информация
По умолчанию

Да, именно это я и имел ввиду. Т.е., другими словами, какую конкретную команду ffmpeg для сжатия существующего mp4 можно применить?
  Ответить с цитированием
Старый 26.06.2012, 10:13 Вверх   #11
Fedoraвод
 
Аватар для Злой
Злой вне форума
Доп. информация
По умолчанию

Цитата Сообщение от rulet Посмотреть сообщение
какую конкретную команду ffmpeg для сжатия существующего mp4 можно применить?
Код:
ffmpeg -i video.mp4 -vcodec libx264 -b 500k -vpre hq -acodec libfaac -ab 112k -ac 2 video_new.mp4
  Ответить с цитированием
Старый 26.06.2012, 11:25 Вверх   #12
Новичок
 
Аватар для rulet
rulet вне форума
Доп. информация
По умолчанию

Спасибо за ответ.
Я уже откопал свой старый пост с другого форума. Для новых версий ffmpeg я использовал это:

ffmpeg -i input.mp4 -acodec copy -vcodec libx264 -preset slow -tune film -profile main -crf 29 -threads 0 output.mp4


Меняя параметры -preset и -crf можно менять размер и соответственно качество ролика.
  Ответить с цитированием
Ответ

Метки
ffmpeg, mencoder, ubuntu, x264

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Вопрос] DLE2WP (конвертация баз DLE в WP) FreeD WordPress 1 27.02.2015 00:37
нужна быстрая конпка бана dyukin vBulletin 4.x 7 12.06.2011 23:52
[Вопрос] Альбом+быстрая загрузка+настройка Pavlushka vBulletin 3.х 6 08.08.2010 15:04
[Вопрос] Конвертация БД. ITA forum -> vB kadet vBulletin 3.х 0 26.07.2010 08:58
11 женских пунктиков: они сведут с ума любого мужчину! Strannik Различия полов и их особенности 0 04.10.2009 01:06


Текущее время: 16:11. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
 

Время генерации страницы 0.16437 секунды с 12 запросами