Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

AVIStreamRead - проблемы   Найти похожие ветки 

 
Ozone ©   (2004-10-11 09:36) [0]

Есть такая сабжевая ф-ия - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_avistreamread.asp

Хочу буфер в файл сохранить:


AVIStreamRead(AudioStream, 0, AVISTREAMREAD_CONVENIENT, nil, cbBuffer, plBytes, plSamples);

if AVIStreamRead(AudioStream, 0, 0, lpBuffer, cbBuffer, plBytes, plSamples) = 0 then begin
 GetMem(lpBuffer, cbBuffer);
 AssignFile(f, "C:\temp.bin");
 ReWrite(f);
 BlockWrite(f,lpBuffer, cbBuffer);  // Здесь I/O error 1784
 CloseFile(f);
 FreeMem(lpBuffer, cbBuffer);
end;


Где я ошибся?


 
Ozone ©   (2004-10-11 09:37) [1]

косяк...

if AVIStreamRead(AudioStream, 0, plSamples^, lpBuffer, cbBuffer, plBytes, plSamples) = 0 then begin


 
Ozone ©   (2004-10-11 09:39) [2]

еще косяк...


GetMem(lpBuffer, cbBuffer); - до 2-го вызова


 
MBo ©   (2004-10-11 09:41) [3]

BlockWrite(f,lpBuffer^, cbBuffer);
(у тебя, правда, не указан тип буфера)


 
MBo ©   (2004-10-11 09:44) [4]

нужно первый вызов AVIStreamRead сделать с nil вместо lpBuffer,
потом выделить память, и тогда уже считывать данные!


 
Ozone ©   (2004-10-11 10:04) [5]

По просьбе привожу всё:



TAVIReader = class(TPersistent)
   private
      VideoStream : IAVISTREAM;

      AVIFile     : IAVIFILE;
      AVIFrame    : IGetFrame;

      AVIInfo     : TAVIStreamInfo;

      fFileName   : string;

   public
      AudioStream : IAVISTREAM;  
      Frames: array of PBITMAPINFOHEADER;
      FCount      : cardinal;
     
      constructor Create; virtual;
      destructor Destroy; override;

      function OpenFile(const FileName: string): boolean;
      procedure GetFrames;

      procedure Close;
   end;

function TAVIReader.OpenFile(const FileName: string): boolean;
var
  iResult: integer;
begin
    Result := false;
    Close;

    AVIFileInit;

    FillChar(AVIInfo,SizeOf(AVIInfo),0);

    iResult := AVIFileOpen(AVIFile, pchar(FileName), OF_READ + OF_SHARE_DENY_WRITE, nil);
    if iResult <> AVIERR_OK then begin
       raise Exception.Create("Cannot open AVI file " + Filename);
       exit;
    end;

    iResult := AVIFileGetStream(AVIFile, VideoStream, streamtypeVideo, 0);
    if iResult <> AVIERR_OK then begin
       raise Exception.Create("Cannot open video stream for that file");
       exit;
    end;

    iResult := AVIFileGetStream(AVIFile, AudioStream, streamtypeAUDIO, 0);
    if iResult <> AVIERR_OK then begin
       raise Exception.Create("Cannot open audio stream for that file");
       exit;
    end;

    iResult := AVIStreamInfo(VideoStream, AVIInfo, Sizeof(AVIInfo));
    if iResult <> AVIERR_OK then begin
       raise Exception.Create("Cannot read stream info");
       exit;
    end;

    AVIFrame := AVIStreamGetFrameOpen(VideoStream, nil);

    if not Assigned(AVIFrame) then begin
      raise Exception.Create("Cannot find suitable decompressor");
      exit;
    end;

    FCount := AVIInfo.dwLength;

    Result := true;
end;

constructor TAVIReader.Create;
begin
    inherited Create;
    AVIFile := nil;
    VideoStream := nil;
    AudioStream := nil;
    AVIFrame := nil;

    AVIFileInit;
end;

destructor TAVIReader.Destroy;
begin
    Close;
    inherited Destroy;
end;

// собственно вызов

var
  AviFile: TAVIReader;
  lStart          : LONG;
  lSamples        : LONG;
  lpBuffer        : PVOID;
  cbBuffer        : LONG;
  plBytes         : PLONG;
  plSamples       : PLONG;
  f: file;
begin
    AviFile := TAVIReader.Create;
    try
       AviFile.OpenFile("test.avi");
       lpBuffer := nil;
       AVIStreamRead(AviFile.AudioStream, 0, AVISTREAMREAD_CONVENIENT, nil, cbBuffer, plBytes, plSamples);
       GetMem(lpBuffer, cbBuffer);
       if AVIStreamRead(AviFile.AudioStream, 0, AVISTREAMREAD_CONVENIENT, lpBuffer, cbBuffer, plBytes, plSamples) = 0 then begin

         AssignFile(f, "C:\temp.bin");
         ReWrite(f);
         BlockWrite(f,lpBuffer^, cbBuffer);
         CloseFile(f);

         FreeMem(lpBuffer, cbBuffer);

         ShowMessage("END");
       end;
    finally
      AviFile.Free;
    end;




Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.16 c
14-1099398731
False_Delirium
2004-11-02 15:32
2004.11.21
Вакансия! Разработчик игр.


1-1099465145
Layner
2004-11-03 09:59
2004.11.21
Как секции в TMainMenu программно отобразить в TPopupMenu?


1-1099788577
Роман
2004-11-07 03:49
2004.11.21
Автозагрузка файла


3-1098888232
Maverick
2004-10-27 18:43
2004.11.21
ламерский вопрос про TSQLQuery


1-1099576713
Змей
2004-11-04 16:58
2004.11.21
пустой ли edit1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский