Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Утилита конвертации bmp to avi

20K
30 апреля 2007 года
Emil777
13 / / 10.01.2007
Если не трудно прокоментируйте данный код, буду очень признателен
Если объясните как из этого можно собрать готовый проект. Разбираться в этом сомому трудновато, а очень хочется разобраться в данном коде.
Заранее благодарен!
Код:
const
  // AVISaveOptions Dialog box flags
  ICMF_CHOOSE_KEYFRAME = 1;
  ICMF_CHOOSE_DATARATE = 2;
  ICMF_CHOOSE_PREVIEW = 4;
  ICMF_CHOOSE_ALLCOMPRESSORS = 8;

  // can handle the input format
  // or input data
  AVIIF_KEYFRAME = 10;

type

  AVI_COMPRESS_OPTIONS = packed record
    fccType: DWORD; // stream type, for consistency
    fccHandler: DWORD; // compressor
    dwKeyFrameEvery: DWORD; // keyframe rate
    dwQuality: DWORD; // compress quality 0-10,000
    dwBytesPerSecond: DWORD; // bytes per second
    dwFlags: DWORD; // flags... see below
    lpFormat: DWORD; // save format
    cbFormat: DWORD;
    lpParms: DWORD; // compressor options
    cbParms: DWORD;
    dwInterleaveEvery: DWORD; // for non-video streams only
  end;

  AVI_STREAM_INFO = packed record
    fccType: DWORD;
    fccHandler: DWORD;
    dwFlags: DWORD;
    dwCaps: DWORD;
    wPriority: word;
    wLanguage: word;
    dwScale: DWORD;
    dwRate: DWORD;
    dwStart: DWORD;
    dwLength: DWORD;
    dwInitialFrames: DWORD;
    dwSuggestedBufferSize: DWORD;
    dwQuality: DWORD;
    dwSampleSize: DWORD;
    rcFrame: TRect;
    dwEditCount: DWORD;
    dwFormatChangeCount: DWORD;
    szName: array[0..63] of char;
  end;

  BITMAPINFOHEADER = packed record
    biSize: DWORD;
    biWidth: DWORD;
    biHeight: DWORD;
    biPlanes: word;
    biBitCount: word;
    biCompression: DWORD;
    biSizeImage: DWORD;
    biXPelsPerMeter: DWORD;
    biYPelsPerMeter: DWORD;
    biClrUsed: DWORD;
    biClrImportant: DWORD;
  end;

  BITMAPFILEHEADER = packed record
    bfType: word; //"magic cookie" - must be "BM"
    bfSize: integer;
    bfReserved1: word;
    bfReserved2: word;
    bfOffBits: integer;
  end;

  // DLL External declarations

function AVISaveOptions(Hwnd: DWORD; uiFlags: DWORD; nStreams: DWORD;
  pPavi: Pointer; plpOptions: Pointer): boolean;
  stdcall; external 'avifil32.dll';

function AVIFileCreateStream(pFile: DWORD; pPavi: Pointer; pSi: Pointer): integer;
  stdcall; external 'avifil32.dll';

function AVIFileOpen(pPfile: Pointer; szFile: PChar; uMode: DWORD;
  clSid: DWORD): integer;
  stdcall; external 'avifil32.dll';
 
function AVIMakeCompressedStream(psCompressed: Pointer; psSource: DWORD;
  lpOptions: Pointer; pclsidHandler: DWORD): integer;
  stdcall; external 'avifil32.dll';
 
function AVIStreamSetFormat(pAvi: DWORD; lPos: DWORD; lpGormat: Pointer;
  cbFormat: DWORD): integer;
  stdcall; external 'avifil32.dll';
 
function AVIStreamWrite(pAvi: DWORD; lStart: DWORD; lSamples: DWORD;
  lBuffer: Pointer; cBuffer: DWORD; dwFlags: DWORD;
  plSampWritten: DWORD; plBytesWritten: DWORD): integer;
  stdcall; external 'avifil32.dll';
 
function AVISaveOptionsFree(nStreams: DWORD; ppOptions: Pointer): integer;
  stdcall; external 'avifil32.dll';

function AVIFileRelease(pFile: DWORD): integer; stdcall; external 'avifil32.dll';
 
procedure AVIFileInit; stdcall; external 'avifil32.dll';
 
procedure AVIFileExit; stdcall; external 'avifil32.dll';
 
function AVIStreamRelease(pAvi: DWORD): integer; stdcall; external 'avifil32.dll';
 
function mmioStringToFOURCCA(sz: PChar; uFlags: DWORD): integer;
  stdcall; external 'winmm.dll';
 
// ======================================================================== ====
// Main Function to Create AVI file from BMP file listing
// ======================================================================== ====

procedure CreateAVI(const FileName: string; IList: TStrings;
  FramesPerSec: integer = 10);
var
  Opts: AVI_COMPRESS_OPTIONS;
  pOpts: Pointer;
  pFile, ps, psCompressed: DWORD;
  strhdr: AVI_STREAM_INFO;
  i: integer;
  BFile: file;
  m_Bih: BITMAPINFOHEADER;
  m_Bfh: BITMAPFILEHEADER;
  m_MemBits: packed array of byte;
  m_MemBitMapInfo: packed array of byte;
begin
  DeleteFile(FileName);
  Fillchar(Opts, SizeOf(Opts), 0);
  FillChar(strhdr, SizeOf(strhdr), 0);
  Opts.fccHandler := 541215044; // Full frames Uncompressed
  AVIFileInit;
  pfile := 0;
  pOpts := @Opts;

  if AVIFileOpen(@pFile, PChar(FileName), OF_WRITE or OF_CREATE, 0) = 0 then
  begin
    // Determine Bitmap Properties from file item[0] in list
    AssignFile(BFile, IList[0]);
    {$I-}
    Reset(BFile, 1);
    if IOresult = 0 then
     try
       BlockRead(BFile, m_Bfh, SizeOf(m_Bfh));
       BlockRead(BFile, m_Bih, SizeOf(m_Bih));
       SetLength(m_MemBitMapInfo, m_bfh.bfOffBits - 14);
       SetLength(m_MemBits, m_Bih.biSizeImage);
       Seek(BFile, SizeOf(m_Bfh));
       BlockRead(BFile, m_MemBitMapInfo[0], length(m_MemBitMapInfo));
     finally
       CloseFile(BFile);
     end;
    {$I+}

    strhdr.fccType := mmioStringToFOURCCA('vids', 0); // stream type video
    strhdr.fccHandler := 0; // def AVI handler
    strhdr.dwScale := 1;
    strhdr.dwRate := FramesPerSec; // fps 1 to 30
    strhdr.dwSuggestedBufferSize := m_Bih.biSizeImage; // size of 1 frame
    SetRect(strhdr.rcFrame, 0, 0, m_Bih.biWidth, m_Bih.biHeight);

    if AVIFileCreateStream(pFile, @ps, @strhdr) = 0 then
    begin
      // if you want user selection options then call following line
      // (but seems to only like "Full frames Uncompressed option)

      // AVISaveOptions(Application.Handle,
      //                ICMF_CHOOSE_KEYFRAME or ICMF_CHOOSE_DATARATE,
      //                1,@ps,@pOpts);
      // AVISaveOptionsFree(1,@pOpts);

      if AVIMakeCompressedStream(@psCompressed, ps, @opts, 0) = 0 then
      begin
        if AVIStreamSetFormat(psCompressed, 0, @m_memBitmapInfo[0],
          length(m_MemBitMapInfo)) = 0 then
        begin

          for i := 0 to IList.Count - 1 do
          begin
            AssignFile(BFile, IList);
            {$I-}
            Reset(BFile, 1);
            if IOresult = 0 then
             try
               Seek(BFile, m_bfh.bfOffBits);
               BlockRead(BFile, m_MemBits[0], m_Bih.biSizeImage);
               Seek(BFile, SizeOf(m_Bfh));
               BlockRead(BFile, m_MemBitMapInfo[0], length(m_MemBitMapInfo));
             finally
               CloseFile(BFile);
             end;
            {$I+}

            if AVIStreamWrite(psCompressed, i, 1, @m_MemBits[0],
              m_Bih.biSizeImage, AVIIF_KEYFRAME, 0, 0) <> 0 then
            begin
              ShowMessage('Error during Write AVI File');
              break;
            end;
          end;
        end;
      end;
    end;

    AVIStreamRelease(ps);
    AVIStreamRelease(psCompressed);
    AVIFileRelease(pFile);
  end;

  AVIFileExit;
  m_MemBitMapInfo := nil;
  m_memBits := nil;
end;

И вот еще один исходник, который вызывает ряд вопросов
http://www.fastgraph.com/help/avimake_delphi.html
При компиля ции выдает ошибку в этом месте
 
Код:
procedure SwitchBuffers;
begin
  fg_vbclose; <-тут
 fg_vbfree(hVB);<-тут
  hVB := fg_vballoc(cxBuffer,cyBuffer);<-тут
  fg_vbopen(hVB);<-тут
  fg_vbcolors;<-и тут
end;

Буду признателен любой информации. Я не сильно давно занимаюсь программированием, но и конечно не полный ламо, просто по этой теме инфы на русском не сильно много, перерыл много всяких сайтов и нашел только это и то без каких либо коментариев к коду.Так что имеется куча вопросов.:confused::(
257
04 мая 2007 года
kosfiz
1.6K / / 18.09.2005
по поводу первого кода могу сказать, что тебе проще всего это оформить в модуль(в приложенном архиве, мог напортачить что-нить так что не обессудь) и потом подключать его к своему проекту и вызывать CreateAVI. по второму могу сказать, что у тебя по-видимому нет модуля с данными функциями. кстати они относятся к FastGraph, чтобы узнать что это такое используй гугл.
20K
05 мая 2007 года
Emil777
13 / / 10.01.2007
Код:
Procedure FillList(List: TStrings);
Const
  BmpFilesFolder = 'f:\bmp\';
Var
  SearchRec: TSearchRec;
Begin
 if FindFirst(BmpFilesFolder + '*.bmp', faAnyFile-faDirectory, SearchRec) = 0 then
  try
    List.Add(BmpFilesFolder + SearchRec.Name);
    While FindNext(SearchRec) = 0 Do List.Add(BmpFilesFolder + SearchRec.Name);
  finally
    FindClose(SearchRec);
  end;
End;

procedure TForm1.Button1Click(Sender: TObject);
Const
  aviFile = 'c:\Save.avi';
Var
  List: TStrings;
begin
  List := TStringList.Create;
  try
    FillList(List);
    if List.Count > 0 then
      Begin
        [COLOR="Red"]CreateAVI(aviFile,List,5);[/COLOR]
        if FileExists(aviFile) then
         [COLOR="#ff0000"] ShellExecute(Handle,'open',PChar(aviFile),nil,nil,SW_SHOWNORMAL);[/COLOR]
      End
    else
      ShowMessage('Файлы отсутвуют.');
  finally
    List.Free;
  end;
end;

Что в этом коде делаю не так, в выделенных местах вылазят ошибки.
Заранее благодарю за ответ.
Спасибо за прошлый ответ.
257
06 мая 2007 года
kosfiz
1.6K / / 18.09.2005
в модуле я поставил в один из параметров CreateAVI вместо TStrings TStringList, так что
 
Код:
List: TStringList;

потом ты подключил shellapi? а то ведь используешь ShellExecute. если ошибки продолжают появляться, то напиши что за ошибки. еще у тебя в параметрах ShellExecute стоит Handle, он определен?
20K
06 мая 2007 года
Emil777
13 / / 10.01.2007
Вот такая ошибка вываливается:
Not enough actual parametrs
В этом месте:
 
Код:
CreateAVI(aviFile,FillList,5);

Может можно еще каким нибудь способом собрать это все.
Заранее благодарен!
257
06 мая 2007 года
kosfiz
1.6K / / 18.09.2005
кинь проект сюда(приложи в архиве), а то у меня что-то все нормал отрабатывает.
20K
06 мая 2007 года
Emil777
13 / / 10.01.2007
[ATTACH]1808[/ATTACH]Вот Проект!
257
06 мая 2007 года
kosfiz
1.6K / / 18.09.2005
блин просмотрел у тебя же FillList процедура, а ты её как параметр используешь - в этом и есть ошибка. в архиве подправленный проект.
20K
06 мая 2007 года
Emil777
13 / / 10.01.2007
Большое спасибо, все классно работает!
Вот только качество файла который выходит оставляет желать лучшего.
Вроде сделал и прогу, которая скрины чуть ли не каждую милисекунду делает, а все равно как бы через кадр проскакивает и файлы просто гигантские полуучаются и при размере больше 2гиг файл уже не открывается!
Незнаешь как можно решить проблему?
29K
17 мая 2007 года
Alex The Madman
4 / / 17.05.2007
Открывай Yandex и пиши "Video For Windows" или "VFW" - и куча статей на эту тему.
36K
31 января 2008 года
GArt1984
1 / / 31.01.2008
Господа, прошу прошения конечно, но возникло 2 вопроса:
вместо BMP использовать сразу JPEG без конвертации возможно?
сразу задать настройки кодека, которым авишка будет сжиматься, не вызвая диалог выбора?(почему-то кажется, что нельзя.. но всётаки?)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог