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