#audio #video #containers #mp4 #fmp4
Вопрос:
Я создаю FMP4 с 2 дорожками (одна для видео и одна для аудио). Я пытаюсь выяснить, сколько образцов видео я должен включить в mdat, а также сколько аудио.
Таким образом, мой FMP4 имеет следующую структуру:
ftyp
moov
moof (track1 - video)
mdat (track1 - video)
moof (track2 - audio)
mdat (track2 - audio)
moof (track1 - video)
mdat (track1 - video)
moof (track2 - audio)
mdat (track2 - audio)
...
Должен ли каждый mdat видео иметь только 1 кадр или весь GOP?
Если у каждого аудио mdat будут соответствующие аудио-сэмплы предыдущего видео mdat или я могу отправить столько аудио-сэмплов, сколько захочу (поскольку аудио-сэмплы намного меньше, я мог бы отправить около 2 секунд аудио, в то время как видео mdat, отправленное ранее, длится всего 1 секунду).
PS: Я думал, что отправлю всю GOP на каждый mdat видео, но я заметил, что, когда я перекодирую этот fmp4 с помощью ffmpeg, это приведет к тому, что mdat будет содержать только 1 кадр. Я могу это сделать (иметь только 1 видеокадр на каждом mdat), но тогда я теряюсь в том, сколько аудиосэмплов я должен отправить. Если я отправлю только соответствующие звуковые образцы для этого 1 видеокадра, звук будет воспроизводиться не очень хорошо.
Спасибо!
Комментарии:
1. @szatmary есть какие-нибудь предложения?
2. Вы можете попробовать: для каждого видеокадра есть два аудиокадра (либо до, либо после видео). Время от времени вам придется отправлять только один аудиокадр с видеокадром, чтобы сохранить синхронизацию. Проверьте онлайн, как рассчитать длину аудиокадра MPEG (в миллисекундах), так как это зависит от настроек звука. Зная, сколько миллисекунд длится ваш аудио-или видеокадр (его длительность во времени), вы можете знать, сколько единиц измерения требуется в секунду…
3.PS: (1) Посмотрите, есть ли в коробке MP4
trun
полезная для вас информация. (2) «я мог отправить как 2 секунд пока видео mdat по направлен прежде всего на 1 секунду продолжительность» просто экспериментировать и делать заметки, Смотри Как декодер реагирует на временных меток в аудио/видео данных (возможно, в формате MPEG декодер работа для кэширования ввода кадры и только дисплей по указанному составу времени).4. @VC.One, спасибо за предложения. Мой звук-AAC, поэтому он имеет фиксированную продолжительность (каждый кадр имеет 21,33 мс на кадр, так как частота дискретизации составляет 48000 Гц). Мне было любопытно, есть ли какие-либо ограничения, но из вашего ответа следует, что это действительно зависит, и мне решать, как его отправить, верно?
Ответ №1:
Из нескольких эмпирических тестов с использованием ffmpeg следует, что ему нравится группировать 0,5 с видеокадров, за которыми следует 0,5 с аудиокадров, и это, похоже, работает очень хорошо.
Ответ №2:
Вы можете свободно выбирать группировку, и она может быть такой же простой, как один кадр/пакет на коробку. Группировка будет иметь значение для читателя, так как он, скорее всего, предпочтет прочитать полное поле перед началом обработки.
Комментарии:
1. Да, вы можете сгруппировать его с помощью различных комбинаций, но в зависимости от того, как вы сгруппируете, это повлияет на производительность считывателя, что вызовет проблемы с видео/аудио.
2. Достойные реализации считывателя/демультиплексора принимают любую группировку
3. Из моих тестов видно, что тег видео VLC и HTLM5 (Chrome) плохо работает с какой-либо группировкой.
4. Вы играете в нее близко к живому краю, не так ли? Я помню, что Chrome специально для хорошего анализа mdat с одним пакетом, однако не подавал видео аудио.
5. Таким образом, группируясь в пакеты по 0,5 с, вы «покупаете» некоторое время буферизации, чтобы компенсировать неэффективность игроков [браузера и VLC]. Имеет смысл, хотя это, очевидно, проблема игрока, а не ваша.