|
Работа с файлами формата
AVI.
Часть 2. Работа с
потоками в существующем AVI-файле.
AVI-файлы
состоят из потоков, которые, в свою очередь, образованы отдельными
блоками данных ("колодами"). Существую 4 типа потоков, объявленных в
файле mAVIDecs.bas:
'Stream types for use in
VB (translated from C macros)
Global Const streamtypeVIDEO As Long =
1935960438 '= mmioStringToFOURCC("vids",
0&)
Global Const streamtypeAUDIO As Long =
1935963489 '= mmioStringToFOURCC("auds",
0&)
Global Const streamtypeMIDI As Long =
1935960429 '= mmioStringToFOURCC("mids",
0&)
Global Const streamtypeTEXT As Long =
1937012852 '= mmioStringToFOURCC("txts",
0&)
В теории, каждый
AVI-файл может содержать несколько потоков
одного типа. Однако на практике многие плейеры поддерживают только
один видео- и один аудио-поток для каждого файла. Первый шаг в
использовании потоков AVI-файла состоит в
получении указателя на существующий поток
pAViStream. В предыдущей статье мы
получили указатель на весь файл - pAVIFile.
Теперь необходимо вызвать функцию
AVIFileGetStream, передав ей указатель на файл и тип потока,
который нам необходим. Во-первых, объявим новую переменную типа
LONG, в которой будет храниться указатель
на поток:
Dim pAVIStream As Long
'указатель на поток
AVI-файла
Теперь добавим следующие
строки кода сразу после вызова функции
AVIFileOpen в той программе, которая была создана в прошлой
статье:
'Получаем первый доступный видео-поток
res = AVIFileGetStream(pAVIFile,
pAVIStream, streamtypeVIDEO, 0)
If res <> AVIERR_OK Then GoTo ErrorOut |
Когда произойдет вызов
функции AVIGetFileStream, переменная
pAVIStream будет содержать указатель на
соответствующий поток, который затем можно передавать в другие
функции. Обратите внимание, что после завершения работы с потоком Вы
должны обязательно освободить его, используя функцию
AVIStreamRelease. Добавьте этот вызов
после метки ErrorOut:
If pAVIStream <> 0 Then
Call AVIStreamRelease(pAVIStream)
'//закрываем видео
поток
End If |
Теперь у нас есть
указатель на поток, поэтому можно получить первый кадр потока и
общую его длину добавлением нескольких строк кода. Прежде всего,
объявите две новых переменные:
Dim numFrames As Long
'число кадров в видео потоке
Dim firstFrame
As Long 'позиция
первого кадра потока |
А затем добавьте эти
строчки сразу после вызова AVIFileGetStream:
'получить начальную
позицию потока (некоторые потоки начинаются не одновременно)
firstFrame = AVIStreamStart(pAVIStream)
If firstFrame = -1 Then GoTo ErrorOut
'ошибка
'получить длину
потока в кадрах
numFrames =
AVIStreamLength(pAVIStream)
If numFrames = -1 Then GoTo ErrorOut
'ошибка |
Давайте сделаем с помощью
нашей программы что-нибудь более интересное, например, выведем
полученные результаты на экран. Также мы распечатаем содержимое
структур AVI_FILE_INFO и
AVI_STREAM_INFO в отладочном окне
VB, и проинформируем об этом пользователя
соответствующим сообщением. Добавьте эти строки кода для получения
сообщения:
MsgBox "PAVISTREAM handle is " & pAVIStream & vbCrLf & _
"Video stream length - " & numFrames & vbCrLf & _
"Stream starts on frame #" & firstFrame & vbCrLf & _
"File and Stream info will be written to Immediate Window (from
IDE - Ctrl+G to view)", vbInformation, App.title
|
Вы можете вызывать
функции AVIFileInfo и
AVIStreamInfo для получения информации об открытых файле и
потоке. Во время работы в среде разработки VB
вы также можете использовать окно "Немедленно" для
вывода этой информации. Это очень удобно, так как вы сразу, в
процессе разработки, видите, открыт ли файл корректно и какие
значения возвращают API-функции при
вызове. Для примера я включил несколько таких сервисных функций в
файл mAVIDecs.bas. Вы можете вызывать эти
функции, предварительно объявив две переменные для сохранения
информации:
Dim fileInfo As
AVI_FILE_INFO 'структура
информации о файле
Dim streamInfo As AVI_STREAM_INFO
'структура информации о
потоке |
И теперь добавьте
следующие строки сразу после вызова MsgBox:
'заполнить структуру
информации о файле
res = AVIFileInfo(pAVIFile, fileInfo, Len(fileInfo))
If res <> AVIERR_OK Then GoTo ErrorOut
'распечатать
информацию о файле в окне отладки
Call DebugPrintAVIFileInfo(fileInfo)
'заполнить
структуру информации о потоке
res = AVIStreamInfo(pAVIStream, streamInfo, Len(streamInfo))
If res <> AVIERR_OK Then GoTo ErrorOut
'распечатать
информацию о потоке в отладочном окне
Call DebugPrintAVIStreamInfo(streamInfo) |
Если вы правильно
скопировали весь приведенный в этой статье код, то вы получили
вполне работоспособную программу, которая может открывать любой файл
и получать указатель на его видео-поток. Также она отображает длину
потока в кадрах и выводит множество другой информации в отладочном
окне среды разработки VB. Полную версию
программы, описанной в данной статье, можно скачать
здесь.
|