рассчитать длину кадра MPEG (мс)

Я ищу по всему Интернету информацию о вычислении длины кадра, и это было сложно... Мне удалось успешно вычислить длину кадра в мс MPEG-4, AAC, используя:

frameLengthMs = mSamplingRate/1000

Это работает, так как в AAC есть один образец на кадр. Для MPEG-1 или MPEG-2 я запутался. На кадр приходится 1152 семпла, хорошо, так что мне с этим делать? :П

Пример кадра:

MPEGDecoder(23069): mSamplesPerFrame: 1152
MPEGDecoder(23069): mBitrateIndex: 7
MPEGDecoder(23069): mFrameLength: 314
MPEGDecoder(23069): mSamplingRate: 44100
MPEGDecoder(23069): mMpegAudioVersion 3
MPEGDecoder(23069): mLayerDesc 1
MPEGDecoder(23069): mProtectionBit 1
MPEGDecoder(23069): mBitrateIndex 7
MPEGDecoder(23069): mSamplingRateFreqIndex 0
MPEGDecoder(23069): mPaddingBit 1
MPEGDecoder(23069): mPrivateBit 0
MPEGDecoder(23069): mChannelMode 1
MPEGDecoder(23069): mModeExtension 2
MPEGDecoder(23069): mCopyright 0
MPEGDecoder(23069): mOriginal 1
MPEGDecoder(23069): mEmphasis 0
MPEGDecoder(23069): mBitrate: 96kbps

person Jona    schedule 09.06.2011    source источник
comment
Не знаю насчет mpeg4/aac, но звуковой кадр MP3 составляет 0,028 секунды. Возможно, это перенесено в mpeg4.   -  person Marc B    schedule 09.06.2011
comment
MPEG4 в этом нет нужды :) Так в MP3 кадр всегда 28мс? Даже MPEG1 MPEG2 и MPEG2.5?   -  person Jona    schedule 09.06.2011
comment
Это верно для звуковых кадров. Я никогда не просматривал видео части MPEG, поэтому ничего не могу сказать о них.   -  person Marc B    schedule 09.06.2011
comment
Спасибо за вашу помощь ... Если вы не возражаете, напишите свой ответ, и я поставлю его как ответ на этот пост :)   -  person Jona    schedule 09.06.2011
comment
Хотя это не совсем ответ. Так что ничего страшного.   -  person Marc B    schedule 09.06.2011
comment
Марк, по какой-то причине 0,028 секунды кажутся мне слишком длинными в моих тестах. Который состоит в том, чтобы подсчитать общее количество кадров, умноженное на 28 мс. Кажется, это не соответствует декодеру игроков... ну, это может быть другая проблема...   -  person Jona    schedule 09.06.2011
comment
Итак, я считаю, что 0,028 - это не длина кадра... Я думаю, что это 0,026. Не могли бы вы подтвердить?   -  person Jona    schedule 09.06.2011


Ответы (1)


Продолжительность звукового кадра MPEG зависит от частоты дискретизации и количества выборок на кадр. Формула:

frameTimeMs = (1000/SamplingRate) * SamplesPerFrame

В вашем случае это будет

frameTimeMs = (1000/44100) * 1152

Что дает ~ 26 мс на кадр. Для другой частоты дискретизации вы получите другую продолжительность. Суть в том, что звук MPEG всегда представляет фиксированное количество выборок на кадр, но продолжительность каждой выборки зависит от частоты выборки.

person Scott    schedule 15.06.2011
comment
Замечательно! Спасибо за Ваш ответ! Даже в тесте это имеет смысл, как вы выяснили эту конкретную формулу? - person Jona; 16.06.2011
comment
Ну, частота дискретизации — это количество выборок в секунду. Период обратно пропорционален частоте (T = 1/f), поэтому каждый образец имеет период 1/44100 секунды. Как только вы узнаете продолжительность сэмпла, вы просто умножаете его на количество сэмплов в кадре. - person Scott; 16.06.2011
comment
А как насчет каналов, переносимых одним кадром? То есть, если мы используем 2 канала (стерео), разве не должно быть frameTimeMMs = (1000/44100)*(1152*2)? Чем больше каналов в кадре, тем дольше, верно? - person rasgo; 28.05.2014
comment
Нет, потому что каждый канал происходит одновременно. Чтобы быть строго точным, я мог бы сказать SamplesPerChannelPerFrame выше. - person Scott; 28.05.2014
comment
Я почти уверен, что это 1024, а не 1000. См. /AACTrackImpl.java#L144" rel="nofollow noreferrer">github.com/sannies/mp4parser/blob/ - person basin; 04.03.2015
comment
@basin Связанный код вычисляет количество пакетов AAC в секунду на основе AAC, имеющего 1024 выборки на пакет (кадр). 1000 выше - это количество миллисекунд в секунде. - person Scott; 05.03.2015