Формат хорошо описан в MSDN. Все понятно. Но мне нужно получить bitrate видео и аудио потоков. То есть количество бит в секунду. Рассматривая структуру typedef struct { FOURCC fccType; FOURCC fccHandler; DWORD dwFlags; DWORD dwPriority; DWORD dwInitialFrames; DWORD dwScale; DWORD dwRate; DWORD dwStart; DWORD dwLength; DWORD dwSuggestedBufferSize; DWORD dwQuality; DWORD dwSampleSize; RECT rcFrame; } AVIStreamHeader; , я не вижу здесь информации, с помощью которой можно получить этот злосчастный bitrate. Как его получить? Пробовал умножать размер картинки на FPS, но получаются неверные данные. Не учитывается компрессия или еще чего-то. Короче, прошу помощи разобраться. Спасибо за ответы.
Не получается нужное число. Если ты имеешь ввиду dwLength, то это число общее кадров. Где взять размер потока в байтах? Поля структуры в моем случае: dwLength= 96929 dwQuality= 10000 dwRate= 10000000 swScale=399999 dwSuggestBuffer= 83793 остальное нули
Разве что пройтись по всему потоку и сложить размеры всех его кадров. Во всяком случае какая-то прога входящая в состав K Lite Codec pack так и делает.
"Разве что пройтись по всему потоку и сложить размеры всех его кадров" - так я и сделал: Код (Text): long num1, num2; char buffer[1024*50]; DWORD total= 0; for(int i= 1; i< inf.dwLength; i++){ AVIStreamRead(AviStream, i, 1, buffer, 1024*50, &num1, &num2); total+= num1; //printf("i= %d\n", i); } printf("total= %d\n", total / time / 1024 * 8); но это не решение. Работает ОЧЕНЬ долго. У меня есть программка, которая bitrate вычисляет мгновенно. Должен быть другой способ (я не имею ввиду парсить файл вручную ).
примерное значение =dwSuggestBuffer*dwRate/swScale А если хочешь более точное, то считай для нескольких кадров. Только учти ключивые кадры могут встречаться раз несколько секунд =dwSampleSize*dwRate/swScale
Нашел быстрый способ переборки: AVIStreamRead If lpBuffer is NULL, this function does not read any data; it returns information about the size of data that would be read.
Ну дык пропарсить поток можно и вручную, не используя AVIStreamRead, что будет работать быстрее. К тому же не обязательно парсить весь файл, можно посчитать по маленькому куску. Вот тебе и получиться мгновенное вычисление.
У меня есть программка, которая bitrate вычисляет мгновенно. дык открой дебагером и срисуй Должен быть другой способ дык меняй сколько влезет а принцип оставь
AVI файл начинается: Код (Text): 'RIFF' FileSize ... Затем идёт : Код (Text): typedef struct _avimainheader { FOURCC fcc; DWORD cb; DWORD dwMicroSecPerFrame; DWORD dwMaxBytesPerSec; DWORD dwPaddingGranularity; DWORD dwFlags; DWORD dwTotalFrames; DWORD dwInitialFrames; DWORD dwStreams; DWORD dwSuggestedBufferSize; DWORD dwWidth; DWORD dwHeight; DWORD dwReserved[4]; } AVIMAINHEADER; В аудиопотоке есть: Код (Text): typedef struct { WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize; } WAVEFORMATEX; Duration=(dwTotalFrames/1000000.0)*dwMicroSecPerFrame); //Длительность видео VideoBitrate=(FileSize/Duration-nAvgBytesPerSec)/1024*8; // Kbit/sec AudioBitrate=nAvgBytesPerSe*8/1024; // Kbit/sec