Videolarni miqyosda boshqarishning eng yaxshi usuli

Bugungi dunyodagi videolar har qanday mavzuni tushunish va har qanday mavzuni tushunish uchun oson usulga aylandi. Videolar boshqa har qanday vositalarga qaraganda ko'proq iste'molchilar e'tiborini talab qilishi isbotlangan. Odamlar istalgan vaqtda, istagan joyda istalgan joyda videolarga kirishni yoqtirishadi va rivojlanayotgan kompaniyalar uchun nafaqat sifatli tarkibni etkazib berish, balki o'z mijozlariga yaxshi ko'rish tajribasini berish ham qiyin.

Kompaniyamizni tanishtirish -

Biz mamlakatdagi eng yirik 3 nafar tekshiruvdan o'tgan shifokorlar maydonchamiz. Tez harakatlanuvchi kompaniya sifatida biz mahsulot bilan juda ko'p tajriba o'tkazamiz va shu bilan birga barchaga sifatli mahsulotni etkazib berishda ehtiyot bo'ling. Yaqinda biz foydalanuvchilarimizga jarrohlik muolajalari va hokazolar haqida videofilmlarni yuklash, o'z xulosalari bilan o'rtoqlashish va o'z hamkasblaridan maslahat olish uchun imkoniyat yaratdik.

Ko'pgina foydalanuvchilarimiz yo'lda tezroq Internet tezligini minimal qabul qilishadi va bu videolar kabi og'ir ma'lumotlarni uzatishda qiyinchilik tug'diradi.

Biz video etkazib berish uchun HLS protokolidan foydalanish mutlaqo ravshan deb topdik, chunki u Apple tomonidan ishlab chiqilgan va Facebook kabi ko'plab yirik kompaniyalar tomonidan ishlatilgan. HLS HTTP Live Streaming-ni anglatadi. Bu video va audio tarkibni etkazib berish uchun media-oqim protokoli. Mp4-video odatda 10 soniyagacha bo'lgan kichik segmentlarga bo'linadi va har bir segment uchun bir nechta video sifati segmentlari yaratiladi, ularni mavjud internet o'tkazish qobiliyati asosida ijro etish uchun yuklab olish mumkin.

Shunday qilib, har qanday o'yinchi HLS formatidagi videoni o'ynatganda, u mavjud tarmoqli kengligi asosida video segmentini talab qilishi va foydalanuvchilarga uzluksiz tajriba berib, videoni uzluksiz ravishda uzatishi mumkin. Bir vaqtning o'zida foydalanuvchilar past aniqlikdagi videoni ko'rishlari mumkin, va keyingi daqiqada qurilma yuqori tarmoqli kenglik diapazonida bo'lishi bilanoq yuqori aniqlikka o'tishi mumkin.

Quyida biz videoning dastlabki qaroridan tashqari foydalanish holati uchun foydalangan qarorlarimiz -

Yaratiladigan videoning o'lchamlari

Yuklangan videolarni kerakli formatga o'zgartirish, shuningdek, video to'ldiruvchisi uchun eskizni yaratish juda qiyin edi. Videoni o'zgartirish va kontentni etkazib berishni ta'minlaydigan ko'plab xizmat ko'rsatuvchi provayderlar mavjud, ammo asosiy muammo shundaki, ular ma'lum bir vaqtgacha sotilishi mumkin va kompaniyaning o'sishi bilan siz cho'ntagingizda yuk bo'lmaydigan echim kerak. AWS MediaConvert va S3 - bu bizning video media-ni o'zgartirish va etkazib berish uchun tanlagan vositalarimiz. Quyida muhokama qilingan yechimdan foydalangan holda biz harajatlarimiz uchun 90% ga xarajatlarni kamaytirishimiz mumkin. Agar biz qanday qilib yechimni qanday nol qilganimizni bilmoqchi bo'lsangiz, maqolani ko'rib chiqing.

Boshlang'ich yondashuv

Uy ichidagi yechimni yaratishning o'rniga, biz uchinchi tomon xizmatlaridan foydalanishga qaror qildik, buning uchun Cloudinary bizning ishimizga mos keladi. Bu video translyatsiya xizmatini taqdim etadi, bu haqiqatan ham bizga zarur bo'lgan o'zgarishlarni olishga yordam berdi va olingan umumiy vaqt ham kam edi.

Rivojlanish tezroq sodir bo'ldi, chunki biz o'zgarishlar haqida tashvishlanishga hojat yo'q. Biri videoni yuklashi kerak, kerakli o'zgarishlarni tanlang va qolganini Cloudinary bajaradi. Dastlab, Cloudinary bizning byudjetimizda yaxshi edi, ammo bu xususiyat ko'proq tortishishni boshlaganligi sababli, ko'proq foydalanuvchilar videolarni yuklay boshladilar. Bu o'sish bizning Klyutiniyaga sarflagan mablag 'miqdoriga to'g'ri keldi va boshqa variantlarni qidirish vaqti keldi.

Bizning tajribalarimiz

Birinchidan, biz taniqli ochiq manbali kutubxonani - ffmpegni sinab ko'rdik, u bizga kerakli video konvertatsiyasini amalga oshirishi mumkin. Bizda ffmpeg kutubxonasidan foydalanishning ikkita varianti bor edi - Cloud Functions-dan foydalaning yoki GCP-da (Google Cloud Platform) allaqachon ishlaydigan VM-dan birini ishlating.

Butun jarayon talabga javob beradigan modelda ishlayotganligi sababli, oxirgi tanlov bekor qilindi. Cloud Funktsiyalar talab bo'yicha hisob-kitob modeliga asoslangan bo'lib, biz zaruriyat tug'ilganda, boshqa xizmatlarimizga ta'sir qilmasdan, resurslarni olamiz. Talab qilinganidek, server bo'sh turganida biz uning narxini to'lashimiz shart emas.

Bulutli funktsiyalardan foydalanish juda oson va kodni ikkita eng mashhur tillarda - tugun va pitonda yozish imkoniyatini beradi. Biz piton bilan borishga qaror qildik, chunki biz paradigma bilan uyg'unmiz, chunki bizning stifimiz pifonda. Bog'lanishlarni o'rnatish haqiqatan ham oson, siz uni accounts.txt faylida aytib o'tishingiz kerak va siz sozlangansiz.

Biz "bulut" funktsiyasi uchun ishlaydigan skriptni oldik, unda birinchi navbatda videoni bulutli saqlashdan yuklab olamiz, uni kerakli formatga o'zgartiramiz va uni oqim uchun saqlash uchun bulutli saqlash tizimiga qaytaramiz.

Ammo ushlash bor edi. Biz foydalanuvchilarimizga 100 MB hajmdagi videolarni yuklashiga ruxsat berdik va shu hajmdagi bulut funktsiyasi videosini boshqarish uchun ko'p vaqt talab qilinardi va vaqt (540 soniya) tufayli butun jarayonni tugatmasdan tugatamiz. Himoyamizda biz oldin bu stsenariy haqida o'ylamagan edik.

Boshqa variantlarni va ko'plab tadqiqotlarni o'rganib chiqqandan so'ng AWS MediaConvert istiqbolli ko'rinishga ega bo'ldi. MediaConvert bilan ishlash juda qiyin edi, chunki bu sizning transformatsiyangizni sozlash uchun juda ko'p imkoniyatlarni beradi va bu vaziyatda osonlikcha yo'qolishingiz mumkin (tanlov buzilgan). Bir muncha vaqt atrofga nazar tashlaganimizdan so'ng, biz kerakli o'zgarish uchun kerakli shablonni oldik. (shablonni ilova qiling)

Bizning butun oqimimiz bir narsaga o'xshardi -

Biz S3 chelakka video yuklaymiz, bu esa Lambda funktsiyasini ishga tushiradi. Lambda biz ffmpeg-dan boshqa hech birini ishlatmasdan MediaConvert uchun kirish sifatida zarur bo'lgan parametrlarni aniqlaymiz. Barcha parametrlarni hisoblab chiqqandan so'ng, biz AWS MediaConvert-ga videomizni o'zgartirish uchun so'rov yuboramiz. Transformatsiya tugaganligi to'g'risida xabardor bo'lish uchun MediaConvert-da ishning holatini "progressiv" dan "yakunlangan" ga o'zgartirishning bulutli hodisasini yaratish mumkin, bu esa lambda funktsiyasini ishga tushiradi. Lambda-ni ishga tushirish funksiyasi api qo'ng'iroqini amalga oshirishi yoki loyihangizning maqsadga muvofiqligiga qarab db yangilanishini amalga oshirishi mumkin.

Qisqasi :

AWS echimi joziba kabi ishladi va bu juda tez edi. Bu juda ko'p ishlarga o'xshab ko'rinishi mumkin, ammo agar o'lchamni ko'paytirish kerak bo'lsa, buni qilish arziydi.

Ushbu echimdan foydalanishning afzalliklari -

  • Biz S3-dan juda keng miqyosli va arzon bo'lgan media-tarkibni saqlash va etkazib berish uchun foydalanmoqdamiz.
  • AWS MediaConvert haqiqatan ham tezkor va ish joyini o'zgartirish uchun bir nechta navbatlarni ushlab turish uchun funktsional imkoniyatlarni beradi. Shunday qilib, siz videolarni boshqarish uchun so'rovlarda to'satdan sakrash haqida tashvishlanishga hojat yo'q. Shuningdek narxlash haqiqatan ham tejamkor, oylik to'lov olinmaydi va siz faqat ishlatilgan xizmatlar uchun to'lashingiz kerak.
  • AWS Lambda biz yuqorida muhokama qilgan Talabni hisoblash asosida yaratilgan. Bundan tashqari, AWS sizga bir necha bepul lambda chaqirishni va Lambda funktsiyasining oyiga protsessor vaqtini beradi, bu juda yaxshi, hatto bepul narxlardan tashqari foydalanish ham sizning cho'ntagingizga og'irlik qilmaydi.

AWS tarqatish paytida duch keladigan muammolar:

  • Har doim esda tutingki, AWS global miqyosda mavjud bo'lgan S3 singari holatlardan tashqari, mintaqalarga qarab xizmatlarni taqdim etadi. Xuddi shu mintaqada xizmatlardan foydalaning, aks holda siz voqealarni kuzatib yoki lambda funktsiyalarini ishga tushira olmasligingiz mumkin.
  • O'zingiz foydalanadigan xizmatlar uchun sizning IAM rolingizga zarur ruxsat bering.
  • Yuqorida aytib o'tilganidek, S3 chelakka videoni yuklash lambda funktsiyasini ishga tushiradi, unda biz kerakli videolarning aniqligi, bit tezligi va boshqalar kabi kerakli ma'lumotlarni o'zgartiramiz va shu qiymat uchun siz yuklangan videoning meta ma'lumotlarini topishingiz kerak. , kengligi va bitreyt. Bizning lambda ishlaydigan konteynerga oldindan yuklanmagan qiymatni olish uchun siz ffmpeg kabi ba'zi bir video ishlov berish kutubxonasidan foydalanishingiz kerak, chunki lambda bir yoki bir nechta konteynerlarda ishlaydi va talabga binoan o'chiriladi.
  • Google Cloud Functions-dan farqli o'laroq, siz faqat kutubxona nomini талаботи.txt-ga qo'shishingiz mumkin va qolganlarini bajarishingiz mumkin, AWS lambda uchun siz lambda funktsiyasida ishlatiladigan barcha kutubxonalar va ikkiliklarning ZIP-faylini yaratishingiz kerak. Biroz izlanishlar olib borganimizdan so'ng, siz ffmpeg-ning / tmp papkasiga ikkilik qo'shishingiz va uni o'z funktsiyangizda ishlatishingiz mumkinligini aniqladik. Ffmpeg-ni yo'lga tashrif buyurish va bu erda avs lambda tarqatish paketini yaratish bo'yicha qadamlar uchun.
  • Sinov paytida biz iOS qurilmalarida tasvirlangan videolar transformatsiyadan keyin portretdan landshaftga aylantirilayotganligini aniqladik (StackOverflow munozarasi va AWS forumi). Buning sababi, iOS qurilmasida video tortishish dastlab peyzaj rejimida video meta-ma'lumotlarda bayroq bilan saqlanadi, unda pleer o'ynash paytida videoni aylantirishi kerak. O'zgartirishni amalga oshirishda aylanish identifikatori yo'qoladi va shu sababli video peyzaj rejimida o'ynaladi va aylantirilganga o'xshaydi.
  • Birinchidan, biz ushbu videolarni ffmpeg-dan foydalanib aniqladik. Ushbu videolar ffmpeg-dan foydalanib olish mumkin bo'lgan video meta ma'lumotlarining "Ko'rsatkich matritsasida" "aylanish" qiymatiga ega. Keyin ushbu videolarni aylanaga qarab aylantiring va endi siz aylantirilgan videoni yuqoridagi texnikadan foydalanib o'zgartirasiz.

Agar siz ushbu maqolani foydali deb bilsangiz, iltimos, chapak chalish tugmasini bosing. Iltimos, yuqorida aytib o'tilgan har qanday bosqichda biron bir yordamga muhtoj bo'lsangiz, bog'laning.