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

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

  • welder

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

    Spritz 30 октября 2008 г. 14: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("/www/1.avi");
    echo "Продолжительность фильма:  ";
    // так как  мы получаем секунды надо нам их перевести в человечный вид ЧЧ:ММ:CC
    // для этого мы и используем функцию  gmdate  я думаю фильмов длиной по несколько дней у вас нет =)
    echo "<b>".gmdate("H:i:s",$movie->getDuration())."</b><br />";

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

    ?>



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

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

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

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




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

    // путь до файла
    $file = "/www/1.avi";
    // кадр который будем выхватывать
    $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("Content-type: image/jpeg");
    imagejpeg($new_show_img);
    imagedestroy($new_show_img);

    ?>




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

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

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

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

    ?>

  • sap

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

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

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

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

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

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

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

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

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

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

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

    спасибо)
  • pasha

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

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

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

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

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


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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

    Прет всем!

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



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

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

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

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

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

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

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

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

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

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

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

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

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