티스토리 뷰

Project/Go

FFmpeg을 이용한 트랜스코딩 프로그램

알 수 없는 사용자 2020. 5. 30. 19:26

트랜스코딩

기업에서 영상을 사용할 때 영상을 일정 규격에 맞게 변화하여 사용하게 되는데 이를 트랜스코딩이라 한다.
예를 들어, mkv 확장자의 파일을 mp4로 바꾸면서 해상도 또한 알맞게 작업하는데, 이를 가능하게 하는 대표적인 서비스가 AWS에 있다.
AWS의 트랜스코딩을 직접 사용해 보지는 않았지만, 비용이 들지 않고, 요구사항에 맞게 커스텀하여 사용할 수 있도록 자체 프로그램을 개발했다.
(기본적인 아이디어와 설계는 회사 상사가 했다.)

개발 이유

프로그램으로 개발한 이유는 서버의 부하를 줄이기 위해서이다.
운영되고 있는 서비스 서버에 해당 기능을 적용할 경우 영상의 사이즈나 포맷에 따라서 부하가 심해질 수 있다.
하지만 프로그램으로 개발하여 제공한다면, 클라이언트의 자원을 사용하기 때문에 부하 문제를 해결할 수 있다.

프로그램 설명

프로그램은 GO언어로 개발되었고, 사용할 수 있는 라이브러리를 최대한 이용했다.
또한 영상 포맷을 변환하는 부분은 FFmpeg이라는 오픈소스를 이용했다.

Go언어를 공부해본 적도, FFmpeg을 사용해 본 적도 없지만 요즘 핫한 Go언어를 학습 목적으로 이용해보자라는 취지에서 시작했기 때문에
코드의 품질에 대한 자신은 없다.(제일 아쉬운 부분..)
그래도.. 뭐.. 지금까지 사내에서는 잘 사용되고 있는 것으로 봐서는 인턴 때 만든 프로그램치고는 나름대로 만족한다.

아래는 프로그램에 대한 간단한 설명이다.
주요 기능은 다음과 같다.

1. 클라리언트에서 윈도우 서비스로 프로그램이 동작하고, 원하는 영상 포맷으로 비디오를 트랜스코딩한다.
2. 영상이 변환될 때, 남은 시간과 진행률을 출력한다.
3. 영상 포맷 변환에 성공한다면, 변환된 파일을 특정 ftp서버에 올린다.

브라우저 화면

화면

지원 브라우저

사실 여러 가지 버전의 브라우저에서 확인해보지 못했다. 다만, 웹소켓을 사용하면서 ie에 제한이 있었고, 사파리나 웨일 같은 다른 브라우저에서 테스트는 못해봤다.

IE / EdgeIE / Edge ChromeChrome
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

참고 문서

아쉬운 점

  1. 파일 경로를 텍스트 그대로 웹서버로 전송할 수 없었던 점.
  2. ffmpeg를 exe파일로 사용하지 않고 프로그램에 소스로 녹여냈다면, 좀 더 가볍고 성능 좋은 프로그램이 됐을 듯.
    (윈도우 기준으로 gcc설정을 2~3일 해봤지만, 제대로 작동하질 않음 ㅠ 프로그램 자체가 회사 보안에 막힘)
  3. go언어의 활용을 제대로 못한 것 같음.
    (결과물에만 집착한 느낌이 강함. 프로젝트를 설계함에 있어서 파일 구조나 확장성 등을 고려하지 못한 느낌이 강함.)

위 소스는 https://github.com/Hunet-edutech/ffmpeg-web-client 에서 볼 수 있음.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함