Twitch має пост про це. Вони пояснюють, що вирішили використовувати власну програму з кількох причин; один з них полягав у тому, що ffmpeg не дозволяє запускати різні екземпляри x264 в різних потоках, а натомість присвячує всі вказані потоки одному кадру в одному виході, перш ніж переходити до наступного виводу.
Якщо ви не займаєтесь потоковим потоком у режимі реального часу, у вас більше розкоші. "Правильний" спосіб, ймовірно, кодує в одній роздільній здатності лише розмір GOP, вказаний з -g, а потім кодує інші роздільні рішення, примушуючи кадрами кадрів у тих же місцях.
Якщо ви хотіли це зробити, ви можете використовувати ffprobe для отримання разів ключового кадру, а потім використовувати скрипт оболонки або фактичну мову програмування для перетворення цього в команду ffmpeg.
Але для більшості контенту дуже мала різниця між тим, щоб мати один ключовий кадр кожні 5 секунд та два ключові кадри кожні 5 секунд (один вимушений та один із сценарної кадри). Це приблизно середній розмір I-кадру та розмір P-кадрів та B-кадрів. Якщо ви використовуєте x264 з типовими налаштуваннями (я вважаю, що ви повинні зробити що-небудь, щоб вплинути на це, якщо ви встановите -qmin, як поганий спосіб запобігти x264 використовувати бітрейт на простому вмісті; це обмежує всі типи кадрів на одне значення , Я думаю) і отримаєте такий результат, як I-кадр середнього розміру 46 кБ, P-кадр 24 кБ, В-кадр 17 кБ (наполовину частіший за Р-кадри), то додатковий I-кадр щосекунди на 30 кадрів в секунду є лише на 3% збільшення розміру файлу. Різниця між h264 та h263 може складатися з кути зменшення на 3%, але жодна не є дуже важливою.
Для інших типів вмісту розміри кадру будуть різними. Справедливо кажучи, мова йде про часову складність, а не просторову складність, тому це не просто простий вміст проти жорсткого контенту. Але, як правило, веб-сайти для потокового відео мають обмеження у бітрейті, а вміст із відносно великими I-кадрами - це простий вміст, який буде кодуватися з високою якістю незалежно від того, скільки додаткових кадрів ключів додано. Це марно, але цих відходів зазвичай не помітять. Напевно, найбільш марний випадок - це відео, яке є лише статичним зображенням, що супроводжує пісню, де кожен ключовий кадр точно такий же.
Я не впевнений у тому, як примусові ключові кадри взаємодіють із встановленим обмежувачем швидкості з -maxrate та -bufsize. Я думаю, що навіть у YouTube виникли останні проблеми з правильним налаштуванням налаштувань буфера для забезпечення постійної якості. Якщо ви просто використовуєте середні налаштування бітрейта, як це можна побачити на деяких сайтах (оскільки ви можете перевірити параметри x264 в атомі заголовка / mov? За допомогою шестигранного редактора), то модель буфера не є проблемою, але якщо ви Обслуговуючи створений користувачем вміст, середній бітрейт спонукає користувачів додавати чорний екран у кінці відео.
Варіант -g Ffmpeg або будь-який інший варіант кодера, який ви використовуєте, відображається на специфічний для кодера варіант. Отже, '-x264-params keyint = GOPSIZE' еквівалентно '-g GOPSIZE'.
Одна з проблем виявлення сцени полягає в тому, якщо ви з будь-якої причини віддаєте перевагу ключовим кадрам поблизу певних номерів. Якщо кожні 5 секунд ви вказуєте ключові кадри та використовуєте виявлення сцени, а зміна сцени відбувається на 4,5, то її слід виявити, але тоді наступний ключовий кадр буде о 9.5. Якщо час продовжуватиметься таким чином, ви можете закінчити ключові кадри у 42,5, 47,5, 52,5 тощо, замість 40, 45, 50, 55. І навпаки, якщо зміна сцени в 5,5, то буде ключовий кадр у 5 та 5,5 буде занадто рано для іншого. Ffmpeg не дозволяє вам вказати "зробити тут ключовий кадр, якщо в наступні 30 кадрів не буде зміни сцени". Хтось, хто розуміє C, міг би додати цей варіант.
Для відео зі змінною частотою кадрів, коли ви не використовуєте потокову трансляцію, як Twitch, ви повинні мати змогу використовувати зміни сцени без постійного перетворення на постійну частоту кадрів. Якщо ви використовуєте фільтр 'select' у ffmpeg і використовуєте константу 'scene' у виразі, тоді вихід налагодження (-v налагодження або натискання '+' кілька разів під час кодування) показує номер зміни сцени. Це, мабуть, відрізняється від і не настільки корисного, як число, яке використовує x264, але воно все-таки може бути корисним.
Тоді процедура, ймовірно, повинна зробити тестове відео, яке призначене лише для зміни ключових кадрів, але, можливо, воно може використовуватися для даних контролю швидкості, якщо використовується 2-прохідний. (Не впевнений, що згенеровані дані взагалі корисні для різних дозволів та налаштувань; даних макроблок-дерева не буде.) Перетворіть його у відео з постійним кадром, але дивіться цю помилку щодо заїкання виходу, коли вдвічі зменшується частота кадрів, якщо ви коли-небудь вирішите використовувати фільтр fps для інших цілей. Запустіть його через x264 з потрібними налаштуваннями ключових кадрів та GOP.
Тоді просто використовуйте ці ключові рамки разом з оригінальним відеозмінною частотою кадрів.
Якщо ви дозволяєте повністю божевільний вміст, створений користувачем, з 20-секундним розривом між кадрами, то для кодування змінної частоти кадрів ви можете розділити вихід, використовувати фільтр fps, якось використовувати фільтр вибору (можливо, побудувати дійсно довге вираження, яке має щоразу), або, можливо, ви можете використовувати тестовий відеоролик як вхідний сигнал, або розшифрувати лише ключові кадри, якщо ця опція ffmpeg працює, або використати фільтр вибору для вибору ключових кадрів. Потім масштабуйте його до потрібного розміру (для цього є навіть фільтр scale2ref) і накладіть на нього оригінальне відео. Потім використовуйте перемежований фільтр, щоб поєднати ці призначені для примусового використання ключові кадри з оригінальним відео. Якщо це призведе до двох кадрів, розміром яких є 0,001 сек один від одного, що перемежуючий фільтр не заважає, то вирішіть цю проблему самостійно за допомогою іншого фільтра вибору. Тут може бути головна проблема взаємодії з обмеженнями буфера кадру для фільтру, що перемежовується. Це все може спрацювати: використовувати якийсь фільтр, щоб захистити щільніший потік (фільтр-фільтр?); посилайтеся на вхідний файл кілька разів, щоб він декодувався не один раз, і кадри не потрібно зберігати; використовувати фільтр «streamselect», який я ніколи не робив, саме в ті часи ключових кадрів; покращити фільтр перемежування, змінивши його поведінку за замовчуванням або додавши опцію для виведення найстарішого кадру в буфер, а не скидання кадру. чого я ніколи не робив, точно в ті часи ключових кадрів; покращити фільтр перемежування, змінивши його поведінку за замовчуванням або додавши опцію для виведення найстарішого кадру в буфер, а не скидання кадру. чого я ніколи не робив, точно в ті часи ключових кадрів; покращити фільтр перемежування, змінивши його поведінку за замовчуванням або додавши опцію для виведення найстарішого кадру в буфер, а не скидання кадру.