본문 바로가기
방송-통신/Tvheadend

Tvheadend로 녹화 후 ffmpeg을 이용한 자동 인코딩

by Junhyeok 2018. 5. 13.

#!/bin/sh

# Variables

#720p mp4 변환

TSVIDEO=$1    

b=$2

TRANSCODEPATH="/home/hts/"                   # tvheadend에서 지정한 파일 저장 경로 환경에 맞게 수정할 것.

title=$(echo $b | sed s'/\([0-9]\{4,\}\).*\([0-9]\{2,\}\).*\([0-9]\{2,\}\)/\1\2\3/' | sed s'/[\-]/ /g' | sed 's/ \{2,\}/ /g' | sed s'/ \[.*\]//g' | sed s'/...$//')

target_dir_name=$(echo $title | sed s'/.[0-9].*$//')

MKVVIDEO=$TRANSCODEPATH$title".720P.mp4"    # 출력할 파일에 새로 추가할 내용 및 확장자. ".H264.1080P.mkv" 부분은 입맛에 맞게 수정할 수 있음.

/bin/sync    # flush diskbuffer

# Transcode to mkv


echo "***** 시작시간 $(/bin/date +%Y.%m.%d' '%H:%M:%S) *****" >$TRANSCODEPATH$title.log

echo "****************************************************" >>$TRANSCODEPATH$title.log

echo "********** $MKVVIDEO 로 인코딩을 시작합니다.*************" >>$TRANSCODEPATH$title.log

echo "***************************************************" >>$TRANSCODEPATH$title.log

echo "*************** INPUT = $TSVIDEO ******************" >>$TRANSCODEPATH$title.log

echo "*************** OUTPUT = $MKVVIDEO ****************" >>$TRANSCODEPATH$title.log

echo "***************************************************" >>$TRANSCODEPATH$title.log

echo "****** Created by $(/usr/bin/whoami) **************" >>$TRANSCODEPATH$title.log   

echo "***************************************************" >>$TRANSCODEPATH$title.log

ffmpeg -i "$TSVIDEO" -threads 3 -c:v libx264 -preset medium -vb 2700k -c:a copy -level 4.0 -s 1280x720 "$MKVVIDEO" </dev/null >>$TRANSCODEPATH$title.log 2>&1

echo "***************************************************" >>$TRANSCODEPATH$title.log

echo "** 종료시간 $(/bin/date +%Y.%m.%d' '%H:%M:%S) **" >>$TRANSCODEPATH$title.log

autoencoding720mp4.sh

 자동녹화까지 설정을 해놨으니 이제 녹화된 파일을 인코딩해서 용량을 줄여주는 일만 남았다. 보통 IP TV의 경우 녹화파일 원본은 10mbps 정도의 비트레이트를 가지게 되는데, 인코딩을 해서 3mpbs 정도로 낮춰주면 보관하는데 있어서도 용량을 적게 차지하고, 스마트폰으로 시청하는데 있어서도 데이터 사용량에 대한 부담이 줄어든다. 

 Tvheadend 관리 페이지에서 Configuration - Recording - DVR behavior - post processor command 항목이 녹화 후 실행할 명령을 입력하는 부분이다. 여기에 위의 셸 스크립트 첨부 파일을 다운받은 경로를 적어준다. 그리고 첨부 파일은 실행가능한 속성으로 변경해준다. (리눅스 특성)

예) chmod +x autoencoding720mp4.sh

 ffmpeg은 기본적으로 설치되어있지 않아서 다음 명령으로 설치해주었다.

sudo apt-get install ffmpeg 


스크립트 설명

능력자분께서 만들어둔 스크립트에 인코딩 옵션만 약간 변경해보았다. 

# TRANSCODEPATH="/home/hts" 부분은 녹화파일이 저자되는 경로를 지정한다. 우분투에 tvheadend를 설치하면 기본적으로 hts라는 유저가 생성되고 hts의 홈디렉토리인 /home/hts 를 녹화 경로로 지정해두었다. 다른 디렉토리를 지정하기 위해서는 권한 설정을 해주어야 한다.

MKVVIDEO=$TRANSCODEPATH$title".H264.1080P.mp4"    # 출력할 파일에 새로 추가할 내용 및 확장자. ".H264.1080P.mkv" 부분은 입맛에 맞게 수정할 수 있음. -->입맛에 맞게 720P.mp4로 수정해서 사용중.

ffmpeg -i "$TSVIDEO" -threads 3 -c:v libx264 -preset medium -vb 2700k -c:a copy -level 4.0 -s 1280x720 "$MKVVIDEO"

이 부분이 실질적으로 인코딩을 하는 명령어다. 

-i "$TSVIDEO" -->인코딩할 파일 지정. 이 스크립트에서는 녹화가 끝난 파일이름이 자동으로 들어가게 되어있다.

-thread 3 --> 인코딩에 사용할 CPU 쓰레드 숫자 지정. 0으로 지정하거나 이 옵션을 빼면 모든 쓰레드를 사용한다. 현재 2코어 4쓰레드 i3 2120 CPU를 사용중인데 모든 쓰레드가 인코딩에 사용되면 다른 작업을 하기 힘들 정도로 느려지는 느낌이라 3개로 제한해두었다.

-c:v libx264 -->인코더로 libx264 지정. CPU를 많이 사용하게 된다. GPU의 하드웨어 가속을 이용하는 방법도 있는 것 같은데 아직 성공하지 못했다.

-preset medium 화질 관련된 옵션으로 medium 프리셋을 사용.

-vb 2700k -->비디오 비트레이트 2700k으로 지정

-c:a copy --> 오디오는 인코딩하지 않고 그대로 사용

-level 4.0 -->h264코덱은 화질에 따라서 레벨이 정해지는데 플렉스에서 스마트폰으로 직접 재생을 하려면 4.1 미만이어야 하는 것 같다.

-s -->프레임 사이즈 조정 wxh(가로x세로) 형식 사용  


 여기까지 준비가 되었다면 post-processor-command 부분에 다음과 같이 입력한다.

/home/hts/autoencoding720mp4.sh "%f" "%b"

/home/hts 부분은 autoencoding720mp4.sh 파일이 저장된 경로를 적어주면 된다.

댓글