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

Derek Herman
Derek Herman
Joe Medley
Joe Medley

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

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

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

שאקה פאנקר

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

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