(20211213 作業メモ) python と ffmpeg を担当するサーバーを立てる

13 12月

 先に 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";

?>

このあと動画変換などのコードがあるのですが省略します。