티스토리 뷰
트랜스코딩
기업에서 영상을 사용할 때 영상을 일정 규격에 맞게 변화하여 사용하게 되는데 이를 트랜스코딩이라 한다.
예를 들어, mkv 확장자의 파일을 mp4로 바꾸면서 해상도 또한 알맞게 작업하는데, 이를 가능하게 하는 대표적인 서비스가 AWS에 있다.
AWS의 트랜스코딩을 직접 사용해 보지는 않았지만, 비용이 들지 않고, 요구사항에 맞게 커스텀하여 사용할 수 있도록 자체 프로그램을 개발했다.
(기본적인 아이디어와 설계는 회사 상사가 했다.)
개발 이유
프로그램으로 개발한 이유는 서버의 부하를 줄이기 위해서이다.
운영되고 있는 서비스 서버에 해당 기능을 적용할 경우 영상의 사이즈나 포맷에 따라서 부하가 심해질 수 있다.
하지만 프로그램으로 개발하여 제공한다면, 클라이언트의 자원을 사용하기 때문에 부하 문제를 해결할 수 있다.
프로그램 설명
프로그램은 GO언어로 개발되었고, 사용할 수 있는 라이브러리를 최대한 이용했다.
또한 영상 포맷을 변환하는 부분은 FFmpeg이라는 오픈소스를 이용했다.
Go언어를 공부해본 적도, FFmpeg을 사용해 본 적도 없지만 요즘 핫한 Go언어를 학습 목적으로 이용해보자라는 취지에서 시작했기 때문에
코드의 품질에 대한 자신은 없다.(제일 아쉬운 부분..)
그래도.. 뭐.. 지금까지 사내에서는 잘 사용되고 있는 것으로 봐서는 인턴 때 만든 프로그램치고는 나름대로 만족한다.
아래는 프로그램에 대한 간단한 설명이다.
주요 기능은 다음과 같다.
1. 클라리언트에서 윈도우 서비스로 프로그램이 동작하고, 원하는 영상 포맷으로 비디오를 트랜스코딩한다.
2. 영상이 변환될 때, 남은 시간과 진행률을 출력한다.
3. 영상 포맷 변환에 성공한다면, 변환된 파일을 특정 ftp서버에 올린다.
브라우저 화면
지원 브라우저
사실 여러 가지 버전의 브라우저에서 확인해보지 못했다. 다만, 웹소켓을 사용하면서 ie에 제한이 있었고, 사파리나 웨일 같은 다른 브라우저에서 테스트는 못해봤다.
IE / Edge | Chrome |
---|---|
IE10, IE11 | last version |
사용법
프로그램을 설치하고 사용하는 방법은 아래와 같이 진행하면 된다.
ftp 서버는 로컬에 테스트용으로 사용할 수 있는 라이브러리 사용법도 포함되어있다.
1. 설치 : go get github.com/Hunet-edutech/ffmpeg-web-client
2. 라이브러리 다운
* [golang/sys](https://godoc.org/golang.org/x/sys) : windows service
* [gorilla/websocket](https://github.com/gorilla/websocket) : websocket
* [jinzhu/copier](https://github.com/jinzhu/copier) : deep copy
* [dutchcoders/goftp](https://github.com/dutchcoders/goftp) : ftp client
* [ffmpeg.exe / ffprobe.exe](https://ffmpeg.zeranoe.com/builds/) : ffmpeg and ffprobe .exe file
* [goftp/server](https://github.com/goftp/server) : ftp server for test
3. 위에서 받은 ffmpeg.exe 파일과 ffprobe.exe 파일을 main.go가 위치한 디렉토리로 옮긴다.
4. 테스트를 위한 ftp서버를 실행시킨다.
exampleftpd -root /tmp
5. ftp 서버 실행유무 체크
ftp > open localhost 2121
6. ftp서버가 열린 것을 확인했다면, 1번에서 받은 파일에 sample.html파일을 실행시켜보자.
API Reference
아래는 프로그램에서 윈도우서비스에 등록된 웹서버와 브라우저가 통신할 때 사용되는 API와 사용되는 서버의 정보 및 포트이다.
-
ftp 서버
도메인 포트 / 2121 -
기본값 : localhost:5050
-
웹소켓 연결 정보
-
Request
Get /echo
-
Progress Json Data
Field Description Optional fileIndex
file index no fileName
file name yes progressTime
current encoding time yes progressStatus
current encoding status (continue / end) no totalTime
file total time yes timeRemaining
encoding time emaining (일, 시/ 분, 분/초, 초) yes progressRate
encoding progress rate ( 00.00) no
-
-
ftp 서버의 파일 존재 유무 체크
-
Request
Get /fileExist
Query parameters :
Field Description Optional uploadFileName
file name to check(encoded file name) no courseCd
course code no -
Response
Content-Type : text/plain; exmaple : true(not exist) / false(exist) / error
-
-
트랜스코딩 시작 및 ftp 업로드
-
Request
Post /transcoding Content-Type : multipart/form-data;
-
Form Data :
Field Description Optional uploadFileData
file data no uploadFileInfo
information of 'uploadFileData' no uploadEncodingInfo
encoding information no -
'uploadFileInfo' Json Data :
Field Description Optional fileIndex
index no courseCd
course code no courseNo
course number(file name) no chapterNo
chapter number yes courseName
course name yes courseDetailName
course detail name yes uploadFileName
filename ('courseNo' + 'uploadFileExt') no uploadFileSize
file size yes uploadFileExt
filename extension yes -
'uploadEncodingInfo' Json Data :
Field Description Optional videoCodec
video codec no videoBitrate
video bitrate no audioCodec
audio codec no audioBitrate
audio bitrate no resolution
resolution no
-
-
-
Response
Content-Type : text/plain;
-
트랜스코딩 중지
-
Request
DELETE /transcoding
-
Form Data :
Field Description Optional fileIndex
index no
-
-
Response
Content-Type : text/plain; exmaple : true / false
-
-
윈도우 서비스의 체크
-
Request
Get /serviceCheck
-
Response
Content-Type : text/plain; exmaple : 1(running) / error
-
부가설명
-
윈도우 서비스의 로그를 확인하고 싶다면, 윈도우 서비스 실행 메서드인 Run() 메서드에서 Init()을 사용해한다.
-
클라이언트에서 선택한 파일의 위치를 브라우저 보안상 파일 경로를 웹서버로 넘길 수 없기 때문에(fakepath), 웹서버로 파일을 통으로 옮긴다.
사실, 프로그램 만들면서 아쉬운 부분이다. 개선할 방법이 딱히 떠오르지 않아 이대로 사용했다. -
파일은 변환 중에는 취소할 수 있지만, 이미 변환이 완료되고, ftp 서버로 전송중이라면 취소할 수 없다.
-
파일을 변환하면서 ftp서버로 다이렉트로 옮길 순 있지만, 추천하지 않는다.
-
현재 ftp 서버에 업로드될 때의 디렉터리 구조는 아래와 같다.
/GoTest/cource_code/cource_number.mp4
참고 문서
아쉬운 점
- 파일 경로를 텍스트 그대로 웹서버로 전송할 수 없었던 점.
- ffmpeg를 exe파일로 사용하지 않고 프로그램에 소스로 녹여냈다면, 좀 더 가볍고 성능 좋은 프로그램이 됐을 듯.
(윈도우 기준으로 gcc설정을 2~3일 해봤지만, 제대로 작동하질 않음 ㅠ 프로그램 자체가 회사 보안에 막힘) - go언어의 활용을 제대로 못한 것 같음.
(결과물에만 집착한 느낌이 강함. 프로젝트를 설계함에 있어서 파일 구조나 확장성 등을 고려하지 못한 느낌이 강함.)
위 소스는 https://github.com/Hunet-edutech/ffmpeg-web-client 에서 볼 수 있음.
- Total
- Today
- Yesterday
- API
- @EventListener
- login
- beforeunload
- 특징
- jwplayer
- SET
- playsinline
- 자바
- Queue
- map
- Multi IN Clause
- 로그인
- on('seek')
- @subselect
- 의미
- oauth
- QueryDSL
- 원리
- 네트워크
- Animation
- playbackRate
- 예제
- 관리자 도구
- 장점
- list
- SDK
- @subquery
- join subquery
- IN Clause
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |