לעתים קרובות, עבודה עם מדיה מחייבת שינוי המאפיינים של קובצי מדיה, כגון קצב העברת נתונים או רזולוציה. מציאת דרך ישירה להתחיל יכולה להיות די מפחידה. בדף הזה נסביר על הכלים שבהם אנחנו משתמשים ואיך להתקין אותם במהירות.
ראשית, תיארנו את השימוש הבסיסי בשני כלי מדיה נפוצים של שורת פקודה: Shaka Packager ו-FFmpeg, ולאחר מכן נעזור לך להתקין את הכלים במהירות. מדוע לכסות שתי אפליקציות? שני הכלים האלה חזקים ושימושיים כשלעצמם, אבל גם לא כל מה שנדרש כדי להכין מדיה לאינטרנט. יצרנו גם את הדפים המרת מדיה והצפנת מדיה, שמציגים עוד פעולות נפוצות רבות עם שתי האפליקציות האלו.
האפליקציות האלה הן לא האפשרויות היחידות שאפשר לבצע בהן פעולות של מניפולציה של קבצים, אבל הן שתיים מבין האפליקציות הנפוצות והעוצמתיות ביותר. האפשרויות הנוספות כוללות את אפליקציות ה-GUI Miro, HandBrake ו-VLC. יש גם שירותי קידוד/המרת קידוד כמו Zencoder, Amazon Elastic Encoder ו-Google Transcoder API.
שקה פרג'טר
Shaka Packager הוא ערכת SDK לאריזת מדיה חינמית. אם השתמשתם בנגן מדיה באתר, ב-Shaka Packager הייתם משתמשים כדי להכין את הקבצים. הוא תומך בהמרה לשני הפרוטוקולים הנפוצים ביותר לסטרימינג של וידאו: Dynamic Adaptive Streaming over HTTP (DASH) או HTTP Live Streaming (HLS). ב-Shaka Packager יש תמיכה בתכונות אבטחה מרכזיות: הצפנה משותפת וניהול זכויות דיגיטליות (DRM) ב-Widevine. הוא יכול גם לתמוך בסטרימינג בשידור חי ובוידאו על פי דרישה (VOD).
למרות מה שכתוב בחבילה, כלי השירות הזה מיועד ליותר ממפתחים של C++. אפשר להשתמש בו גם כספרייה לבניית תוכנת מדיה וגם ככלי של שורת פקודה להכנת קובצי מדיה להפעלה באינטרנט. זו הקיבולת של מאוחר יותר, שמועילה לנו כאן. למעשה, עבור יוצרים של מדיה באינטרנט, Shaaka 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 מלא, ורכיבי ה-Codec של האודיו והווידאו הם בין סוגי המאגרים המועדפים עליהם, 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, אתם יכולים להמשיך ללמוד את המושגים הבסיסיים ולהמשיך את היסודות של סטרימינג של מדיה.