{{notification.text}}

MirGames

14.01.07 22:20
0
Привет всем.
Может на этом форуме ктонибудь подскажет.
Пытаюсь уже всю неделю понять как работать с Avi форматом.
Нашол в интернете библиотеку для работы называеться vfw, которая работает с AVICAP.DLL и т.д.
Вот следуший готовый код на Delphi
Код

function SaveCallback(nPercent: Int): Bool; pascal;
var
  abort: Boolean;
begin
  Application.ProcessMessages;
  Form1.Progressbar1.Position := nPercent;
  if abort = True then
    Result := True
  else
    Result := False;
end;

procedure TForm1.GetAviInfo(Path: String; SaveTo: String);
procedure CorruptedVideoFile;
begin
  ShowMessage('FileCorrupted');
end;
var
  AviFile: IAVIFile;
  AviInfo: TAVIFileInfo;
  Steams: array [0..3] of IAVISTREAM;
  i: Integer;
  AviCopressOptions: PAVICOMPRESSOPTIONS;
  error: Integer;
  AviSteamInfo: TAVIStreamInfoW;
begin
  if not FileExists(Path) then Exit;
  AVIFileInit;
  
  AVIFileOpen(AviFile,PChar(path),0,nil);
  AVIFileInfo(AviFile,AviInfo,sizeof(AviInfo));
  with AviInfo, InfoList.Lines do
  begin
    Add('MaxBytesPerSec = '+#9+#9+#9+IntToStr(dwMaxBytesPerSec));
    Add('Flags = '+#9+#9+#9+#9+IntToStr(dwFlags));
    Add('Caps = '+#9+#9+#9+#9+IntToStr(dwCaps));
    Add('Streams = '+#9+#9+#9+IntToStr(dwStreams));
    Add('SuggestedBufferSize = '+#9+#9+IntToStr(dwSuggestedBufferSize));
    Add('Width = '+#9+#9+#9+#9+IntToStr(dwWidth));
    Add('Height = '+#9+#9+#9+#9+IntToStr(dwHeight));
    Add('Scale = '+#9+#9+#9+#9+IntToStr(dwScale));
    Add('Rate = '+#9+#9+#9+#9+IntToStr(dwRate));
    Add('Length = '+#9+#9+#9+#9+IntToStr(dwLength));
    Add('EditCount = '+#9+#9+#9+IntToStr(dwEditCount));
    Add('MaxBytesPerSec = '+#9+#9+#9+IntToStr(dwMaxBytesPerSec));
  end;
  if AVIFileGetStream(AviFile,Steams[0],streamtypeVIDEO,0)<>0 then
  begin
    CorruptedVideoFile;
    exit;
  end;
  if AVIFileGetStream(AviFile,Steams[1],streamtypeAUDIO,0)<>0 then
  begin
    CorruptedVideoFile;
    exit;
  end;
  Steams[1].Info(AviSteamInfo,sizeof(AviSteamInfo));
  with AviSteamInfo, InfoList.Lines do
  begin
    Add('Type = '+#9+#9+#9+IntToStr(fccType));
    Add('Handler = '+#9+#9+#9+IntToStr(fccHandler));
    Add('Flags = '+#9+#9+#9+#9+IntToStr(dwFlags));
    Add('Caps = '+#9+#9+#9+#9+IntToStr(dwCaps));
    Add('SuggestedBufferSize = '+#9+#9+IntToStr(dwSuggestedBufferSize));
    Add('Scale = '+#9+#9+#9+#9+IntToStr(dwScale));
    Add('Rate = '+#9+#9+#9+#9+IntToStr(dwRate));
    Add('Length = '+#9+#9+#9+#9+IntToStr(dwLength));
    Add('EditCount = '+#9+#9+#9+IntToStr(dwEditCount));
  end;


  error:= AVISaveV(PChar(SaveTo),nil,@SaveCallback,2,Steams[0],PAVICOMPRESSOPTIONS(nil^));
  if error<>0 then
  begin
    ShowMessage(IntToHex(error,100));
    CorruptedVideoFile;
    exit;
  end;

  AviFileExit;
end;

который делает самую просту операцию:
1.получает информацию
2.Сохраняет копию в другой файл
Очень странно но, этот код работает только с файлами малого размера, если пропустить файл например 700mb то получаеться ошибка AVIERR_FILEREAD , но если например 50mb то все нормально работает. Посли некоторых тестов я понял что все файлы которые имеют так называемые в одной програме, вхождения или фрагменты >0 неполучаеться перегнать.
Изучал формат avi но так и непонял как там деляться на вхождения :ninja: ?
Если кому нужна библиотека то вот приклепляю.
Заранье спасибо тому кто даст любую инфу.
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}