ã¯ããã«
ã¿ãªããããã«ã¡ã¯ïŒ æ°ãæåã ãnginxã䜿çšãããªã³ã©ã€ã³ãããªã®ãããŒããã£ã¹ãããšããèšäºãHabrã§å ¬éãããŸãããAecktannã¯ããããªæŸéçšã«nginxåãã«éçºããã¢ãžã¥ãŒã«nginx-rtmp-moduleã®å®è£ çµéšã«ã€ããŠèªããŸããã ãã以æ¥ããã®è£œåã¯ç©æ¥µçã«éçºãããŠããŸããããã®èšäºã§ã¯ããã®è£œåã«ã€ããŠè©³ãã説æããŸãã
ãããªã¹ããªãŒã ãã¯ã©ã€ã¢ã³ãã«éä¿¡ããã«ã¯ããããŒããã£ã¹ã¿ãŒãå¿ èŠã§ãã ã©ã€ãã¹ããªãŒã ãŸãã¯é²ç»ãããªã®ãããŒããã£ã¹ãïŒVODããããªãªã³ããã³ãïŒã§ãã ãããªæŸéæè¡ã¯å€æ°ãããŸãã ãã®äžã§ããRTMPãMPEG-TSãªã©ã®åŸæ¥ã®ãããã³ã«ãšãHTTPãä»ããã¢ãããã£ããããŒããã£ã¹ãã®æè¿ã®æè¡ãåºå¥ã§ããŸãã åŸè ã«ã¯ãHLSïŒAppleïŒãHDSïŒAdobeïŒãSmooth StreamingïŒMicrosoftïŒãMPEG-DASHãå«ãŸããŸãã ãã¯ãããžãŒãéžæããéã®äž»ãªèŠå ã¯ãã¯ã©ã€ã¢ã³ãåŽã§ã®ãµããŒãã§ãã RTMP圢åŒã§ã®ãããŒããã£ã¹ããçŸåšæãäžè¬çãªãã®ã®1ã€ã§ããçç±ã§ãã HLSãããã³ã«ã¯ãAppleããã€ã¹ãšäžéšã®AndroidããŒãžã§ã³ã§ãµããŒããããŠããŸãã
nginx-rtmpããã«ãããã³æ§æããŸã
nginx-rtmpã¢ãžã¥ãŒã«ãnginxã«è¿œå ããã«ã¯ãä»ã®ã¢ãžã¥ãŒã«ãšåæ§ã«ãnginxãæ§æãããšãã«--add-moduleãªãã·ã§ã³ã§æå®ããå¿ èŠããããŸãã
./configure --add-module=/path/to/nginx-rtmp-module
ã¢ã»ã³ããªããã³ã€ã³ã¹ããŒã«åŸãnginx.confæ§æãã¡ã€ã«ã«rtmp {}ã»ã¯ã·ã§ã³ãè¿œå ããŸãã æ§æã®ã«ãŒãã«è¿œå ããå¿ èŠããããŸãã äŸïŒ
rtmp { server { listen 1935; application myapp { live on; } } }
å€ãã®å Žåããã®åçŽãªæ§æã§ååã§ãã myappãšããååã®RTMPã¢ããªã±ãŒã·ã§ã³ãèšå®ããŸãã ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãåŸã§ã¹ããªãŒã ãå ¬éããããããã¹ããªãŒã ãåçããŸãã åã¹ã¬ããã«ã¯åºæã®ååããããŸãã äžèšã®æ§æã«é¢ãã1ã€ã®éèŠãªãã¥ã¢ã³ã¹ã«æ³šç®ãã䟡å€ããããŸãã ããã¯ãnginxã¯ãŒã«ãŒã®æ°ã1ã«çããå ŽåïŒéåžžã¯nginx.confã®å é ã«èšå®ãããŠããå ŽåïŒã«åœãŠã¯ãŸããŸãã
worker_processes 1;
å€æ°ã®ã¯ãŒã«ãŒã§ã©ã€ããããŒããã£ã¹ãã䜿çšã§ããããã«ããã«ã¯ãrtmp_auto_push onãã£ã¬ã¯ãã£ããæå®ããå¿ èŠããããŸãïŒ ãã¯ãŒã«ãŒãšããŒã«ã«ãªã¬ãŒãã»ã¯ã·ã§ã³ãåç §ïŒã
ã©ã€ãã¹ããªãŒã ã®å ¬éãšåç
Flashãã¬ãŒã€ãŒïŒJWPlayerãFlowPlayerãStrobeãªã©ïŒã䜿çšããŠããããªãå ¬éããã³åçã§ããŸãã ãã ããffmpegïŒããã³ffplayïŒã¯ããµãŒããŒã¹ããªãŒã ã®ãããŒããã£ã¹ãããã¹ãã«ãã䜿çšãããŸãã 次ã®ã³ãã³ãã§test.mp4ãã¹ããã¡ã€ã«ã®ãããŒããã£ã¹ããéå§ããŸãã
ffmpeg -re -i /var/videos/test.mp4 -c copy -f flv rtmp://localhost/myapp/mystream
RTMPã¯éãããã³ãŒããã¯ã»ããããµããŒãããŸãããH264ãAACãªã©ã®äººæ°ã®ããã³ãŒããã¯ããã®äžã«å«ãŸããŠããããšã«æ³šæããŠãã ããã ãã¹ããã¡ã€ã«ã®ã³ãŒããã¯ãRTMPãšäºææ§ããªãå Žåããã©ã³ã¹ã³ãŒãã£ã³ã°ãå¿ èŠã§ãã
ffmpeg -re -i /var/videos/test.mp4 -c:v libx264 -c:a libfaac -ar 44100 -ac 2 -f flv rtmp://localhost/myapp/mystream
ãã¡ã€ã«ãŸãã¯å¥ã®ãœãŒã¹ããã¹ããªãŒã ããããŒããã£ã¹ãã§ããŸãã ããšãã°ãã©ã€ãMPEG-TSã¹ããªãŒã ãvideo.example.com/livechannel.tsã«ãããŒããã£ã¹ãããŠãããšä»®å®ããå Žåãrtmpã§ã©ããããããšãã§ããŸãã
ffmpeg -i http://video.example.com/livechannel.ts -c copy -f flv rtmp://localhost/myapp/mystream
ããŒã«ã«Webã«ã¡ã©ããã®ãããŒããã£ã¹ãã®äŸïŒ
ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an -f flv rtmp://localhost/myapp/mystream
次ã®ã³ãã³ãã§ffplayã䜿çšããŠã¹ããªãŒã ãåçã§ããŸãã
ffplay rtmp://localhost/myapp/mystream
ãããŠæåŸã«ãJWPlayerã䜿çšããŠãã©ãŠã¶ããã¹ããªãŒã ãåçããç°¡åãªäŸïŒ/ test / wwwã¢ãžã¥ãŒã«ãã£ã¬ã¯ããªã§å®å šã«æäŸïŒïŒ
<script type="text/javascript" src="/jwplayer/jwplayer.js"></script> <div id="container">Loading the player ...</div> <script type="text/javascript"> jwplayer("container").setup({ modes: [ { type: "flash", src: "/jwplayer/player.swf", config: { bufferlength: 1, file: "mystream", streamer: "rtmp://localhost/myapp", provider: "rtmp", } } ] }); </script>
ãããªãªã³ããã³ã
ãã®ã¢ãžã¥ãŒã«ã¯ãmp4ããã³flv圢åŒã®ãããªãã¡ã€ã«ã®ãããŒããã£ã¹ãããµããŒãããŠããŸãã èšå®äŸïŒ
application vod { play /var/videos; }
ããããåçããå Žåããã¡ã€ã«åãæå®ããå¿ èŠããããŸããæå®ããªãå Žåããã¹ãŠãã©ã€ããããŒããã£ã¹ãã«äŒŒãŠããŸãã
ffplay rtmp://localhost/vod/movie1.mp4 ffplay rtmp://localhost/vod/movie2.flv
ãªã¬ãŒ
åæ£ã·ã¹ãã ãæ§ç¯ããå Žåãè² è·ãåæ£ããããã«ãããŒãäžç¶ã§ããããšãéèŠã§ã
å€æ°ã®ãµãŒããŒäžã ã¢ãžã¥ãŒã«ã¯ãããã·ã¥ãšãã«ã®2çš®é¡ã®ãªã¬ãŒãå®è£ ããŠããŸãã æåã®ã¿ã€ãã®ãªã¬ãŒ
ããŒã«ã«ã§å ¬éãããã¹ããªãŒã ããªã¢ãŒããµãŒããŒã«è»¢éããããšãããã³ãªã¢ãŒããµãŒããŒã転éããããšã§æ§æãããŸãã
ããŒã«ã«ãµãŒããŒãžã®ã¹ããªãŒã ã ãªã¬ãŒããã·ã¥ã®äŸïŒ
application myapp { live on; push rtmp://cdn.example.com; }
ãããªã±ãŒã·ã§ã³ãrtmpïŒ// localhost / myapp / mystreamã§éå§ããããšããªã¢ãŒããµãŒããŒãžã®æ¥ç¶ãäœæãããmystreamã¹ããªãŒã ãããã«rtmpïŒ//cdn.example.com/myapp/mystreamã«ãããªãã·ã¥ãããŸãã ããŒã«ã«å ¬éãçµäºãããšãcdn.example.comãžã®æ¥ç¶ã¯èªåçã«çµäºããŸãã
ãã«ãªã¬ãŒã¯éã®æäœãå®è¡ããŸãã
application myapp { live on; pull rtmp://cdn.example.com; }
ãã®äŸã§ã¯ãã¹ããªãŒã rtmpïŒ// localhost / myapp / mystreamãããŒã«ã«ã§åçãããã¯ã©ã€ã¢ã³ãã衚瀺ããããšãrtmpïŒ//cdn.example.com/myapp/mytstreamã䜿çšããŠæ¥ç¶ãäœæããããªã¢ãŒãã¹ããªãŒã ã¯ããŒã«ã«ãµãŒããŒã«äžç¶ãããŸãããã¹ãŠã®ããŒã«ã«ã¯ã©ã€ã¢ã³ãã«ã¢ã¯ã»ã¹ã§ããŸãã ã¯ã©ã€ã¢ã³ããæ®ã£ãŠããªãæç¹ã§ãæ¥ç¶ãå®äºããŸãã
ã¢ãã€ã«æŸéïŒHLSïŒ
iPhone / iPadããã€ã¹ãããã³Androidã®æ°ããããŒãžã§ã³ãžã®ãããŒããã£ã¹ãã«ã¯ãHLSãããã³ã«ïŒHTTPã©ã€ãã¹ããªãŒãã³ã°ïŒã䜿çšãããŸãã
ãã®ãããã³ã«ã¯Appleã«ãã£ãŠéçºãããHTTPçµç±ã§éä¿¡ãããMPEG-TS / H264 / AACã¹ããªãŒã ã«ãåãå»ãŸãããŸãã m3u8圢åŒã®ãã¬ã€ãªã¹ããã¹ããªãŒã ã«æ·»ä»ãããŸãã Nginxã¯ãHTTPãå®å šã«ã¬ã³ããªã³ã°ããæ¹æ³ãç¥ã£ãŠããŸãã ãã®ããããã¬ã€ãªã¹ããšHLSã¹ããªãŒã ã®ãã©ã°ã¡ã³ããäœæããã³æŽæ°ããå€ããã©ã°ã¡ã³ãã®åé€ãç£èŠããã ãã§ãã ãããè¡ãããã«ãnginx-rtmp-hlsã¢ãžã¥ãŒã«ããããŸãã ããã¯hlsãã£ã¬ã¯ããªã«ãããŸãããããã©ã«ãã§ã¯åéãããŸããã ffmpegããã±ãŒãžã«å«ãŸããlibavformatã©ã€ãã©ãªãå¿ èŠã§ãã HLSãµããŒãã䜿çšããŠnginxããã«ãããã«ã¯ãæ§æäžã«ãã®ã¢ãžã¥ãŒã«ãæ瀺çã«è¿œå ããå¿ èŠããããŸãã
./configure --add-module=/path/to/nginx-rtmp-module --add-module=/path/to/nginx-rtmp-module/hls
ãã°ããåã«ãffmpegãããžã§ã¯ããåå²ããããšãå€æããŸããã ãããŠçŸåšãffmpegãšavconvã®2ã€ã®ãããžã§ã¯ãããããŸãããããã£ãŠãã©ã€ãã©ãªã®äºææ§ïŒãšããããã¯ãéäºææ§ïŒã®åé¡ãããã«çºçãå§ããŸããã nginx-rtmpããã«ãããã«ã¯ãå ã®ffmpegãå¿ èŠã§ãã åæã«ãäžéšã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯avconvã®äœ¿çšã«åãæ¿ããŸããããããã¯ã¢ã»ã³ããªã«ã¯é©ããŠããŸããã ãã®å Žåã詳现ãªæé ãæžããŸããã
HLSãçæããã«ã¯ã次ã®ãã£ã¬ã¯ãã£ããæå®ããã ãã§ãã
application myapp { live on; hls on; hls_path /tmp/hls; hls_fragment 5s; }
æåŸã«ãhttp {}ã»ã¯ã·ã§ã³ã§ãHLSã«é¢é£ãããã¹ãŠã®æ»ãå€ãæ§æããŸãã
location /hls { root /tmp; }
次ã«ãmystreamã¹ããªãŒã ãmyappã¢ããªã±ãŒã·ã§ã³ã«å ¬éããiPhoneãã©ãŠã¶ãŒã§ã¢ãã¬ã¹ããŒã«example.com/hls/mystream.m3u8ãšå ¥åããŸã ã ããã«ãã¹ããªãŒã ã¯htmlãããªã¿ã°ã«åã蟌ãããšãã§ããŸãã
<video width="600" height="300" controls="1" autoplay="1" src="http://example.com/hls/mystream.m3u8"></video>
iPhoneã§åçããã«ã¯ãã¹ããªãŒã ãH264ããã³AACã§ãšã³ã³ãŒãããå¿ èŠããããŸãã ãœãŒã¹ã¹ããªãŒã ããããã®æ¡ä»¶ãæºãããªãå Žåããã©ã³ã¹ã³ãŒãã£ã³ã°ãæ§æããå¿ èŠããããŸãã
åã³ãŒãã£ã³ã°
ãããªããããŒããã£ã¹ããããšããå€ãã®å Žåãçä¿¡ã¹ããªãŒã ãç°ãªãå質ãŸãã¯ä»ã®ã³ãŒããã¯ã«ãã©ã³ã¹ã³ãŒãããå¿ èŠããããŸãã ãã®ã¿ã¹ã¯ã¯RTMPãã£ã¹ããªãã¥ãŒã·ã§ã³ãšæ ¹æ¬çã«ç°ãªããåŸè ãšã¯ç°ãªããCPUè² è·ãé«ãã倧éã®ã¢ã¯ãã£ããªã¡ã¢ãªæ¶è²»ã䌎ããå€ãã®å Žåãã«ãã¹ã¬ããã®äœ¿çšã«äŸåããæœåšçã«äžå®å®ã§ãã ãã®ãããã¡ã€ã³ãµãŒããŒããã»ã¹ã«å«ããã¹ãã§ã¯ãªããçæ³çã«ã¯å¥ã®ããã»ã¹ã§å®è¡ããå¿ èŠããããŸãã ãã®åé¡ã解決ããããã®åªããããŒã«ããã§ã«ååšããããšã¯æ³šç®ã«å€ããŸã-ããã¯åãffmpegã§ãã èšå€§ãªæ°ã®ã³ãŒããã¯ããã©ãŒãããããã£ã«ã¿ãŒããµããŒãããå€ãã®ãµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšã§ããŸãã åæã«ãéåžžã«ã·ã³ãã«ã§ãããã³ãã¥ããã£ã«ãã£ãŠç©æ¥µçã«ãµããŒããããŠããŸãã nginx-rtmpã¢ãžã¥ãŒã«ã¯ãffmpegã䜿çšããããã®ã·ã³ãã«ãªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã execãã£ã¬ã¯ãã£ãã䜿çšãããšãçä¿¡ã¹ããªãŒã ã®å ¬éæã«å€éšã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããŸãã å ¬éãå®äºãããšãã¢ããªã±ãŒã·ã§ã³ã匷å¶çã«çµäºããŸãã ãŸããå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ãçªç¶çµäºããå Žåãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®åèµ·åããµããŒããããŸãã
application myapp { live on; exec ffmpeg -i rtmp://localhost/myapp/$name -c:v flv -c:a -s 32x32 -f flv rtmp://localhost/myapp32x32/$name; } application myapp32x32 { live on; }
ãã®äŸã§ã¯ãffmpegã䜿çšããŠãçä¿¡ãããªãSorenson-H263ã«ãã©ã³ã¹ã³ãŒããã32x32ã«ãµã€ãºå€æŽããŠãçµæãmyapp32x32ã«å ¬éããŸãã åæã«è€æ°ã®execãã£ã¬ã¯ãã£ããèšå®ã§ããŸããããã«ãããã¹ããªãŒã ã§å€æãå®è¡ããçµæãããŒã«ã«ãµãŒããŒãšãªã¢ãŒããµãŒããŒã®äž¡æ¹ã§ä»ã®ã¢ããªã±ãŒã·ã§ã³ã«å ¬éããŸãã ãã®ãã£ã¬ã¯ãã£ãã¯ã$ appïŒã¢ããªã±ãŒã·ã§ã³åïŒã$ nameïŒã¹ããªãŒã åïŒãªã©ã®ããã€ãã®å€æ°ããµããŒãããŠããŸãã
åŽåè ãšããŒã«ã«ãªã¬ãŒ
ãåç¥ã®ããã«ãnginxã¯ã·ã³ã°ã«ã¹ã¬ãããµãŒããŒã§ãã ææ°ã®ããã»ããµã®ãã¹ãŠã®ã³ã¢ãå¹æçã«äœ¿çšããããã«ãéåžžã¯è€æ°ã®ã¯ãŒã«ãŒã§å®è¡ãããŸãã HTTPãªã¯ãšã¹ãã®åŠçã¯éåžžãäºãã«ç¬ç«ããŠè¡ãããç¹å®ã®å ŽåïŒãã£ãã·ã¥ã®å Žåãªã©ïŒã«ã®ã¿ãå ±æããŒã¿ã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã ãã®ãããªããŒã¿ã¯å ±æã¡ã¢ãªã«ä¿åãããŸãã
ã©ã€ãæŸéã§ã¯ãç¶æ³ãç°ãªããŸãã ã¹ããªãŒã ãåçãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãæ¥ç¶ã¯ãæããã«ã¹ããªãŒã ãå ¬éããæ¥ç¶ã«äŸåããŸãã ãã®å Žåãå ±æã¡ã¢ãªã®äœ¿çšã¯éå¹ççã§ãäžå¿ èŠã«æéãããããåæåãšããã©ãŒãã³ã¹ã®å€§å¹ ãªäœäžã«ã€ãªãããŸãã ãããã£ãŠãè€æ°ã®ã¯ãŒã«ãŒã䜿çšããããã«ãUNIXãœã±ãããä»ããå éšãªã¬ãŒã¡ã«ããºã ãå®è£ ãããŸããã å®éããã®ãããªãªã¬ãŒã¯ãå®éã«ã¯éåžžã®å€éšããã·ã¥ãªã¬ãŒãšéãã¯ãããŸããã ããŒã«ã«ãªã¬ãŒã¯ã次ã®ãã£ã¬ã¯ãã£ãã«ãã£ãŠæå¹ã«ãªããŸãã
rtmp_auto_push on;
æ§æãã¡ã€ã«ã®ã«ãŒãã»ã¯ã·ã§ã³ã§æå®ããå¿ èŠããããŸãã ããŒã«ã«åéä¿¡ã¯ãã©ã€ããããŒããã£ã¹ãã«ã®ã¿å¿ èŠã§ããããšã«æ³šæããŠãã ããã
èšé²
å€ãã®å Žåãå ¬éãããã¹ããªãŒã ããã£ã¹ã¯ã«æžã蟌ãå¿ èŠããããŸãã ãã®ã¢ãžã¥ãŒã«ã䜿çšãããšãã¹ããªãŒã ïŒãªãŒãã£ãªããããªãããŒãã¬ãŒã ïŒããã³ã¹ããªãŒã å šäœããåå¥ã®ããŒã¿ãšããŠèšé²ã§ããŸãã ãã¡ã€ã«ãµã€ãºãšèšé²å¯èœãªãã¬ãŒã æ°ã«å¶éãèšå®ã§ããŸãã 次ã®äŸã§ã¯ãåã¹ããªãŒã ã®æåã®128Kãèšé²ããŸãã
record all; record_path /tmp/rec; record_max_size 128K;
é²é³ã¯ã/ tmp / recãã£ã¬ã¯ããªã§flv圢åŒã§è¡ãããŸãã
æåã¢ãŒãã§èšé²ã管çããhttpãªã¯ãšã¹ãã䜿çšããŠèšé²ã®ãªã³/ãªããåãæ¿ããããšãã§ããŸãã ãããè¡ãã«ã¯ãå¶åŸ¡ã¢ãžã¥ãŒã«ã䜿çšããŸãã 圌ã«é¢ããæ å ±ã¯ãããžã§ã¯ãã®ãŠã§ããµã€ãã§èŠã€ããããšãã§ããŸãã
æ¿èªãšããžãã¹ããžãã¯
å€ãã®å Žåããããªã®å ¬éãšåçã«ã¯å¶éãŸãã¯äŒèšãå¿ èŠã§ãã ããã¯ãããã䜿çšãããŠãããããžã§ã¯ãã®ããžãã¯ãåå ã§çºçããŸãã æãäžè¬çãªãã®ãããªã±ãŒã¹ã¯ããŠãŒã¶ãŒããããªãèŠèŽããããã®ã¢ã¯ã»ã¹ãèš±å¯ããåã«ãŠãŒã¶ãŒãèªèšŒããå¿ èŠãããããšã§ãã ãããžã§ã¯ãã®ããžãã¹ããžãã¯ããããŒããã£ã¹ã¿ãŒã«çµ±åããããã«ãã¢ãžã¥ãŒã«ã¯on_publishãon_playãªã©ã®HTTPã³ãŒã«ããã¯ãå®è£ ããŸãã ãµãŒããŒã³ãŒãã¯ãã¢ãã¬ã¹ãã¹ããªãŒã åãããŒãžã¢ãã¬ã¹ãªã©ãã¯ã©ã€ã¢ã³ãã«é¢ããå©çšå¯èœãªãã¹ãŠã®æ å ±ãåãåããŸãã HTTPã¹ããŒã¿ã¹2xxãè¿ãããå Žåãã³ãŒã«ããã¯ã¯æ£åžžã«å®äºãããšèŠãªãããã¯ã©ã€ã¢ã³ãã¯åŒãç¶ãåäœããŸãã ããããªããšãæ¥ç¶ãåæãããŸãã
on_publish http://example.com/check_publisher; on_play http://example.com/check_player;
çµ±èš
ãã€ã§ããäœåãã®ã¯ã©ã€ã¢ã³ãããµãŒããŒã«æ¥ç¶ã§ããŸãã åœç¶ããªã¹ãã衚瀺ãããããããã«ãã£ãŠå ¬éãŸãã¯åçãããã¹ããªãŒã ã®ãã¹ãŠã®äž»èŠãªç¹æ§ã衚瀺ãããã§ããã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠã§ãã ããã«ããã®æ å ±ãèŠèŠçã«åæããããã°ã©ã ã§åŠçã§ããããšãéèŠã§ãã nginx-rtmpã¢ãžã¥ãŒã«ã«ã¯ãã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã ããã䜿çšããã«ã¯ãnginx.confã®httpã»ã¯ã·ã§ã³ã«æ¬¡ã®ãã£ã¬ã¯ãã£ããèšè¿°ããå¿ èŠããããŸãã
location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /path/to/stat.xsl/dir/; }
rtmp_statãã£ã¬ã¯ãã£ãã«ã¯ãã¹ããªãŒã ãå ¬éãŸãã¯åçããŠããã©ã€ãã¯ã©ã€ã¢ã³ãã®å®å šãªèª¬æãã¢ããªã±ãŒã·ã§ã³ããã³ãµãŒããŒã®ãªã¹ããå«ãXMLããã¥ã¡ã³ãã®åºåãå«ãŸããŸãã ãã®ããã¥ã¡ã³ãã¯ãœãããŠã§ã¢åŠçã«ã¯åœ¹ç«ã¡ãŸãããèŠèŠåæã«ã¯ãŸã£ããé©ããŠããŸããã ãã©ãŠã¶ã§ã¯ã©ã€ã¢ã³ãã®ãªã¹ãã衚瀺ã§ããããã«ããããã«ãrtmp_stat_stylesheetãã£ã¬ã¯ãã£ãã¯XMLã¹ã¿ã€ã«ã·ãŒãïŒstat.xslïŒãžã®çžå¯Ÿãã¹ãèšå®ããŸãã ãã®ãã¡ã€ã«ã¯ãããžã§ã¯ãã®ã«ãŒãã«ãããŸãã æå®ããURLã«é åžããããã«nginxãæ§æããå¿ èŠããããŸãã çµæã¯ãã©ãŠã¶ã§è¡šç€ºã§ããŸãã
ã¯ã©ã€ã¢ã³ãæ¥ç¶ãæ瀺çã«åæããããšã¯å¯èœã§ãã ãããè¡ãã«ã¯ãèšäºã«èšèŒãããŠããªãã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã䜿çšããŸãã
ã·ã³ãã«ãªã€ã³ã¿ãŒãããã©ãžãª
èšäºã®æåãããããããªããšããèšèãåžžã«äœ¿çšããŠããŸããã ãã¡ãããã¢ãžã¥ãŒã«ã¯ãããªã ãã§ãªããªãŒãã£ãªã¹ããªãŒã ããããŒããã£ã¹ãã§ããŸãã 以äžã¯ã/ var / musicããmp3ãã¡ã€ã«ããããŒããã£ã¹ãããbashã€ã³ã¿ãŒãããã©ãžãªå±ã®ç°¡åãªäŸã§ãã ãã®ã¹ããªãŒã ã¯ãWebããŒãžã«åã蟌ãŸããåçŽãªJWPlayerãåçã§ããŸãã
while true; do ffmpeg -re -i "`find /var/music -type f -name '*.mp3'|sort -R|head -n 1`" -vn -c:a libfaac -ar 44100 -ac 2 -f flv rtmp://localhost/myapp/mystream; done
é©åæ§
ãã®ã¢ãžã¥ãŒã«ã¯ãFMS / FMLEãWowzaãWirecastãªã©ãRTMPãããã³ã«ã§åäœãããã¹ãŠã®ã¡ã€ã³ãœãããŠã§ã¢ãšäºææ§ããããæãäžè¬çãªãã©ãã·ã¥ãã¬ãŒã€ãŒJWPlayerãFlowPlayerãStrobeMediaPlaybackã§ãã¹ããããffmpeg / avconvããã³rtmpdumpã§ãåäœããŸãã
è·é
ãã®ã¢ãžã¥ãŒã«ã¯ãéåæã·ã³ã°ã«ã¹ã¬ããnginxãµãŒããŒã¢ãã«ã䜿çšããŸãã ããã«ãããé«ãããã©ãŒãã³ã¹ãå®çŸã§ããŸãã ãã®ã¢ãžã¥ãŒã«ã¯ãã·ã³ã°ã«ã¯ãŒã«ãŒã¢ãŒãã®Intel Xeon E5320 / E5645ãã·ã³ã§äœ¿çšããŸãã ãã®ã¢ãŒãã§ã¯ãæ¢åã®ãããã¯ãŒã¯ã«ãŒãã®æ倧垯åå¹ ã§ãã2 Gbpsãå®çŸã§ããŸãã ã¢ãžã¥ãŒã«ã®ãŠãŒã¶ãŒã¯ãè€æ°ã®ã¯ãŒã«ãŒã䜿çšããããŒã«ã«ãªã¬ãŒã¢ãŒãã§åãæ¯çïŒã³ã¢ããã2GbpsïŒãç¶æãããããšã確èªããŸãã ç·Žç¿ã§ã¯ããããŒããã£ã¹ã¿ãŒã®ããã©ãŒãã³ã¹ã¯éåžžãCPUã§ã¯ãªããããã¯ãŒã¯ã«äŸåããããšã瀺ãããŠããŸãã
ä»ã®è£œåãšã¯çŽæ¥æ¯èŒããŸããã§ããããããããŒããã«ãã¹ã¬ããFMSãWowzaããã³Red5ã¯ããæ©èœçã§ãããå®è£ ã®ç¹æ§ã«ãããåæã«æ¥ç¶ãããã¯ã©ã€ã¢ã³ãã®æ°ãšCPUè² è·ã«é¢ãã決å®ãå€§å¹ ã«å€±ããŸãã ããã¯ã次ã®ãããªæ¯èŒãè¡ã£ãå€ãã®ãŠãŒã¶ãŒã«ãã£ãŠç¢ºèªãããŠããŸãã ãã§ã«è¿°ã¹ãèšäºã§ ã
ãããã«
çµè«ãšããŠãç§ã¯ã¢ãžã¥ãŒã«ãBSDã©ã€ã»ã³ã¹ã®äžã§é åžãããŠãããšèšããŸãã LinuxãFreeBSDãããã³MacOSäžã§ãã«ãããã³å®è¡ãããŸãã ãã®èšäºã§ã¯ãnginx-rtmp-moduleæ©èœã®ããäžéšã«ã€ããŠã®ã¿èª¬æããŸãã èå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ã䜿çšããŠãããžã§ã¯ãã«æ £ããããšãã§ããŸãã
- github.com/arut/nginx-rtmp-module githubã®ãããžã§ã¯ãããŒãžã
- github.com/arut/nginx-rtmp-module/wiki/Directivesã®äŸãå«ããã£ã¬ã¯ãã£ãã®å®å šãªèª¬æã
- æ°ããããŒãžã§ã³ããã°ä¿®æ£ãããã³æ°ããrarut.wordpress.comæ©èœã«ã€ããŠæžããŠããããã°ã
- ç§ã質åã«çããŠã groups.google.com / group / nginx- rtmpãšgroups.google.com/group/nginx-rtmp-ruãæ±ããŠããåé¡ã«ã€ããŠã¢ãžã¥ãŒã«ãŠãŒã¶ãŒãšè©±ãåãGoogleã°ã«ãŒãã
ãã®ãããžã§ã¯ããHabrã®èªè ã«ãšã£ãŠèå³æ·±ããšæããããå¬ããã§ãã
ã¿ããªããããšãïŒ