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



All Articles