Главная страница
    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.037 c
14-1099707837
Fktrc
2004-11-06 05:23
2004.11.21
Консольные утилиты


14-1098581802
Думкин
2004-10-24 05:36
2004.11.21
С днем рождения! 24 октября


1-1099764695
MUHAMOR
2004-11-06 21:11
2004.11.21
AstonShell


3-1098390777
Zif
2004-10-22 00:32
2004.11.21
Использование компонента типа TBitmap (не DB) для работы с БД


14-1099773802
Homa_Programer
2004-11-06 23:43
2004.11.21
кладовка...





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