TS to MP4

webismewebisme
2 min read

TS 파일들을 하나의 MP4 파일로 병합하기

회사에서 동영상 게시물을 업로드 해야 할 일이 있었는데, 영상을 다운받아서 보니 TS 여서 움짤을 만들고 싶어서 간단하게 만들어봤습니다. Go 가 자체적으로 해준다기 보다, 반복적인 작업을 손쉽게 처리 하기 위해서 만들었습니다. 이점 참고 하시기 바랍니다.

TS (Transport Stream) 파일은 일반적으로 비디오 스트림을 저장하는 데 사용되며, 여러 개의 TS 파일을 하나의 MP4 파일로 병합해야 하는 경우가 종종 발생합니다. 이를 자동화하기 위해 Go 언어를 사용하여 간단한 프로그램을 작성할 수 있습니다. 이 글에서는 TS 파일들을 FFmpeg를 이용해 병합하는 프로그램을 만드는 방법을 설명합니다.

사전 준비

이 프로그램을 실행하기 위해서는 시스템에 FFmpeg가 설치되어 있어야 합니다. FFmpeg는 다양한 멀티미디어 파일 포맷을 처리할 수 있는 강력한 툴입니다. FFmpeg 설치 방법은 각 운영체제에 따라 다르므로, 공식 문서를 참고하여 설치하시기 바랍니다. <아래 코드는 Mac 에서 진행을 하였습니다>

코드 설명

아래는 TS 파일들을 하나의 MP4 파일로 병합하는 Go 프로그램입니다.

package main

import (
    "fmt"
    "os"
    "os/exec"
    "path/filepath"
    "strings"
)

func main() {
    dirPath := "./ts_files"  // TS 파일이 저장된 디렉터리를 지정합니다.
    tsFiles, err := getTSFiles(dirPath)
    if err != nil {
        fmt.Println("Failed to get TS files:", err)
        return
    }

    // ffmpeg의 concat demuxer를 사용하여 TS 파일들을 MP4 파일로 병합
    args := []string{"-i", "concat:" + joinFiles(tsFiles), "-c", "copy", "output.mp4"}
    cmd := exec.Command("ffmpeg", args...)
    err = cmd.Run()
    if (err != nil) {
        fmt.Println("Failed to merge TS files:", err)
    }
}

// getTSFiles 함수는 지정된 디렉터리에서 TS 파일 목록을 반환합니다.
func getTSFiles(dirPath string) ([]string, error) {
    var tsFiles []string
    err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if !info.IsDir() && strings.HasSuffix(info.Name(), ".ts") {
            tsFiles = append(tsFiles, path)
        }
        return nil
    })
    return tsFiles, err
}

// joinFiles 함수는 TS 파일 리스트를 문자열로 변환
func joinFiles(files []string) string {
    return strings.Join(files, "|")
}

코드 상세 설명

  1. 디렉터리 경로 설정 (dirPath):

    • dirPath 변수에 TS 파일들이 저장된 디렉터리 경로를 지정합니다. 예제에서는 ./ts_files 디렉터리를 사용합니다. <원하시는 디렉토리로 하셔도 됩니다.>
  2. TS 파일 목록 가져오기 (getTSFiles 함수):

    • getTSFiles 함수는 지정된 디렉터리에서 .ts 확장자를 가진 파일들을 찾아 리스트로 반환합니다.

    • 이 함수는 filepath.Walk를 사용하여 디렉터리를 탐색하고, .ts 파일을 찾으면 이를 리스트에 추가합니다.

  3. TS 파일들을 하나의 문자열로 연결 (joinFiles 함수):

    • joinFiles 함수는 TS 파일 리스트를 |로 구분된 문자열로 변환합니다. 이 문자열은 FFmpeg의 concat demuxer에서 사용됩니다.
  4. FFmpeg를 사용하여 병합:

    • FFmpeg를 실행하기 위해 exec.Command를 사용하여 명령어를 생성합니다. concat: 옵션을 사용하여 TS 파일들을 연결하고, -c copy 옵션으로 스트림을 그대로 복사하여 빠르게 병합합니다.

    • 병합된 결과는 output.mp4 파일로 저장됩니다.

실행 방법

이 프로그램을 실행하기 위해서는 Go 환경이 필요합니다. 프로그램을 컴파일하고 실행하려면 아래의 명령어를 사용합니다:

go run main.go

프로그램이 실행되면, ./ts_files 디렉터리에 있는 모든 TS 파일이 output.mp4 파일로 병합됩니다. 이 프로그램을 통해 비디오 파일의 병합 작업을 간편하게 처리할 수 있습니다.

0
Subscribe to my newsletter

Read articles from webisme directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

webisme
webisme