בניית צינור עיבוד וידאו חזק עם FFmpeg

וידאו בפורמטים ו-codec שונים מאט את טעינת העמוד ויוצר אי נוחות למשתמשים. אנחנו מפתחים pipeline לעיבוד וידאו מבוסס FFmpeg, שממיר אוטומטית קבצים לפרופילים אדפטיביים של H.264 ו-WebM. הצוות שלנו מספק את הפרויקט במפתח מלא—מתכנון תור אסינכרוני ועד הטמעה ותמיכה שוטפת, תוך הבטחת פעילות יציבה וסקלביליות של הפתרון.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
בניית צינור עיבוד וידאו חזק עם FFmpeg
מורכב
~5 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

משתמשים מעלים סרטונים בכל מיני פורמטים—MOV מאייפון, MKV מטורנטים, AVI מ-2008. הקצה האחורי חייב לקבל אותם ולספק MP4/H.264 או WebM/VP9 ידידותיים לדפדפן מבלי לחסום את תהליך האינטרנט לדקות של טרנסקודינג. תכננו צינור עיבוד עמיד לתקלות שנמצא בשימוש בייצור כבר שנים—יישמנו אותו ביותר מ-30 פרויקטים. התוצאה: פרופילי איכות אדפטיביים, התקדמות בזמן אמת, והתראות מוכנות. חיסכון טיפוסי במשאבי שרת מגיע ל-40%—עבור שרת בעלות $1000 לחודש, זה $400 שנחסכים. עלויות תעבורת CDN יורדות משמעותית.

למה כדאי להשתמש בטרנסקודינג אסינכרוני?

טרנסקודינג וידאו הוא פעולה עתירת CPU שיכולה לקחת משניות עד עשרות דקות בהתאם לאורך הקליפ ופרופיל הקידוד. עיבוד סינכרוני בתוך בקשת HTTP אינו בא בחשבון: זה יחסום את עובד האינטרנט, יגרום לזמן קצוב (timeout) ויפגע במענה. הגישה הנכונה היא תור משימות אסינכרוני. קידוד חומרה (NVENC) מעבד וידאו פי 3 מהר יותר מתוכנה, אבל גם הוא לא צריך לחסום את הבקשה.

בניית צינור טרנסקודינג

הארכיטקטורה כוללת מספר רכיבים. להלן תהליך שלב אחר שלב:

  1. העלאה: הקובץ נשמר באחסון אובייקטים או בדיסק מקומי; מזהה משימה (Job ID) מוחזר.
  2. תור: משימה נדחפת לתור (RabbitMQ, Redis, SQS) כדי למנוע חסימה של בקשת ה-HTTP. מודל עיבוד הווידאו הזה בתור מבטיח הפרדה.
  3. עובד: מרים את המשימה, מריץ FFmpeg עם הפרמטרים הנדרשים, כותב התקדמות ל-Redis.
  4. התראה: לאחר השלמה, מעדכן את מסד הנתונים ומודיע ללקוח דרך WebSocket או סקירה תקופתית (polling).

קבוצה טיפוסית של פרופילים אדפטיביים לסולם קצבי סיביות:

פרופיל רזולוציה קצב סיביות וידאו קצב סיביות אודיו CRF Preset
360p 640×360 600 kbps 96 kbps 28 fast
720p 1280×720 2500 kbps 128 kbps 23 fast
1080p 1920×1080 5000 kbps 192 kbps 22 medium

CRF (Constant Rate Factor) הוא פרמטר האיכות העיקרי עבור H.264 (המרת H.264 מטופלת על ידי libx264): 18 = כמעט ללא אובדן, 28 = איכות מקובלת בגודל קטן. preset משפיע על מהירות הקידוד מול גודל הקובץ. אנו משתמשים במחלקת שירות Laravel FFmpeg כדי לנהל פרופילים אלה.

לתאימות HLS, אנו מגדירים מרווח פריימים מרכזיים (גודל GOP) ל-2 שניות (לדוגמה, -g 48 עבור 24fps). שימוש ב-b-pyramid יכול לשפר דחיסה ב-5-10%. מדדי VMAF (Video Multimethod Assessment Fusion) עוזרים לכוונן הקצאת קצב סיביות לכל פרופיל.

מעקב אחר התקדמות טרנסקודינג

FFmpeg יכול להוציא התקדמות דרך צינור (pipe). העובד מנתח שורות בפורמט out_time_usec=... ושומר אחוזים ב-Redis. הלקוח מקבל עדכונים דרך WebSocket (לדוגמה, Laravel Echo) או סקירה תקופתית. זה מאפשר הצגת התקדמות מדויקת ללא עיכובים. עיבוד וידאו אסינכרוני מונע זמני קצוב. מנגנון ההתקדמות מתואר בתיעוד של FFmpeg.

בחירת המיכל (Container) תלויה במשימה: MP4 הוא אוניברסלי לסטרימינג, WebM עם VP9 נותן דחיסה טובה יותר, MKV מתאים לאחסון ארכיוני עם כתוביות. לאינטרנט, אנו ממליצים על MP4 עם H.264—דפדפנים לא דורשים תוספים.

יישום שירות FFmpeg

האלמנט המרכזי הוא שירות שמנהל את תהליך FFmpeg עם טיפול בהתקדמות. ספריית PHP לעיבוד וידאו זו מטפלת בטרנסקודינג:

namespace App\Services;

class FfmpegService
{
    public function transcode(
        string $inputPath,
        string $outputPath,
        array $profile,
        ?callable $onProgress = null
    ): void {
        $width = $profile['width'];
        $height = $profile['height'];
        $videoBr = $profile['video_br'];
        $audioBr = $profile['audio_br'];
        $preset = $profile['preset'];
        $crf = $profile['crf'];

        // scale с сохранением соотношения сторон, padding до нужного размера
        $scaleFilter = "scale={$width}:{$height}:force_original_aspect_ratio=decrease," .
            "pad={$width}:{$height}:(ow-iw)/2:(oh-ih)/2:black";

        $cmd = implode(' ', [
            'ffmpeg -y',
            "-i " . escapeshellarg($inputPath),
            "-vf " . escapeshellarg($scaleFilter),
            "-c:v libx264",
            "-preset {$preset}",
            "-crf {$crf}",
            "-maxrate {$videoBr}",
            "-bufsize " . (intval($videoBr) * 2) . "k",
            "-c:a aac",
            "-b:a {$audioBr}",
            "-movflags +faststart",
            "-progress pipe:1",
            "-loglevel error",
            escapeshellarg($outputPath),
        ]);

        $descriptors = [
            0 => ['pipe', 'r'],
            1 => ['pipe', 'w'],
            2 => ['pipe', 'w'],
        ];

        $proc = proc_open($cmd, $descriptors, $pipes);
        // ... чтение прогресса и проверка кода выхода
    }
}

namespace App\Services; class FfmpegService { public function transcode( string $inputPath, string $outputPath, array $profile, ?callable $onProgress = null ): void { $width = $profile['width']; $height = $profile['height']; $videoBr = $profile['video_br']; $audioBr = $profile['audio_br']; $preset = $profile['preset']; $crf = $profile['crf']; // scale с сохранением соотношения сторон, padding до нужного размера $scaleFilter = "scale={$width}:{$height}:force_original_aspect_ratio=decrease," . "pad={$width}:{$height}:(ow-iw)/2:(oh-ih)/2:black"; $cmd = implode(' ', [ 'ffmpeg -y', "-i " . escapeshellarg($inputPath), "-vf " . escapeshellarg($scaleFilter), "-c:v libx264", "-preset {$preset}", "-crf {$crf}", "-maxrate {$videoBr}", "-bufsize " . (intval($videoBr) * 2) . "k", "-c:a aac", "-b:a {$audioBr}", "-movflags +faststart", "-progress pipe:1", "-loglevel error", escapeshellarg($outputPath), ]); $descriptors = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w'], ]; $proc = proc_open($cmd, $descriptors, $pipes); // ... чтение прогресса и проверка кода выхода } } הוא חובה: הוא מזיז את אטום moov לתחילת קובץ ה-MP4, ומאפשר לדפדפן להתחיל נגינה לפני הורדת הקובץ המלא. בלעדיו, הווידאו לא יתחיל עד שכל הקובץ יורד.

בחירה בין קידוד תוכנה לחומרה

קידוד תוכנה (libx264) מספק איכות טובה יותר בקצבי סיביות נמוכים אבל איטי יותר. קידוד חומרה (NVENC) מהיר יותר אבל עלול לפגוע באיכות תחת דחיסה חזקה. השוואה:

פרמטר תוכנה (libx264) חומרה (NVENC)
מהירות 1x 3-5x
איכות טובה יותר בקצב סיביות נמוך קצת פחות טובה
עומס CPU גבוה נמוך
זמינות תמיד דורש GPU

לייצור, אנו часто משלבים: האצת חומרה NVENC לתצוגות מקדימות, libx264 לארכיון סופי. הבחירה האופטימלית תלויה בעדיפויות שלך: מהירות או איכות. אופטימיזציית rate-distortion מתקדמת (RDO) ב-libx264 משפרת עוד יותר את יעילות הדחיסה, אם כי במחיר חישובי גבוה יותר.

מה כלול בעבודה

כחלק מפיתוח צינור FFmpeg זה, אנו מספקים:

  • הגדרת תור (RabbitMQ/Redis) ועובד supervisor לעובדים.
  • יישום שירות FFmpeg עם ניתוח התקדמות.
  • יצירת מחלקות משימה (Job) עם מטפלי הצלחה/שגיאה.
  • הגדרת פרופילים אדפטיביים לצרכים שלך.
  • נקודות קצה (Endpoints) לאחזור התקדמות ותוצאות.
  • שילוב התראות WebSocket (אופציונלי).
  • תיעוד פריסה וניטור.
  • תמיכה והדרכה לאחר מסירה.

פיתוח הצינור בדרך כלל עולה בין $800 ל-$1200 ומחזיר את ההשקעה תוך כמה חודשים דרך הפחתת עלויות שרת ו-CDN.

לוח זמנים והזמנה

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

טעויות נפוצות ואיך להימנע מהן
  • התעלמות מאטום moov: ללא -movflags +faststart, הווידאו לא יזרים. בדוק עם -movflags +faststart.
  • יותר מדי עובדים מקבילים: עומס CPU. השתמש ב-ffprobe -v quiet -print_format json -show_format output.mp4 | grep moov לכל עובד ב-supervisor.
  • שכחת זמן קצוב למשימה: הגדר numprocs=1 מתאים (לדוגמה, שעה לסרטונים ארוכים).
  • לא לטפל בשגיאות FFmpeg: בדוק את קוד החזרה ורשום stderr.

השתמש בהמלצות אלה—והצינור שלך יפעל ביציבות גם תחת עומס גבוה.