Формат AVI файла - bitrate

Тема в разделе "WASM.ZEN", создана пользователем perez, 9 мар 2006.

  1. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Формат хорошо описан в 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, но получаются неверные данные. Не учитывается компрессия или еще чего-то. Короче, прошу помощи разобраться. Спасибо за ответы.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    А разделить размер потока на его длительность не пробовал?
     
  3. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Пробовал =) А еще складывать логарифм извлекать.
     
  4. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Не получается нужное число. Если ты имеешь ввиду dwLength, то это число общее кадров. Где взять размер потока в байтах?



    Поля структуры в моем случае:

    dwLength= 96929

    dwQuality= 10000

    dwRate= 10000000

    swScale=399999

    dwSuggestBuffer= 83793



    остальное нули
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Разве что пройтись по всему потоку и сложить размеры всех его кадров. Во всяком случае какая-то прога входящая в состав K Lite Codec pack так и делает.
     
  6. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Вот это я и не хотел услышать :dntknw:(

    Но все равно спасибо. Буду парсить гигабайты..
     
  7. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Если есть индекс, можно размеры взять оттуда.
     
  8. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    "Разве что пройтись по всему потоку и сложить размеры всех его кадров" - так я и сделал:


    Код (Text):
    1. long num1, num2;
    2. char buffer[1024*50];
    3. DWORD total= 0;
    4. for(int i= 1; i< inf.dwLength; i++){
    5.     AVIStreamRead(AviStream, i, 1, buffer, 1024*50, &num1, &num2);
    6.     total+= num1;
    7.     //printf("i= %d\n", i);
    8. }
    9. printf("total= %d\n", total / time / 1024 * 8);




    но это не решение. Работает ОЧЕНЬ долго.

    У меня есть программка, которая bitrate вычисляет мгновенно. Должен быть другой способ (я не имею ввиду парсить файл вручную :) ).
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    примерное значение =dwSuggestBuffer*dwRate/swScale

    А если хочешь более точное, то считай для нескольких кадров. Только учти ключивые кадры могут встречаться раз несколько секунд =dwSampleSize*dwRate/swScale
     
  10. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Нашел быстрый способ переборки:



    AVIStreamRead



    If lpBuffer is NULL, this function does not read any data; it returns information about the size of data that would be read.
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Так прикрепи ее - если можно реверснуть, алгоритм вытащится...
     
  12. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Сорри, забыл...

    У меня есть программка, которая bitrate вычисляет мгновенно
     
  13. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Ну дык пропарсить поток можно и вручную, не используя AVIStreamRead, что будет работать быстрее. К тому же не обязательно парсить весь файл, можно посчитать по маленькому куску. Вот тебе и получиться мгновенное вычисление.
     
  14. 6arrep

    6arrep New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    92
    Адрес:
    London
    У меня есть программка, которая bitrate вычисляет мгновенно.

    дык открой дебагером и срисуй

    Должен быть другой способ

    дык меняй сколько влезет а принцип оставь
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    6arrep

    Поднял тему, чтобы нафлудить?
     
  16. 6arrep

    6arrep New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2006
    Сообщения:
    92
    Адрес:
    London


    ой дату непосмотрел. ну всё молчу, молчу ,...
     
  17. Alien

    Alien New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2007
    Сообщения:
    1
    AVI файл начинается:

    Код (Text):
    1. 'RIFF' FileSize ...
    Затем идёт :

    Код (Text):
    1. typedef struct _avimainheader {
    2.     FOURCC fcc;
    3.     DWORD  cb;
    4.     DWORD  dwMicroSecPerFrame;
    5.     DWORD  dwMaxBytesPerSec;
    6.     DWORD  dwPaddingGranularity;
    7.     DWORD  dwFlags;
    8.     DWORD  dwTotalFrames;
    9.     DWORD  dwInitialFrames;
    10.     DWORD  dwStreams;
    11.     DWORD  dwSuggestedBufferSize;
    12.     DWORD  dwWidth;
    13.     DWORD  dwHeight;
    14.     DWORD  dwReserved[4];
    15. } AVIMAINHEADER;
    В аудиопотоке есть:
    Код (Text):
    1. typedef struct {
    2.   WORD  wFormatTag;
    3.   WORD  nChannels;
    4.   DWORD nSamplesPerSec;
    5.   DWORD nAvgBytesPerSec;
    6.   WORD  nBlockAlign;
    7.   WORD  wBitsPerSample;
    8.   WORD  cbSize;
    9. } WAVEFORMATEX;
    10.  
    11.  
    12.  
    13. Duration=(dwTotalFrames/1000000.0)*dwMicroSecPerFrame);  //Длительность видео
    14. VideoBitrate=(FileSize/Duration-nAvgBytesPerSec)/1024*8; // Kbit/sec
    15. AudioBitrate=nAvgBytesPerSe*8/1024;                      // Kbit/sec