מידע בסיסי על אפליקציות מדיה

דרק הרמן
דרק הרמן
ג'ו מדלי
ג'ו מדלי

לעתים קרובות, עבודה עם מדיה מחייבת שינוי המאפיינים של קובצי מדיה, כגון קצב העברת נתונים או רזולוציה. מציאת דרך ישירה להתחיל יכולה להיות די מפחידה. בדף הזה נסביר על הכלים שבהם אנחנו משתמשים ואיך להתקין אותם במהירות.

ראשית, תיארנו את השימוש הבסיסי בשני כלי מדיה נפוצים של שורת פקודה: Shaka Packager ו-FFmpeg, ולאחר מכן נעזור לך להתקין את הכלים במהירות. מדוע לכסות שתי אפליקציות? שני הכלים האלה חזקים ושימושיים כשלעצמם, אבל גם לא כל מה שנדרש כדי להכין מדיה לאינטרנט. יצרנו גם את הדפים המרת מדיה והצפנת מדיה, שמציגים עוד פעולות נפוצות רבות עם שתי האפליקציות האלו.

האפליקציות האלה הן לא האפשרויות היחידות שאפשר לבצע בהן פעולות של מניפולציה של קבצים, אבל הן שתיים מבין האפליקציות הנפוצות והעוצמתיות ביותר. האפשרויות הנוספות כוללות את אפליקציות ה-GUI Miro, HandBrake ו-VLC. יש גם שירותי קידוד/המרת קידוד כמו Zencoder, Amazon Elastic Encoder ו-Google Transcoder API.

שקה פרג'טר

Shaka Packager הוא ערכת SDK לאריזת מדיה חינמית. אם השתמשתם בנגן מדיה באתר, ב-Shaka Packager הייתם משתמשים כדי להכין את הקבצים. הוא תומך בהמרה לשני הפרוטוקולים הנפוצים ביותר לסטרימינג של וידאו: Dynamic Adaptive Streaming over HTTP (DASH) או HTTP Live Streaming (HLS). ב-Shaka Packager יש תמיכה בתכונות אבטחה מרכזיות: הצפנה משותפת וניהול זכויות דיגיטליות (DRM) ב-Widevine. הוא יכול גם לתמוך בסטרימינג בשידור חי ובוידאו על פי דרישה (VOD).

למרות מה שכתוב בחבילה, כלי השירות הזה מיועד ליותר ממפתחים של C++. אפשר להשתמש בו גם כספרייה לבניית תוכנת מדיה וגם ככלי של שורת פקודה להכנת קובצי מדיה להפעלה באינטרנט. זו הקיבולת של מאוחר יותר, שמועילה לנו כאן. למעשה, עבור יוצרים של מדיה באינטרנט, Shaaka Packager הוא הדרך היחידה לבצע חלק מהמשימות מבלי לבזבז כסף על יישומים מסחריים יקרים.

זהו הדפוס הבסיסי של פקודת Shaka Packager:

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

זה לא בדיוק מה שתקבל אם תקליד packager -help. קל יותר להבין את הדוגמה הזו, והיא משקפת את הדוגמאות במשאבי העזרה של Shaaka 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 מלא, ורכיבי ה-Codec של האודיו והווידאו הם בין סוגי המאגרים המועדפים עליהם, AAC לאודיו ו-H264 לווידאו. שימו לב גם שזרמים מזוהים באמצעות מספרים. כדאי להשתמש בפעולות האלה כדי לשנות את האודיו והווידאו בנפרד.

שימו לב שהפלט שלמעלה לא מציג את קצב העברת הנתונים. למרות מה שחסר, קל יותר לקרוא את הפלט הזה ולכן אנחנו משתמשים בו בכל הזדמנות. כשאנחנו צריכים מידע ש-Shaka Packager לא יכול לקבל, כמו קצב העברת הנתונים, אנחנו משתמשים ב-FFmpeg.

FFmpeg

FFmpeg הוא גם אפליקציה חינמית להקלטה, להמרה ולסטרימינג של קובצי מדיה. היכולות שלו לא טובות יותר או גרועות יותר מזה של Shaka Packager. הן פשוט שונות.

הדפוס הבסיסי של פקודת FFmpeg נראה כך:

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

בדומה ל-Shaka Packager, האפליקציה יכולה לטפל בכמה שידורים במקביל. חלק מהאפשרויות מופיעות במספר מיקומים ומשנים את הפלט של הקובץ בהתאם למיקום בפקודה. שימו לב לכך בזמן שאתם מעיינים בשאלות FFmpeg ב-Stack Overflow ובאתרים דומים.

שוב נשווה את הדפוס הבסיסי לדוגמה של הצגת מאפייני קובץ.

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

    ffmpeg                                     -i glocken.mp4

בנוסף למידע שביקשנו, מופיעה גם הודעת שגיאה כמו בדוגמה למטה. הסיבה לכך היא שמדובר בשימוש שגוי ב-FFmpeg. אנחנו משתמשים בו כי הוא מציג מידע שחשוב לנו.

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. יוצרים ספרייה docker ו-media בתוך media-tools. כך הספרייה media תישאר מחוץ להקשר של ה-build. זה חשוב כי media הוא המקום שבו מאוחסנים הקבצים שאנחנו מתכננים לבצע בהם פעולות, ויכול להיות שחלק מהם יהיו די גדולים. העברת Dockerfile ישירות אל media-tools תאט את תהליך בניית התמונה, אם אי פעם תבנו אותה מחדש – אולי כדי להחליף את הגרסאות שמותקנות.

  3. יוצרים /media-tools/docker/Dockerfile ומוסיפים את הוראות ה-build הבאות:

    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 -version ו-packager --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, אתם יכולים להמשיך ללמוד את המושגים הבסיסיים ולהמשיך את היסודות של סטרימינג של מדיה.