Войти
ПрограммированиеФорумЗвук

Ogg Vorbis. Как узнать размер трека?

Advanced: Тема повышенной сложности или важная.

#0
23:58, 23 авг. 2012

Загружаю .ogg. Полностью, одним куском.
Нужно узнать размер этого куска, с ним непонятно:

FileStream.Size - возвращает правильный размер в байтах,
                          но буфер оказывается слишком малым, при воспроизведении обрывается на позиции меньше середины.
ov_raw_total    - тоже самое.
vf.end_v          - тоже самое.
ov_pcm_total  -  в справке не понятно что это.

И ещё, можно ли вычислить размер буфера зная TWaveFormatEx и длину файла в секундах?


#1
9:09, 24 авг. 2012

Хаус
Как раз ov_pcm_total и дает эту информацию (хотя и неявно): это общее кол-во сэмплов в потоке для одного канала.
Т.е. если ты знаешь размер сэмпла и число каналов в аудио, то размер распакованных данных можно вычислить вот так:

toalSizeBytes = numChannels * (sampleSizeBits >> 3) * ov_pcm_total

PS
Что касается длительности, то она тоже завязана на эти параметры, только еще с учетом частоты дискретизации

durationSec = (float)ov_pcm_total / sampleRate

#2
12:12, 24 авг. 2012

>(sampleSizeBits >> 3)
Сдвиги для деления\умножения чисел не нужны. Компилятор сам заменит умножение\деление на константу сдвигом, если эта константа - степень двойки.

#3
1:31, 25 авг. 2012

alex-r

Спасибо, помог!

А возможно ли узнать длину трека зная его размер (GetFileSize) и формат?

#4
11:16, 25 авг. 2012

>А возможно ли узнать длину трека зная его размер (GetFileSize) и формат?
Нет, там переменный битрейт вроде.

#5
23:05, 25 авг. 2012

Хаус
> А возможно ли узнать длину трека зная его размер (GetFileSize) и формат?
Скорее всего, нет. Во-первых битрейт переменный, а во-вторых неизвестно, сколько реальных медиа-данных в файле (внутри контейнера есть еще служебные данные).

ПрограммированиеФорумЗвук

Тема в архиве.