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

Derek Herman
Derek Herman
Joe Medley
Joe Medley

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

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

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

Shaka Packager

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

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

זהו התבנית הבסיסית של פקודת 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

מחפשים את המאפיינים שמפורטים בקטע הסבר על קבצי מדיה ומבחינים בכמה דברים. הגובה והרוחב נכונים ל-Full HD, וקודקי האודיו והווידאו הם בין הקודקים המועדפים לסוגים של קובצי האחסון שלהם, 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, תהליך ה-build של התמונה יאט אם תצטרכו ליצור אותה מחדש בעתיד – אולי כדי לשנות את הגרסאות המותקנות.

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