ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Работа с видео на php с помощью php ffmpeg

Работа с видео на php с помощью php ffmpeg

  • welder

    Сообщения: 2947 Репутация: N Группа: в ухо

    Spritz 30 октября 2008 г. 17:55

    Работа с видео на php с помощью php ffmpeg

    Установка php ffmpeg под Windows.

    1. качаем уже собранный php ffmpeg от Sergey Fedotov
    2. распаковываем архив
    3. копируем файл php_ffmpeg.dll в папку php/extensions
    4. копируем файлы avformat-51.dll, avcodec-51.dll, avutil-49.dll ,pthreadGC2.dll в папку windows/system32
    5. добавляем в php.ini  строку: extension=php_ffmpeg.dll
    6. перезапускаем Apache
    7. проверяем всё ли у нас получилось var_dump(extension_loaded('ffmpeg')) или через phpinfo()

    скорей всего у нас получилось так что ознакомимся с функциями =)

    Перевод официальной документации (API Docs)

    $movie = new ffmpeg_movie(String path_to_media, boolean persistent)
     Открыть аудио или видео файл и Вернёт объект.
        path_to_media - Путь к аудио или видео файлу
        persistent - Открыть как постоянный ресурс. О постоянных ресурсах
          читайте в документации по PHP

      $movie->getDuration()
      Вернёт продолжительность аудио или видео файла в секундах.

      $movie->getFrameCount()
      Вернёт количество кадров (фреймов) аудио или видео файла.

      $movie->getFrameRate()
      Вернёт  частоту  кадров  видео  в кадрах в секунду (fps - frame persecond)

      $movie->getFilename()
      Вернёт путь к видео или аудио файлу

      $movie->getComment()
      Вернёт поле комментария из аудио или видео файла

      $movie->getTitle()
      Вернёт поле заголовка из аудио или видео файла

      $movie->getAuthor() псевдоним $movie->getArtist()
      Вернёт  поле "автор" из видео файла или "автор" из ID3 поля mp3 файла

      $movie->getCopyright()
      Вернёт поле "авторское право" из аудио или видео файла

      $movie->getArtist()
      Вернёт ID3 поле "Артист" из mp3 файла

      $movie->getGenre()
      Вернёт ID3 поле "Жанр" из mp3 файла

      $movie->getTrackNumber()
      Вернёт ID3 поле "номер дорожки" из mp3 файла

      $movie->getYear()
      Вернёт ID3 поле "Год" из mp3 файла

      $movie->getFrameHeight()
      Вернёт высоту видео в пикселях

      $movie->getFrameWidth()
      Вернёт ширину видео в пикселях

      $movie->getPixelFormat()
      Вернёт формат пикселов видео

      $movie->getBitRate()
      Вернёт  скорость  потока(битрейт)  видео  или аудио файла в битах в
      секунду

      $movie->getVideoBitRate()
      Вернёт скорость потока(битрейт) видео в битах в секунду.
      Замечание : Работает только с файлами у которых постоянный битрейт

      $movie->getAudioBitRate()
      Вернёт  скорость  потока(битрейт)  аудио  у видео или аудио файла в
      битах в секунду.

      $movie->getAudioSampleRate()
      Вернёт скорость дискретизации аудио у видео или аудио файла в битах
      в секунду.

      $movie->getFrameNumber()
      Вернёт текущий номер кадра.

      $movie->getVideoCodec()
      Вернёт  название  видео  кодека который использован для видео файла
      как строку

      $movie->getAudioCodec()
      Вернёт  название  аудио  кодека  который использован видео файл как
      строку

      $movie->getAudioChannels()
      Вернёт  количество  аудио каналов (1 моно 2 стерео и т д) как целое
      число

      $movie->hasAudio()
      Вернёт  логическое  значение соответствующие наличию или отсутствию
      аудио

      $movie->getFrame([Integer framenumber])
      Вернёт  кадр  из видео как ffmpeg_frame объект. Возратит логическую
      ложь (false) если кадра нет
        framenumber  -Номер кадра который надо возратить. Если framenumber
          не определен то возращается следующий кадр из видео.

      $movie->getNextKeyFrame()
      Вернёт  следующий  ключевой  кадр как ffmpeg_frame объект. Возратит
      логическую ложь (false) если кадра нет


    ffmpeg_frame object methods

      $frame = new ffmpeg_frame(Resource gd_image)
      Создаст обьект ffmpeg_frame из ресурса GD картинки.
      Замечание : Функция недоступна если нет библитеки GD.

      $frame->getWidth()
      Вернёт ширину кадра.

      $frame->getHeight()
      Вернёт высоту кадра.

      $frame->getPTS() alias $frame->getPresentationTimestamp()
      Возвращает время создания кадра.

      $frame->resize(Integer  width,  Integer  height [, Integer crop_top [,
      Integer crop_bottom [, Integer crop_left [, Integer crop_right ]]]])

      Изменяет  размер  и  обрезает  кадр  (Обрезание  встроено  в изменение
      размера картинка ffmpeg и сделал его для полноты)
        width - Новая ширина кадра (должено быть натуральным числом)
        height - Новая высота кадра (должено быть натуральным числом)
        croptop - Удалить [croptop] рядов пикселов с верху кадра.
        cropbottom - Удалить [cropbottom] рядов пикселов с низу кадра.
        cropleft - Удалить [cropleft] рядов пикселов с лева у кадра..
        cropright Удалить [cropright] рядов пикселов с права у кадра..

      Замечание:  Обрезание  всегда  происходит  до  измения  размера кадра.
      Значения параметров обрезания должны быть натуральными числами.

      $frame->crop(Integer   crop_top  [,  Integer  crop_bottom  [,  Integer
      crop_left [, Integer crop_right ]]])

      Обрезать кадр.
        croptop - Удалить [croptop] рядов пикселов с верху кадра.
        cropbottom - Удалить [cropbottom] рядов пикселов с низу кадра.
        cropleft - Удалить [cropleft] рядов пикселов с лева у кадра..
        cropright Удалить [cropright] рядов пикселов с права у кадра..

      Замечание : Параметры должны быть натуральными числами

      $frame->toGDImage()
      Возвращает truecolor GD картинку (ресурс) кадра
      Замечание : Функция недоступна если нет библитеки GD.

    ffmpeg_animated_gif

      $gif = new ffmpeg_animated_gif(String output_file_path, Integer width,
         Integer height, Integer frame_rate, [Integer loop_count])

      Создает новый ffmpeg_animated_gif обьект

        output_file_path - Путь в файловой системе куда будет записан
          анимированный gif .
        width - Ширина анимированого gif'а
        height - Высота анимированного gif'а
        frame_rate - Частота кадров анимированного gif'а в кадрах в
          секунду
        loop_count - Количество повторений анимации. Укажите 0 для
          бесконечного повторения или пропустите параметр для отключения
             повторений.


      $frame->addFrame(ffmpeg_frame frame_to_add)
      Добавляет кадр в конец анимированного gif'а.
        frame_to_add  -  ffmpeg_frame  обьект  для  добавления в конец
          анимированного gif'а.


    Теперь рассмотрим некоторые примеры

    1. Узнаём информацию о видео файле .
    <?php
    // получаем продолжительность и размеры видео

    $movie = new ffmpeg_movie(&quot;/www/1.avi&quot;);
    echo &quot;Продолжительность фильма:  &quot;;
    // так как  мы получаем секунды надо нам их перевести в человечный вид ЧЧ:ММ:CC
    // для этого мы и используем функцию  gmdate  я думаю фильмов длиной по несколько дней у вас нет =)
    echo &quot;<b>&quot;.gmdate(&quot;H:i:s&quot;,$movie->getDuration()).&quot;</b><br />&quot;;

    // теперь выведем размерв нашего фильма
    echo &quot;Размеры фильма:  &quot;;
    echo &quot;<b>&quot;.$movie->getFrameWidth().&quot; x &quot;.$movie->getFrameHeight().&quot;</b>&quot;;

    ?>



    2. Получаем кадр.
    <?php
    //получаем скриншот по средствам php ffmpeg

    // путь до файла
    $file = &quot;/www/1.avi&quot;;
    // кадр который будем выхватывать
    $frame = 150;

    // получаем кадр
    $movie = new ffmpeg_movie($file);
    $image = $movie->getFrame($frame);
    $show_img = $image->toGDImage();

    // выводим его
    header(&quot;Content-type: image/jpeg&quot;);
    imagejpeg($show_img);
    imagedestroy($show_img);
    ?>




    3. Получаем и редактируем кадр.
    <?php
    // получаем скриншот по средствам php ffmpeg и уменьшаем его

    // путь до файла
    $file = &quot;/www/1.avi&quot;;
    // кадр который будем выхватывать
    $frame = 150;
    // максимальный размер по высоте
    $max_width  = 150;

    // получаем кадр в gd
    $movie = new ffmpeg_movie($file);
    $image = $movie->getFrame($frame);
    $show_img = $image->toGDImage();

    // редактируем то что в gd
    $new_image = new ffmpeg_frame($show_img);
    //вычисляем старые значения ширины и высоты
    $old_width = $new_image->getWidth();
    $old_heighgt = $new_image->getHeight();
    // соотношение сторон
    $mov_ratio = $old_width/$old_heighgt;
    if($old_width > $max_width){
    $new_width    = $max_width;
    }
    // задаём новые параметры
    $new_height = $new_width / $mov_ratio;
    // изменяем размер
    $new_image->resize($new_width, $new_height);
    $new_show_img = $new_image->toGDImage();

    // выводим его
    header(&quot;Content-type: image/jpeg&quot;);
    imagejpeg($new_show_img);
    imagedestroy($new_show_img);

    ?>




    4. Создаём анимированный GIF.
    <?php
    // создаём анимированый гиф
    // путь до файла
    $file = &quot;/www/1.avi&quot;;

    // поехали =)
    $movie = new ffmpeg_movie($file);

    // создаём анимацию
    $gif=new ffmpeg_animated_gif(&quot;/www/primer.gif&quot;,100 ,100 ,24);

    for ($frame = 150; $frame <= 200; $frame++) {
    $image = $movie->getFrame($frame);
    $gif->addFrame($image);
    }

    ?>

  • sap

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 31 октября 2008 г. 2:43, спустя 7 часов 55 минут 17 секунд

    Спасибо, познавательно :)
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 31 октября 2008 г. 4:26, спустя 1 час 42 минуты 46 секунд

    жесть, лови +1
  • welder

    Сообщения: 2947 Репутация: N Группа: в ухо

    Spritz 31 октября 2008 г. 4:36, спустя 9 минут 49 секунд

    просто делаю домашнию кинотеку на пхп вот и понадобилося всё ето =))
  • pasha

    Сообщения: 1047 Репутация: N Группа: Адекваты

    Spritz 31 октября 2008 г. 14:28, спустя 9 часов 52 минуты 9 секунд

    спасибо)
  • pasha

    Сообщения: 1047 Репутация: N Группа: Адекваты

    Spritz 31 октября 2008 г. 14:30, спустя 2 минуты 23 секунды

    а есть библиотека для конвертации avi2flv? или т.п?
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 31 октября 2008 г. 16:25, спустя 1 час 55 минут 9 секунд


    а есть библиотека для конвертации avi2flv? или т.п?


    с помощью ффмпега из любого формата в любой формат можно конвертировать, главное установить соответствующие модули
    adw/0
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 22 апреля 2009 г. 15:30, спустя 172 дня 23 часа 5 минут

    А с помощью этого расширения конвертировать то можно?
    adw/0
  • mario

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 22 апреля 2009 г. 17:52, спустя 2 часа 21 минуту 43 секунды


    А с помощью этого расширения конвертировать то можно?

    http://vbolshov.org.ru/?id=14&ctrl=article
    там написано что да :)
    PS твои ссылки :)
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 22 апреля 2009 г. 18:51, спустя 58 минут 19 секунд

    mario, я специально выделил жирным курсивом слово &quot;расширение&quot;, потому что меня интересовало именно расширение для php, а не сам ffmpeg :)

    Кароче не умеет оно конвертировать, я уже излазил оф. сайт. Юзаю по старинке ffmpeg
    adw/0
  • Shogun

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 14 ноября 2009 г. 10:28, спустя 205 дней 16 часов 37 минут

    Прет всем!

    Вроде все правильно зделал, но при запуске Апач выдает такое:



    Что можно зделать??
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 14 ноября 2009 г. 14:28, спустя 3 часа 59 минут 22 секунды

    Какая версия php? Могу подкинуть для php 5.2.9-2
    adw/0
  • IgorN

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 18 марта 2010 г. 6:12, спустя 123 дня 14 часов 44 минуты

    Только приступил к работе с видео. У меня на сайте пользователь будет заливать видео, небольшие файлы 10 м весом и 15 сек. длиной. Надо их сконверить в flv. Как это сделать и можно ли это сделать средствами nginx. Спасибо!
  • phpdude

    Сообщения: 26614 Репутация: N Группа: в ухо

    Spritz 18 марта 2010 г. 6:19, спустя 6 минут 48 секунд

    IgorN, конвертить видео средствами веб сервера? пиздец, хедшот ..

    adw0rd.ru почитайте, там была статья про это, как раз разжевая только проглотайте {+++57+++} предлагаю около поста сделать кнопку &quot;отжег дня&quot;, и в шапке его показывать, удет прикольно :)

    ну сортировать по &quot;отжегу дня&quot; посты и показывать в шапке самый кликательный =)
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!