Войти
ПрограммированиеФорумОбщее

Как обернуть h264 в mp4? (2 стр)

Страницы: 1 2
#15
22:09, 12 янв. 2021

MAMOHT-92
Собственно у меня так все и работает. Подготовка кадра занимает на порядок больше времени (20-30 мс) чем его аппаратная кодировка (меньше мс), т.е. энкодинг вообще не тормозит, для меня это важно, поскольку проект в VR. Создается h264 файл, потом он в отдельном треде преобразуется в mp4. Все отлично, если бы не эта непонятка с AMD. Я когда-то контачил с разработчиками AMF но контакт давно потерял. Сегодня написал одному приятелю из AMD описав ситуацию. Может он переправит запрос по инстанциям и тогда что-то прояснится.

Что до FFmpeg то есть библиотека на порядок проще и без этих ограничений. Называется libMP4v2, разработала ее Cisco в 2000 году (https://code.google.com/archive/p/mp4v2/).
Это опенсорс и лицензия там божеская, требует только сохранять упонинание оригинального разработчика в сорсах. Я ее просто засунул в проект как есть, даже библиотеку не собирал.


#16
3:10, 13 янв. 2021

san
> Я ее просто засунул в проект как есть, даже библиотеку не собирал.

Ну тогда ещё пройтись по сорцам и выкинуть res-стринги. Иначе, при определённых ключах компилятора и линковщика, в бинарник попадёт имя автора библиотеки :)

const char deflate_copyright[] =
   " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
#17
3:39, 13 янв. 2021

Gradius
Нет там такого.  Там стоит:
/*
* Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
*
* Contributor(s):
*      Dave Mackie   

  •       Alix Marchandise-Franquet 
  • /

  • Но это в хедере к файлам. И там же ссылка на открытую лицензию. В бинарник это не попадает.
    #18
    (Правка: 9:00) 8:54, 14 янв. 2021

    Непонятка продолжается. Поговорил с парнем из AMD, он ничего конкретное сказать не смог, он далек от этой темы. Но удивился такому результату.
    Я закинул на сервер два файла в mp4.
    Вот файлы:  http://www.sanbasestudio.com/tmp/NV.mp4 и http://www.sanbasestudio.com/tmp/AMD.mp4
    Там внутри сидят исходные h264 с энкоdеров, но так их хоть смотреть можно. Один аппаратно закодирован Nvidia, второй AMD.
    Размер примерно одинаков, качество (на глаз) - тоже. Оба записывались 11 минут. Но первый играется 11 минут, а второй 23.
    Может кто-то из знатоков скажет, почему второй файл воспроизводится в 2 с лишним раза медленнее? Фреймрейт одинаков, количество фреймов тоже.... Мистика.

    #19
    (Правка: 9:08) 9:07, 14 янв. 2021

    san
    > Может кто-то из знатоков скажет, почему второй файл воспроизводится в 2 с
    > лишним раза медленнее? Фреймрейт одинаков, количество фреймов тоже.... Мистика.

    из свойств в MPC HC:

    NV.mp4    Video: MPEG4 Video (H264) 1024x768 30fps 11933kbps [V: h264 high L3.1, yuv420p, 1024x768, 11933 kb/s]
    AMD.mp4 Video: MPEG4 Video (H264) 1024x768 30fps 6096kbps [V: h264 main L4.2, yuv420p, 1024x768, 6096 kb/s]

    Размер файла[байт] = битрейт[kbps] * 1000 / 8 * время[c]

    NV: 11933 * 1000 / 8 * 12 = 17 899 500 байт ~ 17 МБ
    AMD: 6096 * 1000 / 8 * 24 = 18 288 000 байт ~  17 МБ

    Так что противоречий не вижу :)

    #20
    (Правка: 9:47) 9:34, 14 янв. 2021

    Gradius
    >Размер файла[байт] = битрейт[kbps] * 1000 / 8 * время[c]
    Не совсем так - в Nvidia энкодер с NV_ENC_CAPS_ASYNC_ENCODE_SUPPORT, т.е  там плавающий битрейт.
    Но дело не в размере файла или битрейте - оба файла созданы из h264 которые содержат примерно одинаковое количество фреймов. Но они созданы на разных платформах. Результат - файл созданный Nvidia воспроизводится правильно (количество фреймов / фреймрейт), а созданный AMD со скоростью его создания (может это совпадение, но очень похоже).

    И еще одно: если те же самые h264 файлы обернуть с помощью FFmpeg то результат играется 11 секунд. Что AMD что Nvidia. Так что не так в AMD.mp4? Ведь там сидит тот же самый h264 что и в файле сделанном FFmpeg.

    #21
    9:45, 14 янв. 2021

    san
    > san

    Выше дал ответ на ваш вопрос. Соглашаться с ним или нет - это уже ваше дело.

    #22
    (Правка: 9:53) 9:51, 14 янв. 2021

    Gradius
    Увы, но это не ответ. Время воспроизведения не зависит от битрейта, оно зависит только от фреймрейта и количества фреймов. Как фреймы закодированы, с какой компрессией - это неважно.

    #23
    9:55, 14 янв. 2021

    Неsan
    > Увы, но это не ответ. Ты просто не понимаешь простую вещь - время
    > воспроизведения не зависит от битрейта, оно зависит только от фреймрейта и
    > количества фреймов. Как фреймы закодированы, с какой компрессией - это неважно.

    Вы не понимаете более простую вещь - в H264 нет такого понятия фреймрейта вообще. С каким фреймрейтом хочу - с таким и показываю кадры :)  То что вы там в мета-тегах начитываете FPS, это вообще не догма, и на это можно забить.

    #24
    (Правка: 10:32) 10:27, 14 янв. 2021

    Gradius
    >H264 нет такого понятия фреймрейта вообще. С каким фреймрейтом хочу - с таким и показываю кадры
    Да ну?  Как же тогда работает команда "ffmpeg -i orig.264 -vcodec copy out.mp4"? - Тут не задается фреймрейт но mp4 успешно воспроизводится с тем фреймрейтом который указан в энкодере (кстати зачем тогда его вообще указывать, если "в H264 нет такого понятия фреймрейта вообще"? 
    VLC тоже как то играет h264 файл созданный Nvidia, причем с правильным фреймрейтом. Короче с вашими заявлениями что-то не то.

    Страницы: 1 2
    ПрограммированиеФорумОбщее