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