Podstawowe informacje o aplikacjach multimedialnych

Derek Herman
Derek Herman
Jan Kowalski
Joe Medley

Praca z multimediami często wymaga zmiany cech plików multimedialnych, np. szybkości transmisji bitów lub rozdzielczości. Znalezienie prostego sposobu może być trudne. Na tej stronie poznasz używane narzędzia i dowiesz się, jak szybko je zainstalować.

Najpierw opisujemy podstawowe zastosowania 2 popularnych narzędzi multimedialnych wiersza poleceń: Shaka Packager i FFmpeg, a następnie pomagamy Ci szybko zainstalować te narzędzia. Po co uwzględnić 2 aplikacje? Obie opcje są skuteczne i przydatne, ale żadne z nich nie pomaga przygotować mediów do wyświetlania w internecie. Utworzyliśmy też strony Konwersja multimediów oraz Szyfrowanie multimediów, na których pokazano o wiele więcej czynności wykonywanych za pomocą tych 2 aplikacji.

Aplikacje te nie są jedynymi dostępnymi opcjami w przypadku zadań związanych z manipulacją plikami, ale są to 2 najpopularniejsze i najbardziej zaawansowane rozwiązania. Inne opcje to m.in. aplikacje GUI: Miro, HandBrake i VLC. Dostępne są też usługi kodowania i transkodowania, takie jak Zencoder, Amazon Elastic Encoder czy Google Transcoder API.

Program do pakowania Shaka

Shaka Packager to bezpłatny pakiet SDK do obsługi multimediów. Jeśli korzystasz w witrynie z odtwarzacza, do przygotowania plików użyj Shaka Packager. Obsługuje on 2 najpopularniejsze protokoły strumieniowego przesyłania wideo: dynamiczne adaptacyjne strumieniowe przesyłanie danych przez HTTP (DASH) i transmitowanie na żywo przez HTTP (HLS). Narzędzie Shaka Packager obsługuje najważniejsze zabezpieczenia: popularne szyfrowanie i zarządzanie prawami cyfrowymi (DRM) Widevine. Obsługuje również transmisje na żywo i filmy na żądanie.

Wbrew informacji na opakowaniu to narzędzie jest przeznaczone dla więcej niż programistów C++. Można jej używać zarówno jako biblioteki do tworzenia oprogramowania multimedialnego, jak i jako narzędzia wiersza poleceń służącego do przygotowywania plików multimedialnych do odtwarzania w internecie. To właśnie ta możliwość przydaje się nam w tym przypadku. Dla twórców mediów internetowych Shaka Packager to jedyny sposób na wykonanie pewnych zadań bez wydawania pieniędzy na drogie aplikacje komercyjne.

Oto podstawowy wzór polecenia Shaka Packager:

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

Nie otrzymasz tego efektu, gdy wpiszesz packager -help. Ten przykład jest łatwiejszy do wyjaśnienia i odzwierciedla przykłady z dokumentacji narzędzia Shaka Packager. Zwróć uwagę, że wzór zawiera wiele elementów stream_descriptor. Chociaż tego nie pokazujemy, możesz za pomocą jednego polecenia manipulować oddzielnie strumieniami wideo i audio.

Porównaj ten podstawowy wzorzec z prostym zastosowaniem, które pokazuje właściwości pliku. W przykładzie wyrównaliśmy części równoważne.

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

Polecenie wyświetli następujący wynik:

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

Zapoznaj się z cechami omówionymi w sekcji Podstawowe informacje o plikach multimedialnych i zwróć uwagę na kilka kwestii. Wysokość i szerokość są prawidłowe w przypadku Full HD, a kodeki audio i wideo należą do preferowanych kodeków w przypadku typów kontenerów: AAC dla audio i H264 dla wideo. Zwróć też uwagę, że strumienie są oznaczone liczbami. Są one przydatne przy operacjach, które wymagają oddzielnego manipulowania dźwiękiem i obrazem.

Zwróć uwagę, że powyższe dane nie pokazują szybkości transmisji bitów. Mimo że brakuje niektórych danych, dane wyjściowe są czytelniejsze, więc korzystamy z nich, gdy tylko jest to możliwe. Gdy potrzebujemy informacji, których Shaka Packager nie może uzyskać, takich jak szybkość transmisji bitów, używamy FFmpeg.

FFmpeg

FFmpeg to również bezpłatna aplikacja do nagrywania, konwertowania i strumieniowania plików multimedialnych. Jej możliwości nie są lepsze ani gorsze niż rozwiązania Shaka Packager. Są po prostu inne.

Podstawowy wzorzec polecenia FFmpeg wygląda tak:

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

Podobnie jak Shaka Packager, ta aplikacja może obsługiwać wiele strumieni. Niektóre z nich są używane w wielu lokalizacjach i manipulują danymi wyjściowymi pliku w różny sposób w zależności od tego, gdzie się znajdują w poleceniu. Pamiętaj o tym, przeglądając pytania FFmpeg na stronie Stack Overflow i podobnych.

Ponownie porównamy podstawowy wzorzec z przykładem wyświetlania cech pliku.

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

    ffmpeg                                     -i glocken.mp4

Oprócz wymaganych informacji wyświetla się też komunikat o błędzie, jak widać w poniższym przykładzie. To dlatego, że technicznie jest to nieprawidłowe użycie FFmpeg. Używamy ich, aby wyświetlać informacje, które są dla nas ważne.

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

Instalowanie aplikacji za pomocą Dockera

Jeśli zamierzasz się tego trzymać i wypróbować nasze polecenia, możesz zainstalować wymagane narzędzia ręcznie lub skorzystać z łatwego sposobu i użyć Dockera. Zalecamy skorzystanie z Dockera, ponieważ pozwoli to zaoszczędzić dużo czasu. Znajdziesz tam również instrukcje, aby szybko przeprowadzić konfigurację.

  1. Zacznij od utworzenia na komputerze nowego katalogu o nazwie media-tools. Możesz użyć dowolnej nazwy, pamiętaj jednak, że w poniższych instrukcjach przyjęto założenie, że jako nazwy katalogu używasz media-tools.

  2. Utwórz katalog docker i media w folderze media-tools. Dzięki temu katalog media nie będzie się pojawiać w kontekście kompilacji. Jest to ważne, ponieważ media to miejsce, w którym przechowywane są pliki i na których planujemy wykonać operacje, a niektóre z nich mogą być dość duże. Umieszczenie atrybutu Dockerfile bezpośrednio w obrębie media-tools spowolniłoby jego budowanie, jeśli kiedykolwiek zechcesz go przebudować (na przykład w celu zmiany zainstalowanych wersji).

  3. Utwórz /media-tools/docker/Dockerfile i dodaj te instrukcje:

    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. Utwórz obraz:

    docker build -t media-tools ./docker
    
  5. Uruchomić obraz jako interaktywną powłokę. W systemie Linux:

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

    W systemie Windows:

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

Gdy uruchamiasz obraz, możesz sprawdzić wersje FFmpeg i Shaka Packager, aby zweryfikować, czy wszystko przebiegło pomyślnie. W tym celu użyj poleceń ffmpeg -version i packager --version. Dane wyjściowe powinny wyglądać tak:

/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

Masz już opanowaną obsługę Shaka Packager i FFmpeg, więc możesz kontynuować naukę podstawowych zagadnień. Czas przejść do podstaw strumieniowania multimediów.