DIYビデオホスティング

この記事では、ビデオをダウンロード、保存、視聴するための無料サービスを実装する技術的な側面について説明します。 サーバーソフトウェアのセットアップの問題を検討し、ビデオを変換するためのコマンドの例とPHPのコードの例を示します。

多くのブラウザでHTML5サポートが導入されたことにより、ビデオタグを使用してビデオプレーヤーを埋め込むことが可能になりました。 各ブラウザーは、コーデックとコンテナーの特定のセットをサポートします。 このサポートについては、 http://diveintohtml5.org/video.html#what-works詳しく説明されています

システムの主な要件の1つは、Appleデバイス(iPhone、iPad、iPod)のサポートでした。 これらのデバイスは単一形式のオンラインビデオをサポートしているという事実(MP4であり、Flashプレーヤーを使用できないため、当初はユニバーサルMP4コンテナー(H.264ビデオとAACオーディオ)を基盤とすることが決定されました。 エンコード時には、これらのコーデックlibx264およびlibfaacの無料実装が使用されます。 ユーザーのブラウザーがビデオタグをサポートしていない場合、またはブラウザーがMP4形式のビデオをサポートしていないためサポートが不可能な場合に自動的に接続するFlashプレーヤーを使用して、他のブラウザーでこれらの形式がサポートされないことを補うことにしました。

建築


システムのアーキテクチャは非常にシンプルで、2種類のサーバーが含まれています。

画像

コンテンツ配信の主な機能はファイルサーバーです。 アイデアは、人気のあるビデオをダウンロードする場合にネットワークインターフェイスの負荷ジャンプを回避するために、変換後できるだけ早くメインサーバーからファイルサーバーにファイルを転送することです。 特定のビデオクリップが現在配置されているサーバーを特定するために、データベースにはリンクテーブルvideos_serversがあります。 ビデオストリーミングをブロードキャストするためのモジュールは、すべてのファイルサーバーと変換サーバーにインストールされます。 サーバー間でファイルを移動するために、NFSプロトコルが使用されます。

変換キューは、beanstalkdキューサーバー( http://kr.github.com/beanstalkd/ )を使用して編成されます。 テストでは、30個のワーカーが6コアサーバーで実行できることが示されています。 30人のユーザーが、システム全体のパフォーマンスを損なうことなく、同時にビデオを変換できます(Webサーバー側のページ生成時間は許容範囲内です)。 多数の労働者を使用したテストは実施されませんでしたが、十分な力のマージンがあり、必要に応じて労働者の数を増やすことができます。

サーバーソフトウェア


Debian Lennyは、変換サーバーとすべてのファイルサーバーにインストールされます。

ビデオ処理ソフトウェア

ビデオをMP4形式に変換するには、現時点で最も人気のあるソリューション-ffmpeg( http://www.ffmpeg.org/ )が使用されます 。 ffmpegは、さまざまな形式のビデオを変換する素晴らしい仕事をし、マルチコアシステムで複数のプロセッサコアを使用できます。 後処理には、gpacパッケージ( http://gpac.sourceforge.net/ )のすばらしいMP4Boxユーティリティを使用します。 ffmpegは「moov-atoms」(ビデオに関するメタ情報)をファイルの最後に配置するため、後処理が必要ですが、ユーザーがビデオが完全にロードされるのを待たずにビデオを視聴できるようにするには、これらのアトムがファイルの先頭にある必要があります。 MP4Boxはそれらを先頭に移動し、さらに、すべての標準に従ってファイルを持ち込み、対応するモジュールを介したストリーミングに適しています。

 $ ffmpeg -vpre videobam -y -i input.avi -s 320x240 -vcodec libx264 -acodec libfaac -threads 0 -ab 64k -b 400k -bt 500k -g 24 -r 24 temp.mp4
 $ MP4Box -add temp.mp4 output.mp4

-g 24オプションに注意してください。 新しいキーフレームが保存されるフレーム数を決定します。 ユーザーが長いビデオを完全にロードされるのを待たずにスクロールできるように、キーフレームの存在が必要です。 この機能は、変換モジュールを使用して実装されます。 クライアント(ブラウザーまたはFlashプレーヤー)は、起動GETパラメーターをWebサーバーに送信します。これは、変換モジュールによって処理され、再生を開始する秒数を意味します。

 GET /output.mp4?start=856.733 HTTP / 1.1

さらに、 -threads 0パラメーター 、プロセッサコアの数を自動的に決定してプロセスで使用する必要性をプログラムに示すことにより、変換速度大幅に向上させます。 必要なフレーム数-r 24を指定することが重要です。 1秒あたりのフレーム数が不適切である(主にスクリーンキャスト)ため、一部のビデオで問題が発生しました。このため、ビデオの継続時間に対して変換時間が完全に不適切でした。

各ビデオについて、特定の時点でスクリーンショットが撮影されるため、ユーザーはビデオの内容をすばやく見ることができます。 そのような画像の例は、 http://videobam.com/tourで見ることができます。 ffmpegはこれらの写真をすばやく撮ることができません(彼はビデオを適切な瞬間に巻き戻してから写真を撮ります)。 すばやく写真を撮るには、mplayerユーティリティ( http://www.mplayerhq.hu/ )を使用します。このユーティリティは、キーフレームを使用してほぼ瞬時にファイルを移動して写真を撮影します。

 $ mplayer -ss 00:00:04 -sstep 12 -frames 16 -vo jpeg:outdir = / tmp / pictures / -nosound output.mp4

すべてのソフトウェアはソースコードから手動でアセンブルされることに注意してください(対応するバージョン管理システムから複製されるか、新しいビルドが使用されます)。 安定したブランチの最新バージョンを使用することは非常に重要です。バグが修正された瞬間からこれらの修正がLinuxディストリビューションのパッケージに反映されるまでに時間がかかるためです。 特に、一部のQuickTimeクリップをMP4形式に変換するときに音が途切れるという問題が発生しました。 この問題は、最新のlibfaacおよびlibfaadライブラリをインストールすることで正常に解決されました。

サーバーモジュール

注:h264モジュールをビルドするには、パッチhttp://pastie.org/1405286を適用する必要がある場合があります。

 $ cd nginx-0.8.53
 $ ./configure --add-module = .. / nginx_mod_h264_streaming-2.2.7 / --add-module = .. / ngx_http_secure_download /

ストリーミングビデオは、nginx Webサーバー用のh264モジュール( http://h264.code-shop.com/ )によって提供されます。 このモジュールのセットアップは非常に簡単です。

/usr/local/nginx/conf/nginx.conf
場所〜\ .mp4 $ {
   mp4;
 }

サーバーを再起動し、10秒からビデオをダウンロードしようとします。

 $ wget -O temp.mp4“ http://videobam.com/test.mp4?start=10.0”

リンクのコピー(ホットリンク)から保護するために、HTTP Secure Downloadモジュール( http://github.com/replay/ngx_http_secure_download )を使用します。 設定でソルトセットを使用して、ビデオファイルへのリンクをエンコードできます。

/usr/local/nginx/conf/nginx.conf
場所〜* /ビデオ{
   secure_download on;
   secure_download_path_modeファイル。
   secure_download_secret saltsaltsalt $ remote_addr;

   if($ secure_download = "-1"){
       /expired.html breakを書き換えます。
   }
   if($ secure_download = "-2"){
       /bad_hash.html breakを書き換えます。
   }
   if($ secure_download = "-3"){
       500を返します。
   }

   mp4;
  書き換え^(。*)/ [0-9a-zA-Z] * / [0-9a-zA-Z] * $ $ 1ブレーク;
 }

ダウンロードリンクは次のように生成されます。

パブリック関数secure_url($ url)
 {
   $ ts =時間()+ 3600;
   $ ts_in_hex = dechex($ ts);
   $ secret = 'saltsaltsalt'。  $ _SERVER ['REMOTE_ADDR'];
   $ hash = md5($ url。 '/'。$ secret。 '/'。$ ts_in_hex);
   $ urlを返します。  「/」。  $ハッシュ。  「/」。  $ ts_in_hex;
 }

NFSとautofs

ファイルサーバーを操作するために、autofsが変換サーバーにインストールされます。 要求に応じて必要なファイルサーバーをマウントします。 すべてのNFSパーティションはソフトモードでマウントされ、ファイルサーバーに障害が発生した場合にコピープロセスがフリーズするのを防ぎます。

/etc/auto.storage
 0:/ var / www / shared / local_storage
 1 -fstype = nfs、rw、async、soft、intr、timeo = 20、rsize = 64000、wsize = 64000 f1.videobam.com:/var/storage
 2 -fstype = nfs、rw、async、soft、intr、timeo = 20、rsize = 64000、wsize = 64000 f2.videobam.com:/var/storage
 3 -fstype = nfs、rw、async、soft、intr、timeo = 20、rsize = 64000、wsize = 64000 f3.videobam.com:/var/storage
 4 -fstype = nfs、rw、async、soft、intr、timeo = 20、rsize = 64000、wsize = 64000 f4.videobam.com:/var/storage

すべてのサーバー上のファイルとフォルダーの構造は同一であるため、ファイルサーバーでの作業は、パステンプレートでサーバー識別子を置き換えることにより透過的に実行されます。 特定のディレクトリ内のファイルとフォルダの数に関するext3ファイルシステムの制限について覚えておくことが重要です。すべてのビデオは、videos / a / ab / video.mp4という形式のディレクトリに保存されます。「a」と「ab」はビデオ名の最初の文字です。

クライアント部


前述のように、VideoJS( http://videojs.com )を使用して、HTML5ビデオを再生およびスタイルします。 さらに、VideoJSはFlashプレーヤーへの「よりスマートな」ロールバックを実行します(ブラウザーがソースリストのビデオファイルをサポートしていない場合)。 Flashプレーヤーとして、flowplayer( http://flowplayer.org )が使用されます。

テーマ別リンク


ソフトウェア:

beanstalkd kr.github.com/beanstalkd
VideoJS videojs.com
flowplayer flowplayer.org
ffmpeg www.ffmpeg.org
mplayer www.mplayerhq.hu
gpac(MP4Box) gpac.sourceforge.net
nginx 0.8.53 nginx.org/en
nginx h264ストリーミングモジュールh264.code-shop.com
nginx httpセキュアダウンロードgithub.com/replay/ngx_http_secure_download
nginxアップロード進行モジュールgithub.com/masterzen/nginx-upload-progress-gimodule

追加資料:

diveintohtml5.org/video.html
rob.opendot.cl/index.php/useful-stuff/ffmpeg-x264-encoding-guide
sites.google.com/site/linuxencoding/x264-ffmpeg-mapping
x264dev.multimedia.cx
rodrigopolo.com/ffmpeg/cheats.html
e-mats.org/2010/01/fixing-stuttering-audio-with-ffmpeg-and-quicktime
www.videohelp.com/tools/mp4box

Source: https://habr.com/ru/post/J111249/


All Articles