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