Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.036 c
4-1097414017
Ralf
2004-10-10 17:13
2004.11.21
Как выключить монитор


1-1099749674
Pavia
2004-11-06 17:01
2004.11.21
Редактор мат формул.


9-1088556762
Xerx
2004-06-30 04:52
2004.11.21
Принцип построения теней


4-1097576029
drew
2004-10-12 14:13
2004.11.21
Здраствуйте, подскажите как можно программно заблокировать WinXP


3-1098533331
sloug
2004-10-23 16:08
2004.11.21
DBRichEdit текст





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский