SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

PHPで行う動画変換(後編)

目的に応じて適材適所で使うPHPライブラリ(9)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロードした動画をNTTドコモiモーションの3gp形式に変換

 FFMPEG-PHP ClassのVideoToクラスを参考にPHPVideoToolkitクラスを利用した3gp形式の動画変換クラスを作成します。VideoToクラスのFLVメソッドを参照すると、メソッドに渡されたオプションとメソッド内で指定したオプションをマージした後、さらにset~メソッドを使って動画変換のオプションを指定してffmpegのコマンドを組み立てていることが分かります。

[リスト4]videoto.php(抜粋)
public static function FLV($file, $options=array(), $target_extension='flv')
{
//     merge the options with the defaults
    $options = array_merge(array(
        'temp_dir'                    => '/tmp/', 
        'width'                        => 320, 
        'height'                       => 240,
        'frequency'                    => 44100, 
        'audio_bitrate'                => 64, 
        'video_bitrate'                => 1200, 
 # 略
    , $options);

//         set the output dimensions
        $toolkit->setVideoAspectRatio($options['ratio']);
        $toolkit->setVideoOutputDimensions($options['width'], $options['height']);
        $toolkit->setVideoBitRate($options['video_bitrate']);
        $toolkit->setVideoFrameRate($options['frame_rate']);
 # 略

 作成する3gp動画変換用のクラスもVideoToクラスにならって作成する方式で進めていきます。

 videoto.phpをコピーしてmobilevideotop.phpの名前で保存します。クラス名をMobileVideoTo、FLVメソッドをコピーしてGPの名前で以下のようにクラスを作成します。

[リスト5]mobilevideotop.php(抜粋)
class MobileVideoTo
{
    
    private static $_log_files            = array();
    private static $_error_messages       = array();
    private static $_commands             = array();
    private static $_outputs              = array();
    
    public static function GP($file, $options=array(), $target_extension='3gp')
    {
//         merge the options with the defaults
        $options = array_merge(array(
            'temp_dir'                    => '/tmp/', 

 ffmpegを使ってのflvから3gpへの動画変換のコマンドの例は以下のようになります。

[リスト6]動画変換コマンドの例
ffmpeg -i youtube.flv -vcodec mpeg4 -b 64k -s qcif -r 15 -acodec libamr_nb -ab 12200 -ar 8000 -ac 1 -flags bitexact youtube.3gp

 その際のオプションの意味と3gp動画変換時の値の目安は以下の表のとおりです。

3gp動画への変換時のffmpegのオプション
オプション オプションの意味 3gp動画変換時の値の目安
-i 変換前の動画ファイルを指定 動画ファイル名
-vcodec ビデオコーデックを指定 「mpeg4」を指定する
-b ビットレートを指定 60~100kを指定する
-s フレームサイズを指定 最小の単位である「qcif」を指定する
-r フレームレートを指定 10~50程度を指定する
-acodec オーディオを指定 「libamr_nb」を指定する
-ab オーディオビットレート 10000~20000の間
-ar オーディオサンプリング周波数を指定 8000固定
-ac オーディオチャンネル数を指定 1
-flags エンコードに関するフラグ 携帯向け変数「bitexact」を指定する

 上記例ではなるべく多くの機種に対応した値をとっているので、変換後の動画の精度を上げたい場合などは、ffmpegドキュメントを参照して調整してください。

 VideoToクラスのFLVメソッドで多用されているPHPVideoToolkitのset~のメソッドはaddCommandメソッドでも同じことを指定できます。サンプルではffmpegのオプションを分かりやすくするためにaddCommandメソッドで動画変換のオプションを組み込んでいます。

[リスト7]mobilevideotop.php(抜粋)
// ビデオフォーマットをmpeg4に設定
$toolkit->setVideoFormat(PHPVideoToolkit::FORMAT_MPEG4);
// ビデオビットレートを64kに設定
$toolkit->setVideoBitRate('64k');
// フレームレートを30に設定
$toolkit->setVideoFrameRate(30);
// フレームサイズを設定
$toolkit->addCommand('-s', 'qcif');
// オーディオコーデックをlibamr_nbに設定
$toolkit->addCommand('-acodec', 'libamr_nb');
// オーディオビットレートを12200に設定
$toolkit->addCommand('-ab', 12200);
// オーディオサンプリング周波数を8000に設定
$toolkit->addCommand('-ar', 8000);
// オーディオチャンネル数を1に設定
$toolkit->addCommand('-ac', 1);
// 携帯向け動画であることを指定
$toolkit->addCommand('-flags', 'bitexact');

 addCommandメソッドを利用することでffmpegのコマンドを直接編集せずに動画変換時のオプションを指定できます。GPメソッドの作成が終わったら、前項のPHPに以下の行を追加します。

[リスト8]youtube_get.php(抜粋)
MobileVideoTo::ThreeGP($_output, array('output_dir'=>'/var/www/html/', 'output_file'=>'youtube.3gp'));

 PHPを実行すると、YouTubeの紹介動画をダウンロードして3gpへ変換します。変換後のファイル名は「youtube.3gp」としています。前回記事で最初に作成したサンプルを使ってhttp://[ドメイン]/3gp.php?file=youtube.3gpでアクセスすると以下のように表示されます。

youtube_get.php実行後の確認
youtube_get.php実行後の確認

 携帯電話でアクセスして動画が閲覧できることを確認します。

まとめ

 FFMPEG-PHP Classを利用することでffmpegのコマンドを直接触らずにPHP内から動画変換が行えます。ffmpeg自体が多様な動画フォーマットに対応しているので、オプションの指定次第で様々な端末に対応した動画が生成できるものと考えています。

 また、Zend_Http_Clientはスパイダリングツールとしても利用できるため、各動画共有サイトを横断して特定の種類の動画を収集したり、あるサイトからそのサイトの趣旨に合った動画や他サイトの情報を収集しリンクを張るなど、個人レベルでもポータル的なサイトの作成が可能になるでしょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5289 2010/07/23 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング