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

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 חינמית לחבילת מדיה. אם השתמשתם בנגן מדיה באתר, תוכלו להשתמש ב-Shaka Packager כדי להכין את הקבצים. הוא תומך בהמרה של שני פרוטוקולי הסטרימינג הנפוצים ביותר של סרטונים: שידור דינמי שניתן להתאמה באמצעות HTTP‏ (DASH) או HTTP Live Streaming‏ (HLS). ‏Shaka Packager תומך בתכונות אבטחה מרכזיות: הצפנה נפוצה וניהול זכויות דיגיטלי (DRM) של Widevine. הוא יכול גם לטפל בשידורים חיים ובווידאו על פי דרישה.

למרות מה שכתוב בחבילה, הכלי הזה לא מיועד רק למפתחי C++‎. אפשר להשתמש בה גם כספרייה ליצירת תוכנות מדיה וגם כתוכנית שימושית בשורת הפקודה לצורך הכנת קובצי מדיה להפעלה באינטרנט. אנחנו צריכים את הקיבולת השנייה. למעשה, ליוצרי מדיה באינטרנט, Shaka 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

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

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