Поделиться через


Размещение в потоках

[Функция, связанная с этой страницей, функции и макросы AVIFile, является устаревшей функцией. Он был заменён на средство чтения источника . средство чтения источников оптимизировано для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал Source Reader вместо функций и макросов AVIFile, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

AVIFile предоставляет несколько способов поиска и перемещения в положение в потоке данных. Функции и макросы в этом разделе позволяют приложению находить начальную позицию, длину и ключевые кадры (содержащие полное изображение в примере) в потоке. Функции и макросы также связывают время с позициями в потоке путем вычисления истекшего времени, необходимого для воспроизведения потока с начала до любой точки в потоке.

Поиск начальной позиции

Вы можете получить выборку первого кадра в видеопотоке с помощью функции AVIStreamStart. (Кадры фильма могут начинаться с примера 0 или 1 в зависимости от предпочтений автора.) Эти сведения также можно получить с помощью функции AVIStreamInfo. Эта функция сохраняет номер образца в элементе dwStart dwStart структуры AVISTREAMINFO. Вы можете получить время начала первого примера потока с помощью макроса AVIStreamStartTime.

Длину потока можно получить с помощью функции AVIStreamLength. Эта функция возвращает количество примеров в потоке. Эти сведения также можно получить с помощью функции AVIStreamInfo. Эта функция сохраняет длину потока в элементе dwLength структуры AVISTREAMINFO. Чтобы получить длину потока в миллисекундах, используйте макрос AVIStreamLengthTime.

В видеопотоке каждый пример обычно соответствует кадру видео. Однако могут быть примеры, для которых отсутствуют данные видео. Если вызвать функцию AVIStreamRead, указывающую одну из этих позиций, она возвращает длину данных в 0 байтов. Примеры, содержащие данные, можно найти с помощью функции AVIStreamFindSample и указания флага FIND_ANY.

В аудиопотоке каждый образец соответствует одному блоку данных звука. Например, если звуковые данные имеют формат 22 кГц ADPCM (адаптивная модуляция разностного импульсного кода), каждый пример для 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будет ссылаться один образец.