[herokuアドオン]cloudinaryで動画を試してみた[PHP]

2015年5月5日に新しく発表された動画サポートを試してみた。

アップロード

インストールなどは前回の記事参照。

同一ディレクトリにある、movファイルをアップロードした。
動画は、iPhoneで撮影したもの。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
require '../vendor/autoload.php';

use Cloudinary;
use Cloudinary\Uploader;

$account = parse_url(getenv('CLOUDINARY_URL'));

\Cloudinary::config(array(
    "cloud_name" => $account['host'],
    "api_key" => $account['user'],
    "api_secret" => $account['pass']
));

$ret = \Cloudinary\Uploader::upload("iphone_movie.mov",array(
    "resource_type" => "video"
));

print_r($ret);

結果は以下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Array ( 
  [public_id] => wfdpqg39qjoc6lnkr3cs 
  [version] => 1430967110 
  [signature] => 7f52af2c53ccc3b38f8b33300a40d6085c85c032 
  [width] => 1280 
  [height] => 720 
  [format] => mov 
  [resource_type] => video 
  [created_at] => 2015-05-07T02:51:50Z 
  [tags] => Array ( ) 
  [bytes] => 5572519 
  [type] => upload 
  [etag] => 3114c6de99a74817eef082b330754d1e 
  [url] => http://res.cloudinary.com/harslxcej/video/upload/v1430967110/wfdpqg39qjoc6lnkr3cs.mov 
  [secure_url] => https://res.cloudinary.com/harslxcej/video/upload/v1430967110/wfdpqg39qjoc6lnkr3cs.mov 
  [audio] => Array ( 
      [codec] => aac 
      [bit_rate] => 63431 
      [frequency] => 44100 
      [channels] => 1 
      [channel_layout] => mono 
  ) 
  [video] => Array ( 
      [pix_format] => yuv420p 
      [codec] => h264 
      [level] => 31 
      [bit_rate] => 4604806 
  ) 
  [frame_rate] => 29.97002997003 
  [bit_rate] => 4686070 
  [duration] => 9.538333 
  [rotation] => 0 
)

表示

PHPでは、cl_video_tagを利用することでvideoタグを出力してくれる。

cl_video_tag($public_id, array( "alt" => "Sample Video" ));

出力

1
2
3
4
5
<video alt='Sample Video' poster='https://res.cloudinary.com/harslxcej/video/upload/wfdpqg39qjoc6lnkr3cs.jpg'>
  <source src='https://res.cloudinary.com/harslxcej/video/upload/wfdpqg39qjoc6lnkr3cs.webm' type='video/webm'>
  <source src='https://res.cloudinary.com/harslxcej/video/upload/wfdpqg39qjoc6lnkr3cs.mp4' type='video/mp4'>
  <source src='https://res.cloudinary.com/harslxcej/video/upload/wfdpqg39qjoc6lnkr3cs.ogv' type='video/ogg'>
</video>

このままだとコントローラーが表示されていないので、その辺のオプションも追加する。

1
2
3
4
5
6
7
cl_video_tag($public_id, array(
    "width" => 600,
    "height" => 400,
    "crop" => "fill",
    "preload" => "none",
    "controls" => true,
));

出力

1
2
3
4
5
<video controls='1' height='400' poster='https://res.cloudinary.com/harslxcej/video/upload/c_fill,h_400,w_600/wfdpqg39qjoc6lnkr3cs.jpg' preload='none' width='600'>
  <source src='https://res.cloudinary.com/harslxcej/video/upload/c_fill,h_400,w_600/wfdpqg39qjoc6lnkr3cs.webm' type='video/webm'>
  <source src='https://res.cloudinary.com/harslxcej/video/upload/c_fill,h_400,w_600/wfdpqg39qjoc6lnkr3cs.mp4' type='video/mp4'>
  <source src='https://res.cloudinary.com/harslxcej/video/upload/c_fill,h_400,w_600/wfdpqg39qjoc6lnkr3cs.ogv' type='video/ogg'>
</video>

サムネイルの出力は以下。
public idに拡張子をつけてやらないと表示が出来なかった。
(jpg, png, webp, wdpに対応しているよう)

1
2
3
4
5
6
cl_image_tag($public_id.".jpg", array(
    "width"=>300,
    "height"=>300,
    "crop"=>"fill",
    "resource_type"=>"video"
));

結果

<img src='https://res.cloudinary.com/harslxcej/video/upload/c_fill,h_300,w_300/wfdpqg39qjoc6lnkr3cs.jpg' height='300' width='300'/>

フォームからアップロード

前回、Transloaditでアップロードした時と同じように、フォームから選択した動画をアップロードしてみる。

情報が取得できない

動画をフォームからアップロードしてみると情報が取得できない、と思ったが、
どうやらサーバーの設定での最大アップロードサイズを超過していたよう。

アップロードサイズはデフォルトでは、2MB
これの変更方法は以前に書いていた。
[PHP][heroku]upload_max_filesizeを変更する – KayaMemo

コード

以下、全コード。
動画をアップロードされたら表示するところまで。
(エラーチェックなどは全くしていないので注意)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
require '../vendor/autoload.php';
use Cloudinary;
use Cloudinary\Uploader;

$showFlg = false;

if(isset($_FILES['userfile'])){
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name'])) {
        $uploadFile = $_FILES['userfile']['name'];

    $account = parse_url(getenv('CLOUDINARY_URL'));
    \Cloudinary::config(array(
        "cloud_name" => $account['host'],
        "api_key" => $account['user'],
        "api_secret" => $account['pass']
    ));

    $ret = \Cloudinary\Uploader::upload($uploadFile,array(
        "resource_type" => "video"
    ));
    $public_id = $ret['public_id'];
    $showFlg = true;
    }
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <title>ファイルアップロードテスト</title>
    <meta charset="utf-8">
</head>
<body>

<?php if(!$showFlg){ ?>
<form enctype="multipart/form-data" method="post" action="upload-form-movie.php">
    <input type="hidden" name="MAX_FILE_SIZE" value="20000000" />
    <input name="userfile" type="file">
    <input type="submit" value="Upload">
</form>
<?php }else{
    echo $resize = cl_video_tag($public_id, array(
        "width" => 600,
        "height" => 400,
        "crop" => "fill",
        "preload" => "none",
        "controls" => true,
    ));
} ?>

</body>
</html>

参考

Introducing cloud based service for video management | Cloudinary Blog
Video manipulation and delivery | Cloudinary

PHP: POST メソッドによるアップロード – Manual
サーバーのアップロードファイルの最大容量の確認と容量制限の変更|PHP工房
Customizing Web Server and Runtime Settings for PHP | Heroku Dev Center

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