Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как экстрагировать аудиодорожку из AVI файла

Delphi , Мультимедиа , Видео



Автор: http://www.swissdelphicenter.ch

uses
  {...}, vfw;

var
  abort: Boolean;

{$R *.DFM}

  {Vielen Dank an Jailbird, der einen groЯen Teil dieses Codes entwickelt hat
   Special thanks to Jailbird, who developed a big part of this Code}

  {Bitte zuerst die vfw.pas downloaden
   Please download th vfw.pas first }

  {Die 'SaveCallback' Funktion erlaubt es dem Benutzer den
   aktuellen Prozess Status zu erfahren und den Speichervorgang
   vorzeitig abzubrechen. Diese Funktion muss NICHT vom Benutzer
   aufgerufen werden.

   The 'SaveCallback' function allows the user to get the
   process status and abort the save progress. This function
   needn't to call by the user.}

function SaveCallback(nPercent: Int): Bool; pascal;
begin
  Application.ProcessMessages;

  Form1.Progressbar1.Position := nPercent; //Speicher Status in Prozent
  //Save Status in Percent
  if abort = True then
    Result := True
      //Wenn die Funktion "True" zurьckgibt, wird der Speichervorgang fortgesetzt.
  else //If then function returns "True", the Process will continue
    Result := False; //Gibt sie "False" zurьck wird der Vorgang abgebrochen
end; //If it returns "False" the process will abort

{Die folgende Funktion erwartet zwei Parameter:  

 Inputfile: PChar  
  Geben Sie hier die die AVI Datei an aus welche Sie  
  die Audiospur extrahieren mцchten.  

 Outputfile: PChar  
  Geben Sie einen Pfad + Dateinamen einer WAVE Datei an.  
  In diese Datei wird die AudioSpur gespeichert.  

  HINWEIS:  
  Geben Sie nur eine WAVE Datei als Ausgabedatei an wenn  
  die Audiodaten in der AVI Datei unkomprimiert (als PCM WAVE)  
  vorliegen.  

 ####################################################  

 The following function needs two parameters:  

 InputFile: PChar  
  Enter a Dir + Filename of a AVI File.  

 OutputFile: PChar  
  Enter a Dir + Filename of a WAVE File where do you want to  
  put the audiodata of the movie.  

  TIP:  
  Enter jus a Filename of a WAVE File if the audiodata of the  
  movie is in uncompressed PCM Format.  

 ###########################################################  

 WICHTIG:  
  Stellen Sie vor dem aufrufen der Funktion 'ExtractAVISound' sicher  
  das die Eingabedatei (Inputfile) ьber eine AudioSpur verfьgt.  

 IMPORTANT:  
  Before calling the 'ExtractAVISound' function be sure that the  
  Inputfile has a audiotrace.  
 } 

function TForm1.ExtractAVISound(InputFile, Outputfile: PChar): Boolean;
var
  PFile: IAviFile;
  PAvi: IAviStream;
  plpOptions: PAviCompressOptions;
begin
  Abort := False;

  if Fileexists(StrPas(Outputfile)) then
  begin
    case MessageDlg('Ausgabedatei existiert bereits. Ьberschreiben?',
      mtWarning, [mbYes, mbNo], 0) of
      mrYes:
        begin
          DeleteFile(StrPas(Outputfile));
          //Wichtig, da die Funktion sonst nur so viel der
        end; //Datei ьberschreibt wie gebraucht wird.
      //Important because the function overwrite just
      //the part of the file which is needed.
      mrNo:
        begin
          Exit;
        end;
    end;
  end;

  try //Initialisiert die API
    AviFileInit; //Init the API
    if AviFileOpen(PFile, Inputfile, 0, nil) <> 0 then //Цffnet eine AVI Datei
    begin //Opens a AVI File
      MessageDlg('Fehler beim laden des Videos. Mцglicherweise wird die 
        Datei von einem anderen Prozess verwendet.' + #13#10+
       'SchlieЯen Sie alle in Frage kommenden Anwendungen und versuchen Sie es erneut.',
        mtError, [mbOK], 0);
      Result := False;
      Exit;
    end;
    if AviFileGetStream(PFile, PAvi, StreamTypeAudio, 0) <> 0 then
    begin
      MessageDlg(
        'Fehler beim laden des AudioStreams. Bitte ьberprьfen Sie, ob dieses Video 
        ьber einen AudioStream verfьgt.', mtError, [mbOK], 0);
      AviFileExit;
      Result := False;
      Exit;
    end;
    //Speichert den AudioStream
    //Saves the AudioStream
    if AviSaveV(Outputfile, nil, @SaveCallback, 1, PAvi, plpOptions) <> 0 then
    begin
      MessageDlg('Fehler beim Speichern des AudioStreams oder Sie haben 
        den Speichervorgang abgebrochen.', mtError, [mbOK], 0);
      AviStreamRelease(PAvi);
      AviFileExit;
      Result := False;
      Exit;
    end;
  finally
    AviStreamRelease(PAvi);
    AviFileExit;
  end;
  Result := True; //'TRUE' zurьckgeben wenn alles geklappt hat
  //return 'TRUE' if all right
end;

//Beispiel zu aufrufen der Funktion:
//Example how to call the function:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ExtractAVISound(PChar('D:\test.avi'), PChar('D:\test.wav')) = True then
    ShowMessage('Audiospur erfolgreich gespeichert!');
  // Audio sucessfully saved
else
  ShowMessage('Fehler beim Speichern der Audiospur.'); // Error while saving...
end;

Программа на Delphi, которая извлекает аудиострим из файла AVI и сохраняет его в файл WAV. Вот шаг за шагом, как она работает:

  1. Функция ExtractAVISound принимает два параметра: InputFile (путь к файлу AVI) и Outputfile (путь к файлу WAV).
  2. Она инициализирует API AviFile с помощью AviFileInit.
  3. Она открывает входной файл AVI с помощью AviFileOpen. Если это не удается, она отображает сообщение об ошибке и возвращает False.
  4. Она получает аудиострим из файла AVI с помощью AviFileGetStream.
  5. Она сохраняет аудиострим в выходной файл WAV с помощью AviSaveV. Эта функция вызывает callback-функцию (SaveCallback) для отчета о прогрессе и позволяя пользователю прервать процесс сохранения.

Функция SaveCallback вызывается периодически во время процесса сохранения, позволяя программе обновлять UI с информацией о прогрессе. Если пользователь выбирает прервать процесс сохранения, она возвращает True, что вызывает функцию AviSaveV для прекращения раннего.

Чтобы использовать это код, вы создаете форму с кнопкой и прикрепляете обработчик события Button1Click к событию OnClick кнопки. Когда кнопка нажата, программа вызывает функцию ExtractAVISound с желаемыми путями ввода и вывода файлов. Если извлечение успешно, она отображает сообщение об успехе; в противном случае, она отображает сообщение об ошибке.

Вот некоторые потенциальные проблемы с этим кодом:

  1. Функция AviFileInit должна вызываться только один раз за выполнение программы. Возможно, что это код будет не работать, если он вызывается несколько раз.
  2. Функция AviFileOpen возвращает файловый.handle, который не используется в этом коде. Если возникает ошибка при открытии файла, программа может рухнуть или поведаться неожиданно.
  3. Функции AviStreamRelease и AviFileExit должны вызываться для освобождения системных ресурсов после завершения работы с API AviFile.
  4. Код не обрабатывает исключения должным образом. Он использует блок try-finally, чтобы обеспечить освобождение API AviFile, но может не поймать все возможные ошибки.

Чтобы улучшить этот код, вы могли бы рассмотреть использование механизмов обработки ошибок, таких как блока try-catch или обработчики исключений, для ловли и отчета ошибках более надежно. Вы также могли бы добавить дополнительную функциональность,such as progress bars or status messages, для обеспечения лучшего пользовательского опыта.

Содержание статьи описывает, как извлечь аудиодорожку из файла AVI с помощью программирования на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Видео ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 17:03:39/0.0036370754241943/0