Позиционирование в потоках
AVIFile предоставляет несколько способов поиска и перемещения в положение в потоке данных. Функции и макросы в этом разделе позволяют приложению находить начальную позицию, длину и ключевые кадры (содержащие полное изображение в примере) в потоке. Функции и макросы также связывают время с позициями в потоке, вычисляя затраченное время, необходимое для воспроизведения потока от его начала до любой точки в потоке.
Поиск начальной позиции
Номер выборки первого кадра в видеопотоке можно получить с помощью функции AVIStreamStart . (Кадры фильма могут начинаться с образца 0 или 1 в зависимости от предпочтений автора.) Эти сведения также можно получить с помощью функции AVIStreamInfo . Эта функция сохраняет номер выборки в элементе dwStart структуры AVISTREAMINFO . Вы можете получить время начала первого примера потока с помощью макроса AVIStreamStartTime .
Длину потока можно получить с помощью функции AVIStreamLength . Эта функция возвращает количество выборок в потоке. Эти сведения также можно получить с помощью функции AVIStreamInfo . Эта функция сохраняет длину потока в элементе dwLength структуры AVISTREAMINFO . Чтобы получить длину потока в миллисекундах, используйте макрос AVIStreamLengthTime .
В видеопотоке каждый пример обычно соответствует кадру видео. Однако могут быть примеры, для которых нет видеоданных. При вызове функции AVIStreamRead , указывающей одну из этих позиций, она возвращает длину данных в 0 байт. Примеры, содержащие данные, можно найти с помощью функции AVIStreamFindSample и указания флага FIND_ANY.
В аудиопотоке каждый пример соответствует одному блоку звуковых данных. Например, если звуковые данные имеют формат ADPCM (адаптивная дифференциальная импульсная модуляция) 22 кГц, то каждая выборка для AVIStreamLength соответствует блоку из 256 байт сжатых звуковых данных. Этот блок звуковых данных содержит около 500 примеров звука при несжатой обработке. Однако функции и макросы AVIFile обрабатывают каждый 256-байтовый блок как один пример.
Примечание
Допустимые позиции в диапазоне потока от начала до конца потока, который представляет собой сумму начальной точки потока и его длину. Позиция, представленная суммой начальной позиции и длиной, соответствует времени после отрисовки последних данных; он не содержит никаких данных. Номер образца, представляющий конец потока, можно получить с помощью макроса AVIStreamEnd . Значение времени в миллисекундах, представляющее конец потока, можно получить с помощью макроса AVIStreamEndTime .
Поиск примера и ключевых кадров
Вы можете искать различные типы примеров в потоке с помощью функции AVIStreamFindSample . Эта функция выполняет поиск в обратном или обратном направлении через поток выборки соответствующего типа, начиная с указанного номера выборки. Вы можете искать различные типы примеров в потоке, указав флаг в последовательности вызовов AVIStreamFindSample . Укажите флаг FIND_ANY, чтобы найти непустые примеры или пропустить примеры, в которые отсутствуют данные. Укажите флаг FIND_KEY для поиска ключевых кадров, содержащих данные для отрисовки полного изображения без ссылки на предыдущие кадры. Укажите флаг FIND_FORMAT для поиска изменений в формате. AVIStreamFindSample используется в основном с видеопотоками.
Некоторые макросы, использующие функции AVIFile, дополняют функции поиска потоков. В следующем списке представлено краткое описание каждого макроса. Макросы, выполняющие поиск определенной позиции или типа данных, требуют указания начального расположения в потоке.
Макрос | Описание |
---|---|
AVIStreamIsKeyFrame | Указывает, является ли выборка в указанном потоке ключевым кадром. |
AVIStreamNearestKeyFrame | Находит ключевой кадр в заданной позиции в потоке или перед ней. |
AVIStreamNearestKeyFrameTime | Определяет время, соответствующее началу ключевого кадра, ближайшего (в или предшествующего) заданному времени в потоке. |
AVIStreamNearestSample | Находит ближайшую непустую выборку в заданной позиции в потоке или перед ней. |
AVIStreamNearestSampleTime | Определяет время, соответствующее началу выборки, ближайшей к заданному времени в потоке. |
AVIStreamNextKeyFrame | Находит следующий ключевой кадр после указанной позиции в потоке. |
AVIStreamNextKeyFrameTime | Возвращает время следующего ключевого кадра в потоке, начиная с заданного времени. |
AVIStreamNextSample | Находит следующий непустой пример из указанной позиции в потоке. |
AVIStreamNextSampleTime | Возвращает время изменения образца к следующему образцу в потоке. |
AVIStreamPrevKeyFrame | Находит ключевой кадр, предшествующий указанной позиции в потоке. |
AVIStreamPrevKeyFrameTime | Возвращает время предыдущего ключевого кадра в потоке, начиная с заданного времени. |
AVIStreamPrevSample | Находит непустую выборку, предшествующую указанной позиции в потоке. |
AVIStreamPrevSampleTime | Определяет время, в течение которого предыдущая выборка заменяет своего предшественника в потоке. |
AVIStreamSampleToSample | Возвращает образец в потоке, который происходит в то же время, что и выборка, которая происходит во втором потоке. |
Переключение между примерами и временем
Вы можете определить прошедшее время от начала потока до образца с помощью функции AVIStreamSampleToTime . Эта функция преобразует число выборки в значение времени, выраженное в миллисекундах. Для видеокадра (который занимает несколько миллисекунд) это значение представляет время начала воспроизведения образца с момента начала воспроизведения и предполагает, что видеоклип воспроизводится с нормальной скоростью. Для примера звука (который содержит несколько выборок в миллисекунды) значение времени соответствует времени, в которое образец начинает воспроизводиться, и предполагает, что аудиопоток воспроизводится с нормальной скоростью.
И наоборот, можно найти номер выборки, связанный со значением времени, с помощью функции AVIStreamTimeToSample . Эта функция преобразует значение миллисекунды в число выборки и предполагает, что видеоклип воспроизводится с нормальной скоростью.
Так как AVIStreamSampleToTime возвращает время начала воспроизведения кадра, связь между AVIStreamSampleToTime и AVIStreamTimeToSample не является действительно обратной. Они определяют положение в файле более точно, чем время. Например, два последовательных примера звука могут воспроизводиться в одной миллисекундах. Использование AVIStreamSampleToTime для преобразования выборок чисел приведет к идентичным значениям времени. При преобразовании значения времени обратно в число выборки с помощью AVIStreamTimeToSample будет указана одна выборка.