미디어 애플리케이션 기본사항

Derek Herman
Derek Herman
Joe Medley
Joe Medley

미디어로 작업하려면 비트 전송률 또는 해상도와 같은 미디어 파일의 특성을 변경해야 하는 경우가 많습니다. 간단한 시작 방법을 찾는 일은 꽤 두려울 수 있습니다 이 페이지에서는 사용되는 도구와 이러한 도구를 빠르게 설치하는 방법을 알아봅니다.

먼저 두 가지 일반적인 명령줄 미디어 유틸리티인 Shaka PackagerFFmpeg의 기본 사용법을 설명한 후 도구를 빠르게 설치할 수 있도록 도와드리겠습니다. 두 가지 애플리케이션을 다루는 이유 둘 다 그 자체로 강력하고 유용하지만 둘 다 웹용 미디어를 준비하는 데 필요한 모든 작업을 수행하지는 않습니다. 미디어 변환미디어 암호화 페이지도 만들었습니다. 이 두 가지 애플리케이션에 관한 더 많은 일반적인 작업을 보여줍니다.

이러한 애플리케이션이 파일 조작 작업에 사용할 수 있는 유일한 옵션은 아니지만 가장 일반적이고 강력한 두 가지 옵션입니다. 다른 옵션으로는 GUI 애플리케이션 Miro, HandBrake, VLC가 있습니다. Zencoder, Amazon Elastic Encoder, Google Transcoder API와 같은 인코딩/트랜스코딩 서비스도 있습니다.

샤카 패키지러

Shaka Packager는 무료 미디어 패키징 SDK입니다. 사이트에서 미디어 플레이어를 사용 중이라면 파일을 준비할 때 Shaka Packager를 사용합니다. 가장 일반적인 두 가지 동영상 스트리밍 프로토콜인 HTTP 동적 적응형 스트리밍 (DASH) 또는 HTTP 라이브 스트리밍 (HLS)의 변환을 지원합니다. Shaka Packager는 일반 암호화 및 Widevine 디지털 권한 관리 (DRM)와 같은 주요 보안 기능을 지원합니다. 라이브 스트리밍과 VOD도 처리할 수 있습니다.

패키지에 명시된 내용과 달리 이 유틸리티는 C++ 개발자 이상의 사용자를 위한 것입니다. 미디어 소프트웨어 빌드를 위한 라이브러리이자 웹 재생을 위한 미디어 파일을 준비하는 명령줄 유틸리티로 사용할 수 있습니다. 여기서는 후자의 용량이 유용합니다. 실제로 웹 미디어 제작자에게 Shaaka Packager는 값비싼 상용 애플리케이션에 비용을 지출하지 않고 일부 작업을 실행할 수 있는 유일한 방법입니다.

다음은 Shaka Packager 명령어의 기본 패턴입니다.

packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]

packager -help을 입력하면 제대로 표시되지 않습니다. 이 예는 추론하기가 더 쉬우며 Shaka Packager 문서의 예가 반영되어 있습니다. 패턴에는 여러 stream_descriptor 항목이 있습니다. 여기서는 보여주지 않지만 파일의 동영상 및 오디오 스트림을 단일 명령어로 별도로 조작할 수 있습니다.

이 기본 패턴을 파일 특성을 표시하는 간단한 사용과 비교해 보세요. 예에서는 동일한 부분을 정렬했습니다.

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

명령어는 다음을 출력합니다.

File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
 codec_string: avc1.640028
 time_scale: 30000
 duration: 300300 (10.0 seconds)
 is_encrypted: false
 codec: H264
 width: 1920
 height: 1080
 pixel_aspect_ratio: 1:1
 trick_play_factor: 0
 nalu_length_size: 4

Stream [1] type: Audio
 codec_string: mp4a.40.2
 time_scale: 48000
 duration: 481280 (10.0 seconds)
 is_encrypted: false
 codec: AAC
 sample_bits: 16
 num_channels: 2
 sampling_frequency: 48000
 language: eng
 seek_preroll_ns: 20833

미디어 파일 기본사항에 설명된 특성을 살펴보고 몇 가지 사항을 확인합니다. 풀 HD의 경우 높이와 너비가 올바르며, 오디오 및 동영상 코덱은 컨테이너 유형에 선호되는 코덱으로, 오디오에는 AAC, 동영상의 경우 H264입니다. 스트림은 숫자로 식별됩니다. 오디오와 동영상을 별도로 조작하는 작업에 유용합니다.

위 출력에는 비트 전송률이 표시되지 않습니다. 누락된 내용에도 불구하고 이 출력은 읽기가 더 쉬우므로 가능한 한 언제든지 사용합니다. 비트 전송률과 같이 Shaka Packager가 얻을 수 없는 정보가 필요할 때 FFmpeg를 사용합니다.

FFmpeg

FFmpeg는 미디어 파일의 녹화, 변환, 스트리밍을 위한 무료 애플리케이션이기도 합니다. 그 성능은 Shaka Packager보다 더 좋거나 나쁘지 않습니다. 단지 다르기만 할 뿐입니다.

FFmpeg 명령어의 기본 패턴은 다음과 같습니다.

ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output

Shaka Packager와 마찬가지로 이 애플리케이션은 여러 스트림을 처리할 수 있습니다. 일부 옵션은 여러 위치에서 사용되며 명령어 내 위치에 따라 파일 출력을 다르게 조작합니다. Stack Overflow의 FFmpeg 질문 및 이와 유사한 사이트를 볼 때 이 점을 염두에 두시기 바랍니다.

기본 패턴을 파일 특성 표시 예와 다시 비교하겠습니다.

    ffmpeg [GeneralOptions] [InputFileOptions] -i input        [OutputFileOptions] output

    ffmpeg                                     -i glocken.mp4

이렇게 하면 요청한 정보 외에도 아래 예와 같이 오류 메시지가 출력됩니다. 그 이유는 FFmpeg를 기술적으로 잘못 사용하는 것이기 때문입니다. Google에서 중요한 정보를 표시하기 때문에 Google에서 이 정보를 사용합니다.

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.100
  Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

Docker로 애플리케이션 설치

이 명령어를 따라 실행해 보려면 필요한 도구를 수동으로 설치하거나, 쉬운 방법으로 Docker를 사용하면 됩니다. Docker를 사용하면 많은 시간을 절약할 수 있으므로 이를 사용하는 것이 좋습니다. 뿐만 아니라 빠르게 설정할 수 있는 방법도 안내되어 있습니다.

  1. 먼저 컴퓨터의 어딘가에 media-tools이라는 새 디렉터리를 만듭니다. 원하는 이름을 사용할 수 있습니다. 다음 안내에서는 media-tools을 디렉터리 이름으로 사용한다고 가정합니다.

  2. media-tools 내부에 dockermedia 디렉터리를 만듭니다. 이렇게 하면 media 디렉터리가 빌드 컨텍스트에서 제외됩니다. 이것이 중요한 이유는 media에 작업을 실행할 파일이 저장되는 곳이고 이 중 일부는 상당히 클 수 있기 때문입니다. Dockerfilemedia-tools에 직접 넣으면 설치된 버전을 변경하기 위해 이미지를 다시 빌드하는 경우 이미지 빌드 속도가 느려집니다.

  3. /media-tools/docker/Dockerfile를 만들고 다음 빌드 안내를 추가합니다.

    FROM google/shaka-packager:release-v2.4.3 as packager
    FROM jrottenberg/ffmpeg:4.3.2-alpine38
    COPY --from=packager /usr/bin /usr/bin
    ENTRYPOINT  ["sh"]
    
  4. 이미지를 빌드합니다.

    docker build -t media-tools ./docker
    
  5. 이미지를 대화형 셸로 실행합니다. Linux의 경우:

    docker run -w /media -v ${PWD}/media:/media -it --rm media-tools
    /media #
    

    Windows:

    docker run -w /media -v %cd%/media:/media -it --rm media-tools
    /media #
    

이미지를 실행하는 동안 FFmpeg 및 Shaka Packager의 버전을 모두 확인하여 ffmpeg -versionpackager --version를 실행하여 모든 것이 성공했는지 확인할 수 있습니다. 출력은 다음과 같습니다.

/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release

이제 Shaka Packager와 FFmpeg를 직접 사용해 봤으므로 기본 개념을 계속 학습할 수 있으며 다음 단계인 미디어 스트리밍 기본사항을 알아봅니다.