信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2016

25

8月

PHPとElasticTranscoder

テクログ

PHPとElasticTranscoder

皆さんこんにちわ。
ni-yoです。

本日も技術ネタを少々…

弊社はサーバの主流はAWSになっています。
構築の手間と冗長性等を考慮するとオンプレより多方面でメリットが大きく
手放せない存在になっています。

本日はそんな機能の1つElasticTranscoderの紹介をさせていただきます。

Webの世界もクラウド技術の発達等により昔は制限があって実装できないような
コンテンツを実現できるようになってきました。
Webの世界もここ近年動画コンテンツの実装率が日々あがってきていることを感じます。

とはいえ、Webでの動画実装はそれほど簡単ではありません。
動画には画像よりもずっと多くの規格があり、(mp4/avi/wmv/flv等)
反面Webブラウザで再生できる規格にはある程度制限があります。
例えばYoutubeのようにユーザ投稿型のコンテンツを作ろうという場合、
ある程度ブラウザで再生できる規格に変換する必要性があります。
この作業をエンコードと言い、動画変換作業の中でデジタル映像をアナログ信号に
デコードしないでエンコードを行う作業をトランスコードと言います。

今回紹介するElasticTranscoderはこのトランスコードの作業をAWSでできる技術です。

今回はWebで考えるのでPHPからElasticTranscoderへジョブ通知することにスポットし、
ElasticTranscoder自体は詳しく掘り下げません。

ざっと手順を言えば
①トランスコード元ファイルを配置するS3フォルダを作成
②トランスコード済みファイルを配置するS3フォルダを作成
③ElasticTranscoderの入力を①、出力を②で指定したパイプラインを作る
④ElasticTranscoderにアクセスできるIAMを作る。
⑤IAMの鍵をPHPのソースに記載して①のS3にファイルアップ、パイプラインに変換指示を送る
⑥パイプラインがトランスコード処理を行い、出力先にトランスコード済みファイルが配置される。
のような手順です。

⑤の部分のPHPプログラムは例えば下記のようになります。

	public function getInstance() {
        $this->obj = null;
        if (is_null($this->obj)) {
            $this->obj = Aws::factory([
                'key'    => (IAMで設定したkey),
                'secret' => (IAMで設定したパスワード),
                'region' => Region::TOKYO
            ])->get('ElasticTranscoder');
        }
        return $this->obj;
    }

    public function createJob($args) {
        try {
            $res = $this->getInstance()->createJob($args);
        } catch (Exception $e) {
            echo $e->getMessage();
            return false;
        }
        return $res;
    }
    
    public function transcode() {
 
        $result = $this->createJob([
            'PipelineId' => (③で作成したパイプラインのID),
            'Input' => [
                'Key' => (入力S3に配置したファイルパス),
            ],
            'Outputs' => [
                // mp4 & Thumbnail
                [
                    'Key'              => (出力先に配置したいファイルパス),
                    'PresetId'         => '1351620000001-100070',
                    'ThumbnailPattern' =>(入力S3に配置したファイルパス)."-{count}"
                ],
                // webm
                [
                    'Key'             => $mp4Keyfile.'.webm',
                    'PresetId'        => '1351620000001-100240',
                ]
            ],
        ]);
    }

transcode関数をコールした時点で入力用S3には動画ファイルを置かれている前提です。
これで、出力したいファイルパスにはmp4とwebmという形式で変換された動画が配置されるはずです。

今回は例としてmp4とwebm形式を指定しています、PCとスマートフォンの対応という部分を考えれば
この2つのフォーマットを作成すればほぼカバーできると思います。
もし、それ以外の形式で出力したければ
'PresetId' => '1351620000001-100070',
をそれに準じたものに変更すれば出力されます。
この出力形式はプリセットと呼び、出力したい最適なものを
https://docs.aws.amazon.com/ja_jp/elastictranscoder/latest/developerguide/system-presets.html

から選択して使用するか、細かい設定をしたければ自作でプリセットを作成することができます。

簡単ですが以上です。
今まで動画配信業者等を使わなくては実現できなかった部分が自前でできるので日々技術進歩を感じますね。
それでは (^-^)ノ

この記事を書いた人

マスオさん

新納誠一

所 属:
役員
出身地:
新潟
仕事内容:
プログラミング