главная продукты downloads форум тех. поддержка

 

Главная страница
 

  www.bousoft.com

   главная страница
   новости СМИ
   ссылки
   о проекте
   добавить в Избранное
   сделать стартовой
 

   наши разработки

   shareware
   freeware
   регистрация
 

справка и FAQ   

   статьи
   книги
   FAQ: WinForms
   FAQ: GDI+
   MS Office
   web-технологии
   wap-технологии
 

   программирование

   visual basic: ActiveX
   visual basic: примеры
   .net framework
   c++
   delphi
   rapidQ
 

   наши компакт-диски

   диск BouSoft #3
   диск Windows PE

Работа с файлами формата 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. Полную версию программы, описанной в данной статье, можно скачать здесь.

 

   Перевод и редактура: Буторкин Сергей  Источник: http://www.shrinkwrapvb.com

 

e-mail:

 

bousoft@mail.ru