先に python を実行するのに wsgi を利用する記事を書きました。結局 この wsgi は独立した仮想でないサーバーで動かす予定です。処理がだいたいは速くなるのと、この先ビデオカードの演算機能を利用するとなると、今のところ仮想では難しいので実体のあるサーバーを一台用意することにしました。
ビデオカード(geforce GTX 1050)を刺したパソコンを用意しました。ついでに、 ffmpeg も動かして動画の変換処理もこのサーバーで担当させるようにしたいです。ビデオカードのアクセラレーション機能を ffmpeg で利用する件は先日の記事に書きました。
まずは実体サーバーへ動画データを転送します。これは base64 変換されたテキストデータです。送受信は PHP を利用します。サイズが 200MB 超と大きいので、受け取る側の PHP の環境変数を変更しておく必要があります。最大アップロードサイズや PHP 自身が利用するメモリサイズを変更します。200MB 程度の base64 データをバイナリーデータに変換するときには、確か 1GB 程度のメモリーが必要となっていました。他には php-mbstring のインストールも必要でした。多分他にもありそうです。Moodle などをインストールしたサーバーならすでに入っているものなのでしょうけど。
データサイズの大きさから、先日の記事とは違って POST でデータを送信します。大体のコードは下記のようなものです(参考サイト)。コードではローカルにある動画ファイルを送信しています。
<?php
$fileName = "xxxxxx.mp4";
$tmpbinary = file_get_contents($fileName);
$strBase64 = base64_encode($tmpbinary);
$postdata = http_build_query(
array(
'fileName' => $fileName,
'base64data' => $strBase64
)
);
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.strlen($postdata)
);
$context = stream_context_create([
'http' => ['method' => 'POST',
'header'=>implode( "\r\n", $headers),
'ignore_errors' => true,
'content' => $postdata
]
]);
$res = file_get_contents("http://xxx.xxx.xxx.xxx/xxx.php", false, $context);
if (strpos($http_response_header[0], '200') !== false) {
echo $res . "\n";
} else {
$res = false;
echo 'false' . "\n";
}
?>
返事は縦横のピクセルサイズや時間、および画質調整された動画のデータ(base64)を受け取る予定です。
受け取る方ですが下記のコードです。受け取るところしか書いていません。
<?php
$fileName = $_POST['fileName'];
$base64data = $_POST['base64data'];
$movie = base64_decode($base64data);
$a_file = fopen("/var/www/html/xxxxxx/$fileName","w");
fwrite($a_file,$movie);
fclose($a_file);
echo "success! \n";
?>
このあと動画変換などのコードがあるのですが省略します。