본문으로 바로가기

영상 mp4 인코딩, 파일 절대경로 출력

category Server/Xpenology 2018.06.07 18:06


참고) 윈도우에서 자르기 인코딩 FFMPEG http://3jini.tistory.com/168


녹화시 후처리 스크립트를 주어서 녹화후 바로 인코딩 할 수도 있지만,

모아둔 녹화영상 인코딩을 하기 위해서 찾아보았다.

https://www.clien.net/service/board/cm_nas/10936355


글을 참고, 스크립트를 사용하였다.


-스크립트의 장점이 여러파일을 일괄로 할 수 있다.

-불필요한 구간을 잘라서 필요구간만 인코딩할수 있다. (예를 들어, 시작시간, ~20분간

encod.sh  이름으로 작성


/volume1/pvr/encoding/list.txt 

경로에 list.txt를 둔다.

list.txt 안에 내용은 다음 주석에 표시된 형태를 따라서 적어둔다.


/volume1/pvr/encoding 아래에는 영상이 있다.


절대경로가 포함된 파일이름|시간시간|영상시간


주의!!!

list.txt 에서 시간주는 부분에 공백이 있으면 안된다.

/volume1/pvr/encoding/01.mts|00:04:10|00:25:10여기가 끝이어야하는데

/volume1/pvr/encoding/01.mts|00:04:10|00:25:10 이렇게 끝으로 스페이스바 한칸이 있거나 하면 안된다는것. 10이 커서의 끝이어야한다.



/volume1/pvr/encoding/01.mts|00:04:10|00:25:10

/volume1/pvr/encoding/02.mts|00:05:30|00:26:00


01.mts는 4분10초부터 시작하여 25분10초간 (끝시간이 아니다,구간시작시간부터 영상의길이)

02.mts는 5분30초부터 시작하여 26분간


encod.sh 는 다음명령으로 실행되도록 해준다.


chmod +x encod.sh


원본 설명중에서 시놀 215+버전의 DSM기준이라서, 나의 Xpenology Nas DSM 5.2.5967버전에서의 경로와 맞지 않는 3부분을 수정하였다.


/bin/dirname     -->        /usr/bin/dirname

/bin/basename   -->       /usr/bin/basename

/bin/ffmpeg     -->        /usr/syno/bin/ffmpeg


사실 아무데서나 각 명령이 실행되도록 path가 되어 있어서

절대경로를 빼고

dirname

basename

ffmpeg 

으로 주어도 무방하겠다.


ssh 터미널에서 한번 위 각 명령을 실행해보고, 실행이 된다면 모든 경로에서 된다고 보면 되겠다.


#!/bin/sh 

IFS=$'\n' 


# 녹화할 파일 형식 txt

# 스크립트와 같은 위치에 두자

# 절대경로가 포함된 파일이름|시간시간|영상시간

# /경로/여기는 녹화 폴더/파일이름은 첫번째.mkv|00:05:30|00:00:21 

# /경로/여기는 녹화 폴더/파일이름 두번째.ts|00:01:30|00:00:40 

# cat /절대경로/list.txt


for i in $(cat /volume1/pvr/encoding/list.txt) 

do 

    filenameO=$( echo "$i" | cut -d "|" -f 1 ) 

    starttime=$( echo "$i" | cut -d "|" -f 2 ) 

    duration=$( echo "$i" | cut -d "|" -f 3 ) 

    path=$(/usr/bin/dirname "${filenameO}") 

    filename=$(/usr/bin/basename "${filenameO}") 

    extension="${filename##*.}" 

    filename="${filename%.*}" 

    trim="${path}"/"${filename}"_trim."${extension}" 

    mp4="${path}"/"${filename}".mp4 

    /usr/syno/bin/ffmpeg -i "${filenameO}" -map 0:0 -map 0:1 -c:v copy -c:a copy -ss "${starttime}" -t "${duration}" "${trim}" 

    /usr/syno/bin/ffmpeg -i "${trim}" -codec:v libx264 -profile:v baseline -preset slow -b:v 2000k -maxrate 4000k -vf scale=-1:720 -threads 0 -codec:a aac -b:a 128k -f mp4 -strict experimental "${mp4}" 

done



encod.sh 다운받기

encod.sh



여기서 잠깐,!


파일들의 절대경로를 얻을라니 좀 힘들었다. 구글 검색

리눅스에서는 기본적으로 ls 명령으로 파일리스트를 볼수 있다. (윈도우의 dir)

ls /volume1/pvr/encoding/Mira2 > list.txt 로 하면

절대경로가 포함되어있지 않고 단순히 

01.mts

02.mts 

만 나온다.

만약 영상들이 많다면?? 조금이라도 노가다 성을 줄이기 위해서


변환할 영상이 /volume1/pvr/encoding/ 에 있다고 한다면,


ls -d1 $pwd/volume1/pvr/encoding/* > list.txt


실제사용.



에피소드 3개 ts 파일이 

/volume1/pvr/encoding 폴더에 있고

list.txt 에는


/volume1/pvr/encoding/영상제목.E05.ts|00:15:15|00:21:39

/volume1/pvr/encoding/영상제목.E11.ts|00:11:51|00:21:39

/volume1/pvr/encoding/영상제목.E12.ts|00:11:51|00:21:39 


과 같이 되어있다.

터미널에서

sh /volume1/pvr/encoding/encod.sh


와 같이 명령을 내려보면 스크립트가 동작되면서

ffmpeg으로 먼저 시간구간을 잘라낸 trim 파일이 생성되고,

트림이 끝나면 바로 mp4로 변환하는 작업이 이루어진다.


mp4로 인코딩되는 과정.





댓글을 달아 주세요