Кодирование видео для веб-проектов

image
Доброго времени суток.
Многим web-программистам рано или поздно нужно работать с видео. Такая задача возникла и у меня.
В Интернете есть много статей на форумах и блогах, как на русскоязычных, так и на зарубежных сайтах. Но, проделавши, так же как и предлагалось в инструкциях — результата ожидаемого не дало. Что и послужило поводом для этой статьи. Думаю, она поможет таким же как и я многим начинающим.

Приступим


Все производилось под рутом на машине с Ubuntu 11.04 (Natty Narwhal).
root@r2d2:~# uname -a
Linux r2d2 2.6.35-30-generic #57-Ubuntu SMP Tue Aug 9 18:00:33 UTC 2011 i686 GNU/Linux

Сначала удалим старое установленное, если оно присутствует

root@r2d2:~# apt-get remove ffmpeg x264 libx264-dev

Обновляем список пакетов

root@r2d2:~# apt-get update && apt-get upgrade

Устанавливаем нужное

root@r2d2:~# apt-get install build-essential checkinstall git git-core libfaac-dev libfaad-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev subversion texi2html yasm zlib1g-dev libavcodec52 mencoder

Устанавливаем библиотеку для кодирования видеопотоков H.264

Почитать подробнее можно тут и тут.
root@r2d2:~# git clone git://git.videolan.org/x264.git
root@r2d2:~# cd x264
root@r2d2:~/x264# ./configure --enable-shared 

Тут нужно сделать отступление. При конфигурировании x264 БЕЗ параметра --enable-shared библиотека будет инсталлироваться в каталог по умолчанию (у меня это /usr/local/bin) и при запуске ffmpeg будет выдавать ошибку о неизвестном местоположении библиотеки libx264:
ERROR: libx264 not found

С параметром --enable-shared результат после команды checkinstall будет следующим:
install -d /usr/local/bin
install x264 /usr/local/bin
install -d /usr/local/include
install -d /usr/local/lib
install -d /usr/local/lib/pkgconfig
install -m 644 x264.h /usr/local/include
install -m 644 x264_config.h /usr/local/include
install -m 644 x264.pc /usr/local/lib/pkgconfig
ln -f -s libx264.so.116 /usr/local/lib/libx264.so
install -m 755 libx264.so.116 /usr/local/lib

При установке на Debian также были проблемы с библиотекой libx264.
Помог параметр --prefix=/shared при конфигурировании x264.
root@r2d2:~/x264# make
root@r2d2:~/x264# checkinstall -fstrans=no -install=yes -pkgname=x264 -pkgversion «1:0.svn`date +%Y%m%d`« -default

Установка ffmpeg

Почитать подробнее можно тут и тут.
root@r2d2:~# svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
root@r2d2:~# cd ffmpeg
root@r2d2:~# ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab
root@r2d2:~# make
root@r2d2:~# checkinstall -fstrans=no -install=yes -pkgname=ffmpeg -pkgversion «4:0.5+svn`date +%Y%m%d`« -default

В результате имеем:
root@r2d2:~# x264 --version
x264 0.116.2074 2641b9e
built on Sep  6 2011, gcc: 4.4.5
configuration: --bit-depth=8
x264 license: GPL version 2 or later

root@r2d2:~# ffmpeg -version
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Sep  6 2011 09:26:49 with gcc 4.4.5
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab
libavutil     50.36. 0 / 50.36. 0
libavcore      0.16. 1 /  0.16. 1
libavcodec    52.108. 0 / 52.108. 0
libavformat   52.93. 0 / 52.93. 0
libavdevice   52. 2. 3 / 52. 2. 3
libavfilter    1.74. 0 /  1.74. 0
libswscale     0.12. 0 /  0.12. 0
libpostproc   51. 2. 0 / 51. 2. 0
FFmpeg SVN-r26402
libavutil     50.36. 0 / 50.36. 0
libavcore      0.16. 1 /  0.16. 1
libavcodec    52.108. 0 / 52.108. 0
libavformat   52.93. 0 / 52.93. 0
libavdevice   52. 2. 3 / 52. 2. 3
libavfilter    1.74. 0 /  1.74. 0
libswscale     0.12. 0 /  0.12. 0
libpostproc   51. 2. 0 / 51. 2. 0

Теперь, если набрать в консоли
ffmpeg -threads 4 -y -i "video.avi" -vcodec libx264 -vpre "hq" -b 2000k -acodec libfaac -ar 44100 -ab 128k -ac 2 "video.flv"
на выходе получаем сконвертированый файл, который можно использовать в своих целях.

Немного о параметрах конвертации

-i — имя исходного файла;
-ar — частота дискретизации звука (должна быть кратна 11кГц);
-ab — аудио битрейт;
-ac — количество каналов звука (1 — моно, 2 — стерео);
-f — формат исходящего видео-файла;
-b — битрейт видео (30k, 200k, 512k, 1024k);
-maxrate — максимальный битрейт кодирования видеопотока (9000k);
-r — кадров в сек (FPS);
-s — размер видео в пикселях;
-fs — установить максимальный размер выходного файла;
-vpre — файл с предустановленными параметрами конвертирования (preset);
-ss 00:02:00 — смещение по времени от начала файла (position). Здесь: пропустить первые 2 мин (сдвиг в сек.). Задается в сек. или временем в формате: hh:mm:ss[.xxx];
-vframes — ограничение на количество кадров видео;
-y — перезаписать файл, если он уже существует;
-aspect — соотношение сторон(4:3, 16:9, 1.3333);
-acodec — аудио-кодек (libfaac, aac, libmp3lame);
-vcodec — видео-кодек (libx264);
-threads 0 — количество ядер в компьютере. Значения: 0 — 4. 0 — автоматически определить количество ядер процессора и использовать их в процессе работы.

ffmpeg имеет файлы с предустановленными настройками для кодирования. Они находятся в папке ffmpeg/ffpresets
root@r2d2:~/ffmpeg/ffpresets# ls -al
libx264-baseline.ffpreset
libx264-faster.ffpreset
libx264-faster_firstpass.ffpreset
libx264-fast.ffpreset
libx264-fast_firstpass.ffpreset
libx264-ipod320.ffpreset
libx264-ipod640.ffpreset
libx264-lossless_fast.ffpreset
libx264-lossless_max.ffpreset
libx264-lossless_medium.ffpreset
libx264-lossless_slower.ffpreset
libx264-lossless_slow.ffpreset
libx264-lossless_ultrafast.ffpreset
libx264-main.ffpreset
libx264-medium.ffpreset
libx264-medium_firstpass.ffpreset
libx264-placebo.ffpreset
libx264-placebo_firstpass.ffpreset
libx264-slower.ffpreset
libx264-slower_firstpass.ffpreset
libx264-slow.ffpreset
libx264-slow_firstpass.ffpreset
libx264-superfast.ffpreset
libx264-superfast_firstpass.ffpreset
libx264-ultrafast.ffpreset
libx264-ultrafast_firstpass.ffpreset
libx264-veryfast.ffpreset
libx264-veryfast_firstpass.ffpreset
libx264-veryslow.ffpreset
libx264-veryslow_firstpass.ffpreset

И после установки должны находиться в /usr/local/share/ffmpeg/. По названию файла можно догадаться, за что отвечает определенный файл. Подробнее об этих файлах можно почитать по вышеуказанным ссылкам

Файл с настройками, который используется в примерах
root@r2d2:/usr/share/ffmpeg# cat libx264-hq.ffpreset
coder=1
flags=+loop
cmp=+chroma
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
me_method=umh
subq=8
me_range=16
g=250
keyint_min=25
sc_threshold=40
i_qfactor=0.71
b_strategy=2
qcomp=0.6
qmin=10
qmax=51
qdiff=4
bf=3
refs=4
directpred=3
trellis=1
flags2=+wpred+mixed_refs+dct8x8+fastpskip

Откат от всего установленного

root@r2d2:~# apt-get remove build-essential checkinstall git git-core libfaac-dev libfaad-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev subversion texi2html yasm zlib1g-dev libavcodec52 mencoder x264 ffmpeg

Получении информации о видео с помощью PHP

Для получения информации о видео я использую немного переделаную функцию, которую нашел в этом посте.
function get_video_size($videofile) {
    define('MAX_VIDEO_WIDTH', 200);
    $vwidth = 0;
    $vheight = 0;
    $owidth = 0;
    $oheight = 0;
    $duration = array();
    $bitrate = 0;
    $audio_bitrate = 0;
    $sfrequency = 0;

    ob_start();
    passthru('ffmpeg -i "' . $videofile . '" 2>&1 | egrep -e "(Duration|Stream)"');
    $ffmpeg_output = ob_get_contents();
    ob_end_clean();

    if (sizeof($ffmpeg_output) == 0) {
        return null;
    }

    foreach (explode("\n", $ffmpeg_output) as $line) {
        $ma = array();
        // get duration and video bitrate
        if (strpos($line, 'Duration:') !== false) {
            preg_match('/(?<hours>\d+):(?<minutes>\d+):(?<seconds>\d+)\.(?<fractions>\d+)/', $line, $ma);
            $duration = array(
                'raw' => $ma['hours'] . ':' . $ma['minutes'] . ':' . $ma['seconds'],
                'hours' => intval($ma['hours']),
                'minutes' => intval($ma['minutes']),
                'seconds' => intval($ma['seconds']),
                'fractions' => intval($ma['fractions']),
                'rawSeconds' => intval($ma['hours']) * 60 * 60 + intval($ma['minutes']) * 60 + intval($ma['seconds']) + (intval($ma['fractions']) != 0 ? 1 : 0)
            );

            preg_match('/bitrate:\s(?<bitrate>\d+)\skb\/s/', $line, $ma);
            $bitrate = $ma['bitrate'];
        }

        // get video info
        if (strpos($line, 'Video:') !== false) {
            preg_match('/Stream #(?:[0-9\.]+)(?:.*)\: Video: (?P<videocodec>.*) (?P<width>[0-9]*)x(?P<height>[0-9]*)/', $line, $ma);
            $vheight = $oheight = $ma['width'];
            $vwidth = $owidth = $ma['height'];
        }

        // get audio info
        if (strpos($line, 'Audio:') !== false) {
            preg_match('/,\s(?<sfrequency>\d+)\sHz,/', $line, $ma);
            $sfrequency = $ma['sfrequency'];

            preg_match('/,\s(?<bitrate>\d+)\skb\/s/', $line, $ma);
            $audio_bitrate = $ma['bitrate'];
        }
    }

    // calculate new size of the video
    if ($vwidth > MAX_VIDEO_WIDTH) {
        $coef = $vheight / $vwidth;
        $vwidth = MAX_VIDEO_WIDTH;
        $vheight = round($vwidth * $coef);
    }

    // frame size must be a multiple of 2
    $vwidth = $vwidth % 2 != 0 ? $vwidth - 1 : $vwidth;
    $vheight = $vheight % 2 != 0 ? $vheight - 1 : $vheight;

    return array(
        'width' => $vwidth,
        'height' => $vheight,
        'srcWidth' => $owidth,
        'srcHeight' => $oheight,
        'duration' => $duration,
        'bitrate' => $bitrate,
        'audioBitrate' => $audio_bitrate,
        'audioSampleFrequency' => $sfrequency
    );
}

В итоге имеем готовый пример

$ffmpeg_path = 'ffmpeg'; // Путь к ffmpeg
$in = 'ATB - Let You Go.avi'; // Входящий файл
$out = 'ATB - Let You Go.flv'; // Исходящий файл

$video = get_video_size($in);
$hq = 'hq'; // Подключаем файл с предустановленными настройками

$command = $ffmpeg_path . ' -threads 0 -y -i "' . $in . '" -vcodec libx264 -vpre "' . $hq . '" -b ' . $video['bitrate'] . 'k -s ' . $video['width'] . 'x' . $video['height'] . ' -acodec libfaac -ar ' . $video['audioSampleFrequency'] . ' -ab ' . $video['audioBitrate'] . 'k -ac 2 "' . $out . '"';
$conv = exec($command);
Поделиться публикацией

Комментарии 57

    +3
    Для получения информации о видео можно поставить модуль для php ffmpeg
      +1
      Многие на него ругаются, мол, определять размер видео нужно редко, а память будет кушаться всегда.
      0
      Хотелось бы продолжения как это потом показывать и т.д.
      Спасибо за статью!
        +5
          +2
          ну и apt-get/yum/brew install ffmpeg
            0
            В репах старые версии ffmpeg, самый вкусный свежак для корректной работы с webM, x264 и прочими вкусняшками. Да и x264 в репах устаревший.
              0
              Статья для начинающих. Да и в случае желательности свежака можно использовать другие репозитории, посвежее.

              Можно и собрать самому, но обычно к этому времени человек уже способен собрать ffmpeg и сам.
                0
                Да, репы по-любому где-нибудь есть свежие, уверен на launchpad есть ppa правильный :)
          +7
          Вот тольк одно непонятно, зачем автор гонит x264 в контейнер flv? Flash умеет и mp4 контейнер играть, а вот модули, например к nginx, реализующие псевдостриминг работают или с flv контейнером и родным кодеком (flv модуль) или x264 и только с mp4 контейнером (x264_streaming_module). Поэтому выгоднее кодить в mp4 сразу
            0
            У меня nginx со штатным flv модулем, и псевдостриминг работает для h264 в flv конвертере.
              0
              Неужели Сысоев приделал x264 стриминг в flv? Пойду почитаю. Но верится с трудом
                0
                Поглядел, в changes изменений не видно. Значит кто-то что-то путает
                  0
                  Стриминг flv в nginx существует ооочень давно.
                  А вот стриминг mp4 использовать крайне не рекомендуется.
                    0
                    Сысоев ничего не менял.

                    flv модуль nginx принимает смещение файла в байтах. Поэтому он может хоть tar стримить ))
                    Другое дело, будет ли тот поток данных, которые вернёт nginx, пригодным для проигрывания видео.

                    Я сам не понимаю, почему у меня всё работает. Ведь для h264 в mp4 контейнере смещение передаётся не в байтах, а в секундах и серверу приходится напрягаться чтобы определить правильное смещение.

                    Скорее всего мне просто везёт и работает всё весьма условно. Перемотка, наверное, очень неточная получается. Я думаю, многое ещё зависит от плеера. У меня используется JW Player 5.
                      +1
                      Ха. Вот и вылезла проблема с перемоткой, на которую я наткнулся в том числе. На самом деле — flv модуль не умеет по честному стримить x264 внутри flv. Он тупо его отдает как range. Что сносит голову любому плееру. Ибо при этом не отдаются никакие равильные метаданные.

                      >А вот стриминг mp4 использовать крайне не рекомендуется.

                      Не рекомендуется опять же в лоб. Дело вот в чем. Так как для mp4 требуется смещение в секундах, то модулю надо найти соответствующий byte range. Решается прогоном через mp4box с перемещением метаданных в начало, и принудительным хинтингом, к примеру по умолчанию, в 500 мс. При этом плееру отдаются метаданные с соответсвием time-keyframe-byte-offset. По которым программер плеера должен делать принудительно seek в обозначенные позиции времени. При этом модулю не приходится «елозить» по файлу в поисках нужного офсета, ибо он знает его из метаданных.

                      В девелоперских целях оно у нас работает именно на том x264 модуле, без проблем
                        0
                        В flv можно (нужно) точно так же запихнуть в начало метаданные. yamdi в помощь.

                        А модуль nginx с метаданными mp4 знаком, чтобы не приходилось елозить?
                          +1
                          > В flv можно (нужно) точно так же запихнуть в начало метаданные. yamdi в помощь.

                          Да, у нас это используется. Только вот стоковый flv модуль был сделан для отдачи flv (доставляет строка «static u_char ngx_flv_header[] = „FLV\x1\x1\0\0\0\x9\0\0\0\x9“;»).

                          > А модуль nginx с метаданными mp4 знаком, чтобы не приходилось елозить?
                          Ну скажем так. Ввиду того, что написан он довольно коряво, ему это необязательно. Исходя из запрошенного времени, битрейта каждого трека и т.п. инфы о ролике, он находит offset до ближайшего keyframe «математикой». Почему в кавычках? А вот именно потому, что он дергает не метаданные (которых может и не быть, что логично), а делает анализ стуктуры файла, и после этого делает вырезку куска из каждого трека. То есть файл практически всегда читается полностью. Именно поэтому нагрузка на диск больше, а не потому что он «елозит» по файлу.
                          По сути — когда в особо неудачном mp4 файле нет ни метаданных, ни хинтинга, модуль тот читает весь файл, и по сути собирает все метаданные заново, основываясь на которых выдергивает нужные куски треков, выровненные по ключевым кадрам.
                            +1
                            Это как вы себе представляете mp4 файл без метаданных?

                            mdat атом без moov невозможно восстановить. В нём всегда есть метаданные. Другой вопрос в том, что фреймы могут идти неравномерно. flv всё таки полу-потоковый формат, а mp4 чисто файловый контейнер.
                              0
                              Mod-H264-Streaming-Nginx-Version2 собственно и использует парсинг всей этой фигни (mdat atom moov) для нахождения вырезанию нужного. Имелось ввиду, что он не использует те «метаданные», которые использует Flash, и которые, насколько я понимаю, и переносят в начало всякие MP4Box и Yamdi
                                +1
                                flash не использует никакие метаданные для seek-а, хотя как раз мог бы.

                                MP4Box переносит вперед moov атом. Это нужно для того, что бы при скачивании mp4 файла можно было уже сразу понять, как разложены данные в mdat и начать сразу проигрывать.

                                yamdi вообще mp4 не обрабатывает.
                                  0
                                  >yamdi вообще mp4 не обрабатывает

                                  Yamdi применительно к FLV конечно же. MP4Box/qt-faststart для MP4

                                  >flash не использует никакие метаданные для seek-а, хотя как раз мог бы.

                                  Решается програмным путем, я уже описывал как. По событию OnMetadata можно дернуть метаданные, включая два массива: 'filepositions' и 'times'. Первый задает соответствие keyframes->bytes, второй keyframes->times. Соответственно можно плеером прыкать четк по ключевым кадрам (при этом прося у flv модуля байты, а у mp4 модуля время)
                            0
                            Через qt-fastart переместить в мп4 метаданные в начало и будет нормально стримить nginx
                            0
                            Может, я чего не так делал, но файлики, прогнанные через MP4Box почему-то отказываются нормально воспроизводиться на iУстройствах, остановился на qt-faststart. Особо не разбирался почему и что там криво работало — замену нашел и ладно.
                              0
                              А потому что iDevices расчитаны на слегка другую упаковку, которая ближе к quicktime mp4.
                                +1
                                чем она другая то?
                                  0
                                  Тем что ноги ее растут из QuickTime и изначально qt-faststart служил как раз для хинтинга mov. И стриминга через QT/Darwin Streming Server
                  +1
                  Жаль не растрыта тема cfr и 2pass кодирования видео, а также параметров пресетов.
                  Стандартное кодирование видео — это хорошо, но если вам нужно балансировать между хорошим качество и размером видео — необходимо создавать свои пресеты, а также выбирать метод анализа видео изходя из ожидаемого результата, и времени, которого надо потратить на конвертацию.
                    +2
                    Ну эта тема гораздо обширнее, чем 200 параметров libx264 степень влияния на результат которых, может свести с ума =)

                    Вам же требуется многомерная оптимизация по следующим характеристикам:
                    1) результирующее качество
                    2) битрейт
                    3) флуктуации битрейта
                    4) время сжатия

                    Могу по своим наблюдениям сказать: один из самых сильно влияющих параметров — это qpmin
                    Если он ниже 25, то условно SD на атоме не сжимается. Если выше, то сжимается с запасом.
                    Второй очень важный параметр — subme. Если его опустить с 5 до 3, то скорость сжатия может без особого изменения битрейта увеличиться в два-три раза.

                    Остальные параметры так же важны, но они не на каждом видео дают такой же резкий и хорошо наблюдаемый результат.
                    +1
                    Тут нужно сделать отступление. При конфигурировании x264 БЕЗ параметра --enable-shared библиотека будет инсталлироваться в каталог по умолчанию (у меня это /usr/local/bin) и при запуске ffmpeg будет выдавать ошибку о неизвестном местоположении библиотеки libx264

                    На сколько я помню без параметра --enable-shared библиотека не будет собираться ВООБЩЕ. Будет скомпилирован только исполняемый x264 (для чего он нужен — не знаю).
                    Ну и собственно именно с параметром --enable-shared бибилотека БУДЕТ устанавливаться в каталог по-умолчанию, что и показал вам checkinstall.
                    А еще есть параметр --enable-static.

                    Помог параметр --prefix=/shared при конфигурировании x264.

                    Интересно, чем? И зачем засорять корень всякими сомнительными директориями?
                      0
                      Помог тем, что с ним все заработало
                        +1
                        Не верю что помог именно он.
                        Вообще с трудом представляю ситуацию, когда компилятор захотел бы искать библиотеки в нестандартных местах, если только перед этим ему не подсказали искать их именно там.
                      0
                      Хотелось бы узнать возможно ли в процессе захвата видео с устройства выбирать отдельный источник аудио и как это сделать. Рыл доки — не нашёл внятного описания.
                        +1
                        pornhub.com своими руками.))
                          0
                          Жаль, что не описан процесс кодирования в h264 + mp4. Кодировать в flv-контейнер — это еще ничего, а вот когда нужен h264, да еще и с псевдостримингом — вот тогда начинаются танцы.
                            0
                            Да какие там танцы то?
                            Все точно так же
                            Кодим:
                            ffmpeg -i source.file -s 640x360 -f mp4 -vcodec libx264 -vpre hq -threads 0 -b 1500k -bt 1500k -r 25 -g 25 -acodec libfaac -ab 96k -ar 22050 filename.mp4
                            Хинтим:
                            MP4Box -inter 500 filename.mp4

                            Натачиваем кривоватый h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Nginx-Version2
                            PROFIT!
                              0
                              ЕМНИП, mp4box был(есть?) крайне кривой и крешился через раз.
                                0
                                Ну у меня 0.4.6-DEV-rev2784, более-менее стабилен.
                                  0
                                  Добавил ваш комментарий в избранное, проверю по необходимости.
                                  Я с этим ковырялся года два назад, помню что вроде компилил mp4box руками и не совсем удачно оно все работало, но свое дело делало.
                            0
                            недавно встал вопрос, не смог найти ответа. Может вы подскажете: может ли ffmpeg картинку как-нить обработать? Смысл в том, что иногда попадаются битые джепеги, у которых похоже не прописаны заголовки. В итоге просмотрщики картинок их нормально открывают, а к примеру гуглопикаса, не принимает этот файл, типа как не картинка это. Вот и думаю как можно такие файлы отрипейрить.
                              0
                              А не пробовали через ImageMagick?
                                –1
                                только ради этого его ставить совершенно не хочется
                              0
                              Пресеты ffmpeg-а уже канули в Лету, сейчас они рекомендуют пользоваться штатными пресетами от libx264.

                                +1
                                Не понял. Зачем вы удалили пакеты и собирали сами из исходников?
                                  0
                                  потому что ffmpeg из пакетов не работает с x264 из пакетов, наверное поэтому
                                    0
                                    есть в принципе debian-multimedia.org но очень легко получить жуткую свистопляску с пакетами.
                                      0
                                      ога, debian-multimedia.org конечно есть, и свистопляска присутствует. Нет, в принципе, для новичка и если кодить только в FLV можно поставить из него все и оно даже будет работать. Но вот тот же пресловутый экстеншн php-ffmpeg на ихнем ffmpeg уже не соберется. И готового x264 у них нет, а ffmpeg собран без его поддержки. В общем через полгода мучения, пришлось собрать все ручками комплектом.
                                        0
                                        ну да, обычно «ручками» всё и приходится.
                                  –1
                                  мы использовали путь, менее затратный по процессорному времени, когда убедились, что ffmpeg для быстрой обработки нам не подходил: заменили его на mencoder, который идёт в debian отдельным пакетом.

                                  с тех пор только его и используем.
                                    0
                                    Еще год назад это было одно и тоже. В чем фокус?
                                      0
                                      Чем же он вам не подходил? Вы ведь не думаете, что в mencoder стоит другой энкодер для H264?
                                        0
                                        команда time показала, что на одном и том же файле на одном и том же железе mencoder почему-то работает в три раза быстрее. можете померять.
                                          +1
                                          поверьте, вы просто не так пользовались. mencoder и ffmpeg — это по факту разные оболочки к одному и тому же. Да, в mencoder-е есть немного другого кода, связанного с упаковкой контейнеров, но он практически не влияет на скорость работы.

                                          Если у вас была разница в 3 раза, то это 100% исключительно настройки энкодера. Например, вы могли неправильно указать опцию threads или вообще не лазили в опции, тогда явно тут ffmpeg не причем.

                                          Пожалуйста, не распространяйте ложную информацию о том, что они отличаются скоростью.
                                            0
                                            ok, как появится время — проверю.
                                      0
                                      В одном из проектов я использовал такой код чтобы энкодить видео в форматы для html5 и flash gist.github.com/1202521

                                      Rails ~> 3.0
                                      carrierwave
                                      delayed_job

                                      Примеры параметров брал с diveintohtml5.org/video.html
                                        0
                                        Уважаемый(?) Blackman — когда сдираете мануал с другого сайта, иногда включайте мозг, пожалуйста.

                                        Рерайт текста с небольшими изменениями, изменением порядка и даже одинаковыми ошибками в командах — это круто.

                                        Оригинал тут: tresnet.ru/archives/223

                                        В приличном обществе — за такое не инвайт, а канделябр полагается.
                                          0
                                          В строках 42-43 функции get_video_size() перепутаны ширина и высота, должно быть:

                                          $vheight = $oheight = $ma['height'];
                                          $vwidth = $owidth = $ma['width'];
                                            0
                                            $ffmpeg_path = 'ffmpeg'; // Путь к ffmpeg
                                            $in = 'ATB — Let You Go.avi'; // Входящий файл

                                            $command = $ffmpeg_path. ' -threads 0 -y -i "'. $in… $out. '"';
                                            $conv = exec($command);


                                            Понимаю, что возможно так и есть, но лучше лишний раз предупредить.
                                            Если «Входящий файл» берется с названия файла переданного на сервер, то посоветовал бы, название обрабатывать, дабы избежать инъекции.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое