Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Как программно разложить AVI на картинки и обратно


Автор: Albinos_x 8.12.2004, 21:21
Как программно разложить AVI файл на картинки и потом собрать его обратно???

smile Заранее благодарю за помощь!!!! smile

Автор: Camelot 11.12.2004, 04:48
Да.. вопрос то глобальный.. интересный очень... наверное как то с использованием функций библиотек кодеком.. типа divX.dll или чё нить на подобии... хз.. но очень интересно... smile

Автор: Snowy 14.12.2004, 13:41
На Torry есть компонент TAviWriter (AviWrite.zip)
Из TBitMap'ов собирает AVI и добавляет звуковую дорожку.
Использует стандартную библиотеку avifil32.dll.
Код

 procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInit';
 procedure AVIFileExit; stdcall; external 'avifil32.dll' name 'AVIFileExit';
 function AVIFileOpen; external 'avifil32.dll' name 'AVIFileOpenA';
 function AVIFileCreateStream; external 'avifil32.dll' name 'AVIFileCreateStreamA';
 function AVIStreamSetFormat; external 'avifil32.dll' name 'AVIStreamSetFormat';
 function AVIStreamReadFormat; external 'avifil32.dll' name 'AVIStreamReadFormat';
 function AVIStreamWrite; external 'avifil32.dll' name 'AVIStreamWrite';
 function AVIStreamRelease; external 'avifil32.dll' name 'AVIStreamRelease';
 function AVIFileRelease; external 'avifil32.dll' name 'AVIFileRelease';
 function AVIFileGetStream; external 'avifil32.dll' name 'AVIFileGetStream';
 function CreateEditableStream; external 'avifil32.dll' name 'CreateEditableStream';
 function AVISaveV; external 'avifil32.dll' name 'AVISaveV';

Автор: Albinos_x 14.12.2004, 17:36
А если, без компонента?

Использовать приведённые функции...
Где можно найти описание этих функций?

Автор: bear 15.12.2004, 07:41
 Держи функцию разкладывае ави на фреймы
Код

uses vfw;
function ExtractFrames(avifn: string; ToFileName: TFileName) : Boolean;
var   Error: Integer;  
pFile: PAVIFile;   
AVIStream: PAVIStream;   
gapgf: PGETFRAME;   
lpbi: PBITMAPINFOHEADER;   
bits: PChar; hBmp: HBITMAP; 
AviInfo: TAVIFILEINFOW; 
sError: string; TmpBmp: TBitmap; 
DC_Handle: HDC; fr1, fr2, fr : integer; 
s : string;
begin 
Result := False; AVIFileInit; 
Error := AVIFileOpen(pFile, PChar(avifn), 0, nil);
 if Error <> 0 then begin   AVIFileExit;   
case Error of     
AVIERR_BADFORMAT: sError := 'The file couldnot be read';     
AVIERR_MEMORY: sError := 'The file could not be opened because of insufficient memory.';       
AVIERR_FILEREAD: sError := 'A disk error occurred while reading the file.';       
AVIERR_FILEOPEN: sError := 'A disk error occurred while opening the file.';   
end;     
ShowMessage(sError);   Exit;   
end; 
if AVIFileInfo(pFile, @AVIINFO, SizeOf(AVIINFO)) <> AVIERR_OK then 
begin   AVIFileRelease(pFile);   AVIFileExit;   Exit; end; 
Error := AVIFileGetStream(pFile, AVIStream, streamtypeVIDEO, 0); 
if Error <> AVIERR_OK then begin   AVIFileRelease(pFile);   
AVIFileExit;   Exit; end; 
gapgf := AVIStreamGetFrameOpen(AVIStream, nil); 
if gapgf = nil then begin   AVIStreamRelease(AVIStream);  
AVIFileRelease(pFile);   
AVIFileExit;   Exit; end; 
fr1 := AVIStreamStart(AVIStream); 
fr2 := AVIStreamEnd(AVIStream); 
for fr := fr1 to fr2 do begin   
lpbi := AVIStreamGetFrame(gapgf, fr);   
if lpbi = nil then   begin     AVIStreamGetFrameClose(gapgf);     
AVIStreamRelease(AVIStream);     AVIFileRelease(pFile);     
AVIFileExit;     Exit;   end;   
TmpBmp := TBitmap.Create;   
try TmpBmp.Height := lpbi.biHeight;     
TmpBmp.Width  := lpbi.biWidth;     
bits := Pointer(Integer(lpbi) + SizeOf(TBITMAPINFOHEADER));     
DC_Handle := CreateDC('Display', nil, nil, nil);     
try       hBmp := CreateDIBitmap(DC_Handle,       lpbi^,       CBM_INIT,       bits,       PBITMAPINFO(lpbi)^,       DIB_RGB_COLORS);    
 finally       
DeleteDC(DC_Handle);     end;     
TmpBmp.Handle := hBmp;    
 try       s := IntToStr(fr);      
 while Length(s)<6 do s := '0'+s;       TmpBmp.SaveToFile(ToFileName + s + '.bmp');
Result := True;     except     end;   
finally     TmpBmp.Free;   end; 
end; AVIStreamGetFrameClose(gapgf); 
AVIStreamRelease(AVIStream); 
AVIFileRelease(pfile); AVIFileExit;
end; 

Автор: Albinos_x 15.12.2004, 10:37
Можно по-подробней.
указанного uses vfw у меня нет (может я не так чё делаю);
При попытке использовать библиотеку avifil32.dll Делфя тоже выдаёт ошибку...

Автор: Snowy 15.12.2004, 16:57
avifil32.dll есть в WinXP. В 9x не гарантирую... Проверь наличие этого файла в %WINDIR%\System(32)
Вот, посмотри линк:
http://softs.h10.ru/literature.shtml?topic=directx&book=1&page=6.htm
Заодно и проблема мац решится.

Автор: Albinos_x 15.12.2004, 21:35
Цитата
Проверь наличие этого файла в %WINDIR%\System(32)


там-то есть.
Ссылочка тоже очень полезная, но там опять же ссылаются на модуль vfw, которого у меня нет. Может подскажешь где его можно скачать? (Или хотя бы текст этого модуля)

Автор: Snowy 16.12.2004, 16:35
Я спросил у Яндекса....
Вобщем что такое vfw.pas
vfw.h - это заголовочный файл из комплекта DirectX SDK для работы с avifil32.dll.
vfw.pas соответственно конвертированая версия для Delphi.
Если найдешь SDK, получишь vfw.h, а его можешь конвертировать с помощью утилитки конвертирования заголовочных файлов.
Вот пара ссылок, где можно взять vfw.pas
ftp://delphi-jedi.org/api/vfw.zip
http://www.vr-online.ru/download.php?det=20

Автор: Albinos_x 16.12.2004, 20:09
Спасибо! Нашёл!...

Автор: Mirlen 16.8.2007, 16:45
обе ссылки на vfw.pas ,битые.
помогите найте этот модуль

Автор: Snowy 16.8.2007, 17:55
http://www.koders.com/delphi/fidF901E0AEC29ECBF67266B86173AA1121B5BB4430.aspx

Автор: Mirlen 18.8.2007, 01:14
при выполнении кода, предложенного bear, перед послденим end'ом вылетает ошибка EAccessViolation.
все функции библиотек работают хорошо. не знаю в чем дело.

в ходе работы программы все кадры сохраняются нормально, покуда не доходит дело до завершения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)