Linux/서버

VOD 스트리밍서버 구축하기 - 1

전거가감 2015. 12. 2. 10:50
반응형

출처 : http://blog.syszone.co.kr/2719


1. 설치 환경 준비 하기

우선 RHEL5 환경에서 encoding 서비스를 위해 필요한 패키지를 설치할 수 있도록 YUM 
환경을 구성한다.

yum package install - RHEL5 에서 Centos5 Yum 저장소 이용하기

# yum -y install yum-priorities
# rpm -Uvh 
http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

# vi /etc/yum.repos.d/centos.repo 
----------------------------------------------------

[base-be]
name=CentOS-5 - Base
#repo=os
baseurl=http://mirror.centos.org/centos/5.2/os/x86_64/
enabled=1
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/5.2/os/x86_64/RPM-GPG-KEY-CentOS-5

[updates-be]
name=CentOS-5 - Updates
baseurl=http://mirror.centos.org/centos/5.2/updates/x86_64/
enable=1
gpgcheck=1

[centosplus-be]
name=CentOS-5 - Plus
baseurl=http://mirror.centos.org/centos/5.2/centosplus/x86_64/
enabled=1
gpgcheck=1

[addons-be]
name=CentOS-5 - Addons
baseurl=http://mirror.centos.org/centos/5.2/addons/x86_64/
enable=1
gpgcheck=1

[extras-be]
name=CentOS-5 - Extras
baseurl=http://mirror.centos.org/centos/5.2/extras/x86_64/
enable=1
gpgcheck=1

[fasttrack-be]
name=CentOS-5 - Fasttrack
baseurl=http://mirror.centos.org/centos/5.2/fasttrack/x86_64/
enabled=1
gpgcheck=1

-------------------------------------------------------------

# yum -y install yum-priorities
# yum -y install yum
# yum -y install yum-utils



2. FFMPEG로 인코딩 환경 구축하기 


- 기본 프로그램 설치

# yum install ruby
# yum install ncurses-devel*
# yum install lame
# yum install libogg
# yum install libvorbis
# yum install flvtool2
# yum install ffmpeg

- 코덱 설치

# wget http://www3.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2
# bunzip2 essential-20061022.tar.bz2
# tar xvf essential-20061022.tar
# mkdir /usr/local/lib/codecs/
# mv essential-20061022/* /usr/local/lib/codecs/
# chmod -R 755 /usr/local/lib/codecs/

# vi /etc/ld.so.conf
# ldconfig

3. ffmpeg 기본 사용법

AVI -> FLV

# ffmpeg -i onestar.avi -ar 22050 -ab 32 -f flv -s 640x480 onestar.flv | flvtool2 -U stdin onestar.flv

-i             : input file name
-ar          : audio sampling rate in HZ
-ab          : audio bit rate in kbit/s
-f             : output format
-s             : output dimension

FLV -> JPG

# ffmpeg -i test.flv -an -r 1 -y -s 640x480 test%d.jpg

-i             : input file name
-an         : disable audio 
-r            : fps
-y           : overwrite file
-s            : output dimension

Particular frame to JPG

# ffmpeg -i test.flv -an -ss 00:00:10 -t 00:00:01 -r 1 -y -s 640x480 test%d.jpg

-ss          : recored start time
-t            : record end time last for

- ffmpeg 실무 사용법

ffmpeg를 이용하여 avi 파일을 flv로 변환 한다.

# ffmpeg -i onestar.avi -b 512k -ar 22050 -ab 128k -r 24 -s 400x300 onestar.flv
 
or

# ffmpeg -i "onestar.avi" -vcodec flv -f flv -r 29.97 -s 400x300 -aspect 4:3 -b 320k -g 160 -cmp 2 -subcmp 2 -mbd 2 -flags +aic+cbp+mv0+mv4+trell -ac 1 -ar 22050 -ab 128k "onestar.flv"

- FLV에 메타데이터 넣기 (스트리밍 보기-중간 구간 바로 보기)

# flvtool2 -U onstar.flv

- 동영상 썸네일 만들기

# ffmpeg -y -i onestar.avi -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 400x300 onestar.png

# ffmpeg  -itsoffset -4  -i test.avi -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 test.jpg

4. mencoder를 이용한 동영상에 자막 넣기

동영상을 flv 로 변환할때 자막을 같이 넣을 경우 기존의 ffmpeg로는 자막 포함 기능이 
제공되지 않는다. 자막을 포함하여 인코딩을 할 수 있는 프로그램으로 mencoder이 있다.
설치는 yum으로 쉽게 가능하다.

# yum install mencoder

설치 후 자막의 언어 설정을 아래와 같이 한다.

$ vi ~/.mplayer/mencoder.conf
-------------------------------------------------------------------------

font="/usr/share/fonts/korean/TrueType/gulim.ttf"
subfont-text-scale=3
subcp=cp949

-------------------------------------------------------------------------

이제 mencoder로 자막을 포함해서 인코딩을 한다.

$ mencoder -noodml [avi파일]  -o [flv파일]  -sub $1.smi -of lavf -oac mp3lame -lameopts abr:br=128 -ovc lavc -lavcopts vcodec=flv:vbitrate=512:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 44100 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -vf-add scale=400:300


5. Web Streaming 을 위한 Player 연동하기

- 웹 FLV_Player 연동하기

웹에서 FLV 파일을 스트리밍으로 볼수 있는 Player는 여러가지가 있다.

* UCCUP에서 제공하는 Player - http://www.uccup.kr
http://flowplayer.org/download.html
* GRZ_JWMediaPlayer

- UCCUP Player 연동하기

아래 구문중 flv 파일명과 png 파일명을 수정 후 HTML 문서에 붙여 넣는다. 
flv,png 파일은 [UCCUP설치경로]/SERVICE 디렉토리 밑에 복사해 둔다.

<embed src="http://syszone.co.kr/uccup/UCCUp.swf?file=http://syszone.co.kr/uccup/file.php?f=onestar.flv&previewImage=http://syszone.co.kr/uccup/file.php?f=onestar.png&bufferTime=3&bgColor=-1
width="400" height="300" scale="noscale" bgcolor="#ffffff" type="application/x-shockwave-flash" allowFullScreen="true" 
allowScriptAccess="always" allowNetworking="all" pluginspage="
http://www.macromedia.com/go/getflashplayer">
</embed>

 

- GRZ_JWMediaPlayer 연동하기

아래는 textcube의 플러그인으로 연동된 GRZ_JWMediaPlayer를 이용하는 방법이다.

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="425" height="340">
<param name="movie" value="/plugins/GRZ_JWMediaPlayer/mediaplayer.swf"/>
<param name="allowfullscreen" value="true"/>
<param name="wmode" value="transparent"/>
<param name="flashvars" value="width=425&height=340&thumbsinplaylist=true&displayheight=320&overstretch=true&logo=&searchbar=false&linkfromdisplay=true&linktarget=_blank&file=/plugins/GRZ_JWMediaPlayer/mkpl.php?list=1|%5bhttp%5dblog.syszone.co.kr%2fattach%2f1%2f1466599573.flv|alang.flv+%289.64+MB%29|||||%5bhttp%5dblog.syszone.co.kr|"/>
<!--[if !IE]> <-->
<object type="application/x-shockwave-flash" transparent="yes" data="/plugins/GRZ_JWMediaPlayer/mediaplayer.swf" flashvars="thumbsinplaylist=true&displayheight=320&overstretch=true&logo=&searchbar=false&linkfromdisplay=true&linktarget=_blank&file=/plugins/GRZ_JWMediaPlayer/mkpl.php?list=1|%5bhttp%5dblog.syszone.co.kr%2fattach%2f1%2f1466599573.flv|alang.flv+%289.64+MB%29|||||%5bhttp%5dblog.syszone.co.kr|" width="425" height="340">
<p>
<a href="/plugins/GRZ_JWMediaPlayer/mediaplayer.swf">[Flash]</a></p>
</object>
<!--> <![endif]-->

</object>

- FlowPlayer 연동하기

기본 연동법 
------------------------------------------------------------------------------------

<object type="application/x-shockwave-flash" data="[your site]/FlowPlayer.swf"
width="320" height="263" id="FlowPlayer">

  <param name="allowScriptAccess" value="sameDomain"/>
  <param name="movie" value="[your site]/FlowPlayer.swf"/>
  <param name="quality" value="high"/>
  <param name="scale" value="noScale"/>
  <param name="wmode" value="transparent"/>
  <param name="flashvars" value="baseURL=[base URL]&amp;videoFile=movie.flv
  &amp;autoPlay=false&amp;loop=false&amp;autoBuffering=false
  &amp;splashImageFile=movie.png"/>
</object>

--------------------------------------------------------------------------------------
or 
--------------------------------------------------------------------------------------

<script type="text/javascript" src="flowplayer-3.0.2.min.js"></script>
<script>
flowplayer("player", "./flowplayer-3.0.2.swf");

</script>

<a href="http://syszone.co.kr/yaejin/data/11.flv" style="display:block;width:400px;height:300px" id="player">

</a>

--------------------------------------------------------------------------------------
or 
--------------------------------------------------------------------------------------

<script type="text/javascript" src="flowplayer-3.0.2.min.js"></script>
<script>
flowplayer("player", "./flowplayer-3.0.2.swf", {
    clip: {
        url: 'http://syszone.co.kr/yaejin/data/11.flv',
        autoPlay: false,


        onStart: function(clip) {
            pageTracker._trackPageview("configuration demo: " + clip.url);
        }
    }


});

</script>

<a href="http://syszone.co.kr/yaejin/data/11.flv" style="display:block;width:400px;height:300px" id="player">
<img src="
http://syszone.co.kr/yaejin/data/11.png" border=0 alt="Play this video" />
</a>
---------------------------------------------------------------------------------------
or (youtube 방식의 동영상 라이브러리 구현)
---------------------------------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<c:if test="true">
<!-- include desired tools -->
<script src="
http://syszone.co.kr/yaejin/jquery.min.js"></script>
<script src="
http://syszone.co.kr/yaejin/flowplayer-3.0.2.min.js"></script>
</c:if>
<script src="
http://syszone.co.kr/yaejin/flowplayer.playlist-3.0.1.min.js"></script>

<!-- player / playlist styling -->
<style>
/* player style */
/* container has a background image */
a.player {
        margin-top:40px;
        display:block;
        background:url(
http://syszone.co.kr/yaejin/img/splash.png) no-repeat;
        width:425px;
        height:298px;
        padding:0 126px 75px 127px;
        text-align:center;
        color:#fff;
        text-decoration:none;
        cursor:pointer;
}

/* splash image */
a.player img {
        margin-top:115px;
        border:0;
}


#player {
        float:left;
}

/* playlist style */
#playlist {
        width:300px;
        height:380px;
        overflow-y:auto;
        overflow-x:hidden;
        border:1px solid #ccc;
        padding:4px 10px 12px 10px;
        background-color:#efefef;
        margin-top:20px;
        float:left;
}

/* playlist entry */
#playlist a {
        display:block;
        width:260px;
        height:60px;
        padding:7px;
        background-color:#fff;
        border:1px solid #ccc;
        font:11px "bitstream vera sans", "lucida grande",verdana;
        text-decoration:none;
        margin-top:7px;
        color:#666;
}

/* different states of a playlist entry */
#playlist a:hover {
        background-color:#ffc;
}

#playlist a.progress {
        background-color:#efefef;
}

#playlist a.playing {
        border:1px solid #666;
        background-color:#ffc;
}

#playlist a.paused {
        border:1px solid #666;
        background-color:#ffc;
}

/* elements inside playlist entry */
#playlist a img {
        border:0;
        float:left;
        margin-right:10px;
}

#playlist a strong {
        color:blue;
        padding-bottom:5px;
}

#playlist a em {
        border:0;    
        float:left;
        margin-right:10px;
        background:url(
http://syszone.co.kr/yaejin/img/clock.gif) no-repeat 0 50%;
        padding-left:20px;
        color:#333;
        font-style:normal;
        margin-top:10px;
}

</style>


<!-- javascript setup. pretty simple stuff -->
<script>
$(function() {

        // setup player
        $f("player", "flowplayer-3.0.2.swf", {

                clip: {baseUrl: 'http://syszone.co.kr/yaejin/data'}

        // playlist plugin
        }).playlist("#playlist");

});
</script>


<!-- player container -->
<a id="player" class="player plain">
        <img src="
http://syszone.co.kr/yaejin/img/play.png" />
</a>

<!-- the playlist. simple HTML controlled with CSS -->

<div id="playlist">

<a href=071202-탄생1.flv>
<img src=http://syszone.co.kr/yaejin/data/071202-탄생1.png />
<strong>071202-탄생1</strong><br /><br>
</a>

<a href=071202-탄생2.flv>
<img src=http://syszone.co.kr/yaejin/data/071202-탄생2.png />
<strong>071202-탄생2</strong><br /><br>
</a>

.
.
</div>
<!-- let the rest of the page float normally -->
<br clear="all" />

------------------------------------------------------------------------------------


6. Encoding 관련 스크립트 제작

ffmpeg를 이용하여 avi 파일을 flv로 변환하는 스크립트

# vi /usr/bin/ffmpeg_encoder.sh [filename] [geometry]
-----------------------------------------------------------------------------------

#!/bin/sh

if [ $# -lt 2 ]
then
echo -n "using : ffmpeg_encoder.sh <filename> <geometry> ( movie 400x300 )
";

exit;
fi

ffmpeg -i $1.avi -b 512k -ar 22050 -r 24 -ab 128k -s $2 $1.flv 
ffmpeg -y -i $1.avi -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s $2 $1.jpg
flvtool2 -U $1.flv
echo -n "--------------------------------------------------------
$1.avi completed $1.flv to encoding..!!
--------------------------------------------------------
";

----------------------------------------------------------------------------------

mencoder를 이용하여 avi파일과 smi 자막파일을 flv 파일로 변환하는 스크립트

# vi /usr/bin/mencoder_encoder.sh 
----------------------------------------------------------------------------------

#!/bin/sh
if [ $# -lt 3 ]
then
echo -n "using : mencoder_encoder.sh <filename> <x_geometry> <y_geometry> <avi,mkv,flv> ( movie 400 300 avi )
";
exit;

fi

mencoder -noodml ${1}.${4} -o $1.flv -sub $1.smi -of lavf -oac mp3lame -lameopts abr:br=128 -ovc lavc -lavcopts vcodec=flv:vbitrate=512:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 44100 i_certify_that_my_video_stream_does_not_use_b_frames -vf-add scale=${2}:${3}
ffmpeg -y -i ${1}.${4} -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s ${2}x${3} $1.jpg
flvtool2 -U $1.flv
echo -n "--------------------------------------------------------
$1.avi completed $1.flv to encoding..!!
--------------------------------------------------------
";

---------------------------------------------------------------------------------

디렉토리내 flv 파일을 UCCUP Player에서 인식할 수 있는 HTML 코드로 변환하는 스크립트

# vi /usr/bin/convert_flvhtml.sh
--------------------------------------------------------------------------------

#!/bin/sh

rm -f source.html
ls -1 *.flv | sed -e 's/\.flv//g' > filelist

A=`cat filelist`

for B in `echo $A`
do

echo -n "
<embed src=\"
http://syszone.co.kr/uccup/UCCUp.swf?file=http://syszone.co.kr/uccup/file.php?f=${B}.flv&previewImage=http://syszone.co.kr/uccup/file.php?f=${B}.jpg&bufferTime=3&bgColor=-1\
width=400 height=300 scale=noscale bgcolor=#ffffff type=application/x-shockwave-flash allowFullScreen=true
allowScriptAccess=always allowNetworking=all pluginspage=http://www.macromedia.com/go/getflashplayer>
</embed>
<p>
" >> source.html

done

---------------------------------------------------------------------------------

AnyCall 핸드폰에서 볼수 있는 형태의 mp4 동영상으로 encoding 시켜 주는 스크립트

# vi /usr/bin/ffmpeg_encoder_mp4.sh 
---------------------------------------------------------------------------------

#!/bin/sh

if [ $# -lt 1 ]
then
echo -n "using : ffmpeg_encoder.sh <filename> <quality=low,high>>
";

exit;
fi

if [ $2 == "high" ]
then

ffmpeg -i "${1}.avi" -vcodec mpeg4 -acodec libfaac -b 672k -ab 96k -ar 24000 -s 480x272 -aspect 16:9 -g 300  -mbd 2 -cmp 3 -precmp 3 -subcmp 3 -trellis 2 -flags +4mv -pass 1 -f psp -threads 2 "${1}.mp4"

else

ffmpeg -i "${1}.avi" -vcodec mpeg4 -acodec libfaac -b 250k -ab 96k -ar 24000 -s 480x272 -aspect 16:9 -g 300  -mbd 2 -cmp 3 -precmp 3 -subcmp 3 -trellis 2 -flags +4mv -pass 1 -f psp -threads $2 "${1}.mp4"


fi

echo -n "--------------------------------------------------------
$1.avi completed $1.mp4 to encoding..!!
--------------------------------------------------------
";

-----------------------------------------------------------------------------------


출처 : http://blog.syszone.co.kr/2719



반응형