گاهی اوقات چیزهای خوب نام های خسته کننده ای دارند.
نمونه موردی: Unified Media Pipeline، به اختصار UMP .
این ممکن است مانند یک دستورالعمل شوم دوران شوروی به نظر برسد، اما در واقع گام مهمی به سوی ارائه مداوم صوتی و تصویری بین پلتفرمی است. کروم در اندروید اکنون از همان پشته رسانه کروم دسکتاپ استفاده میکند، نه اینکه بر پیادهسازی پلتفرم زیربنایی تکیه کند.
UMP به شما امکان می دهد کارهای زیادی انجام دهید:
- صدا و تصویر را با سرویسکاران ذخیره کنید، زیرا اکنون تحویل رسانه بهجای انتقال به پشته رسانه Android، مستقیماً در Chrome پیادهسازی میشود.
- از URL های حباب برای عناصر صوتی و تصویری استفاده کنید.
-
playbackRate
برای صدا و تصویر تنظیم کنید. - MediaStreams را بین Web Audio و MediaRecorder منتقل کنید.
- برنامههای رسانه را راحتتر در همه دستگاهها توسعه دهید و نگهداری کنید - رسانه در دسکتاپ و اندروید یکسان عمل میکند.
UMP چند کار مهندسی سخت برای پیاده سازی انجام داد:
- یک لایه کش جدید برای بهبود عملکرد قدرت.
- بهروزرسانی رمزگشای ویدیویی مبتنی بر MediaCodec که در فرآیند GPU کروم میزبانی شده است.
- تعداد زیادی تست و تکرار در دستگاه های مختلف.
در اینجا یک نسخه نمایشی از ذخیره ویدئو با یک سرویس دهنده وجود دارد:
ذخیره فایل ویدئویی و تصویر پوستر ویدئو به سادگی اضافه کردن مسیرهای آنها به لیست URL ها برای واکشی اولیه است:
<video controls poster="static/poster.jpg">
<source src="static/video.webm" type="video/webm" />
<p>This browser does not support the video element.</p>
</video>
var urlsToPrefetch = [
'static/video.webm', 'static/poster.jpg',
];
ناتوانی در تغییر playbackRate
در اندروید یک باگ طولانی مدت بوده است. UMP این را برطرف می کند. برای نسخه نمایشی در simpl.info/video/playbackrate ، playbackRate
روی 2 تنظیم شده است. آن را امتحان کنید!
UMP URL های blob را برای عناصر رسانه فعال می کند - به این معنی که، برای مثال، اکنون می توانید ویدیوی ضبط شده با استفاده از MediaRecorder API را در یک عنصر ویدیویی در Android پخش کنید :
این هم کد مربوطه:
var recordedBlobs = [];
mediaRecorder.ondataavailable = function(event) {
if (event.data && event.data.size > 0) {
recordedBlobs.push(event.data);
}
};
function play() {
var superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
recordedVideo.src = window.URL.createObjectURL(superBuffer);
}
برای نسخه ی نمایشی در simpl.info/video/offline ، ویدئو با استفاده از File API ذخیره می شود، سپس با استفاده از URL Blob پخش می شود:
function writeToFile(fileEntry, blob) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function() {
readFromFile(fileEntry.fullPath);
};
fileWriter.onerror = function(e) {
log('Write failed: ' + e.toString());
};
fileWriter.write(blob);
}, handleError);
}
function readFromFile(fullPath) {
window.fileSystem.root.getFile(fullPath, {}, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function() {
video.src = URL.createObjectURL(new Blob([this.result]));
};
reader.readAsArrayBuffer(file);
}, handleError);
}, handleError);
}
خط لوله یکپارچه رسانه همچنین برای برنامه های افزودنی منبع رسانه (MSE) و برنامه های افزودنی رسانه رمزگذاری شده (EME) فعال شده است.
این یک گام دیگر برای یکسان سازی کروم موبایل و دسکتاپ است. نیازی نیست کد خود را تغییر دهید، اما ایجاد یک تجربه رسانه ای ثابت در سراسر دسکتاپ و تلفن همراه باید آسان تر باشد، زیرا پشته رسانه در همه سیستم عامل ها یکسان است. اشکال زدایی با کروم DevTools؟ شبیه سازی موبایل اکنون از پشته صوتی و تصویری "واقعی" استفاده می کند.
اگر در نتیجه خط لوله یکپارچه رسانه با مشکل مواجه شدید، لطفاً مشکلات مربوط به اشکال پیادهسازی یا از طریق new.crbug.com ثبت کنید.
دموها
- ذخیره ویدئو با یک کارگر خدمات
-
playbackRate
رسانه - MediaRecorder: پخش با استفاده از URL blob
- ویدیوی آفلاین که با File API اجرا شده است
اشکالات مربوطه
چند اشکال وجود دارد که بر <video>
، سرویسدهندگان و API حافظه کش تأثیر میگذارد:
-
<video>
یک حالت را راهاندازی میکند: cors درخواست میکند و پاسخ غیرشفاف کارگر سرویس را نمیپذیرد - جستجو در ویدیوهایی که توسط کش سرویس ارائه می شود کار نمی کند
پشتیبانی از مرورگر
- به طور پیش فرض در Chrome 52 و بالاتر فعال است.