AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wave-Datei schneiden?
Thema durchsuchen
Ansicht
Themen-Optionen

Wave-Datei schneiden?

Ein Thema von mlspider · begonnen am 6. Dez 2006 · letzter Beitrag vom 9. Dez 2006
Antwort Antwort
mlspider

Registriert seit: 22. Okt 2003
Ort: Berlin
661 Beiträge
 
Delphi 7 Enterprise
 
#1

Wave-Datei schneiden?

  Alt 6. Dez 2006, 11:32
Ich möchte vor einer Konvertierung nach MP3 die ersten 20 Sekunden aus einer 4 Minuten lage Wav-Datei wegschneiden. In diesem Teil der Wav-Datei befindet sich nur Stille. Nur habe ich überhaupt keine Idee, wie man dies umsetzen könnte.
Mario
Handbücher haben einen hohen Heizwert!!!

http://geprellte-ebay-kaeufer.de
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: Wave-Datei schneiden?

  Alt 6. Dez 2006, 19:07
Nen Wave-Editor verwenden, gibts haufenweise...
Manche MP3 Konvertierungsprogramme bieten auch die Möglichkeit, Stille automatisch zu entfernen.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Wave-Datei schneiden?

  Alt 6. Dez 2006, 20:45
Hallo mlspider,

schau dir doch mal mp3trim an.

Gruss
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Wave-Datei schneiden?

  Alt 8. Dez 2006, 17:29
Eventuell kann dir ne Klasse von mir dabei zur Hand gehen. Damit hast du zumindest schonmal die Wavedaten von den Strukturinformationen getrennt, und in Arrays vorliegen. Wie viele Samples davon 4sec ergeben, ergäbe sich dann aus den Strukturinfos (Samplingrate, Mono/Stereo, Auflösung).
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
mlspider

Registriert seit: 22. Okt 2003
Ort: Berlin
661 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Wave-Datei schneiden?

  Alt 8. Dez 2006, 17:32
@dizzy,

ich lese also mit Deinem Coder den Header aus. Weiter komme ich nicht mehr mit.
Mario
Handbücher haben einen hohen Heizwert!!!

http://geprellte-ebay-kaeufer.de
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Wave-Datei schneiden?

  Alt 9. Dez 2006, 06:19
Die Klasse TWaveProvider liest auch die eigentlichen Audiodaten ein, und packt sie in je ein Array pro Kanal (Links/Rechts). Anhand der Samplerate (TWaveProvider.Samplerate) kannst du nun errechnen, wie viele Werte du von den Arrays vorn wegschneiden musst, um auf vier Sekunden zu kommen. 44.1kHz Samplerate hast du also 44100 Werte pro Sekunde.

Ich habe hier auch noch Code rumliegen, der eine valide Wave Datei schreiben kann, was du ja denke ich auch machen müsstest.
Delphi-Quellcode:
  TRIFFHeader = packed record
    id : array[0..3] of Char;
    length: DWORD;
    waveId: array[0..3] of Char;
  end;

  TWaveFormatChunk = packed record
    id : array[0..3] of Char;
    length : DWORD;
    FormatTag : WORD; // Format category
    Channels : WORD; // Number of channels
    SamplesPerSec : DWORD; // Sampling rate
    AvgBytesPerSec: DWORD; // For buffer estimation
    BlockAlign : WORD; // Data block size
    BitsPerSample : WORD;
  end;

  TDataHeader = packed record
    id : array[0..3] of Char;
    length: DWORD;
  end;

implementation

procedure TForm1.SaveWave(FileName: String);
var
  Header : TRIFFHeader;
  Fmt : TWaveFormatChunk;
  Data : TDataHeader;
  WaveOut : TFileStream;
  WaveLength: Integer;
  DeinArrayMitWavedaten: array of SmallInt;
begin
  WaveOut := TFileStream.Create(FileName, fmCreate);
  WaveLength := Length(DeinArrayMitWavedaten);

  Header.id := 'RIFF';
  Header.length := 4 {Length(Header.waveId)} + WaveLength + SizeOf(TWaveFormatChunk)+ SizeOf(TDataHeader);
  Header.waveId := 'WAVE';

  Fmt.id := 'fmt ';
  Fmt.length := SizeOf(TWaveFormatChunk)-8;
  Fmt.FormatTag := $0001; // WAVE_FORMAT_PCM
  Fmt.Channels := 2;
  Fmt.SamplesPerSec := 44100;
  Fmt.AvgBytesPerSec:= 176400; // Samplerate*Channels*(BitsPerSample/8)
  Fmt.BlockAlign := 4;
  Fmt.BitsPerSample := 16;

  Data.id := 'data';
  Data.length := WaveLength;

  WaveOut.Write(Header, SizeOf(TRIFFHeader));
  WaveOut.Write(Fmt, SizeOf(TWaveFormatChunk));
  WaveOut.Write(Data, SizeOf(TDataHeader));
  WaveOut.Write(DeinArrayMitWavedaten, WaveLength);
  
  WaveOut.Free;
end;
Das habe ich fix aus einem anderen Projekt zusammen kopiert, in dem die einzelnen Schritte etwas verteilter durchgeführt wurden. Ich hoffe, dass das funktionieren kann - zumindest aber sollte es das Prinzip zeigen . Mit etwas Schreiberei ließe sich das Speichern auch in TWaveProvider einbauen, ich hab das nur nicht getan, da ich bislang kein Bedarf dafür hatte.

Die Funktion oben schreibt nun immer ein 16 Bit Stereo Wave mit 44.1kHz Samplerate (CD-Standard). Worauf du bei Stereo unbedingt achten musst: Die Sampledaten für linken und rechten Kanal müssen abwechselnd geschrieben werden, beginnend mit dem linken. Das ist nun leider insofern etwas dumm, als dass TWaveProvider 2 Arrays mit den aufgetrennten Kanälen lieftert. Diese müsste man also zunächst wieder miteinander verschränken .

Was hinten raus kommen sollte, ist ein handelsübliches Wave File, dass eigntlich alle Programme die Waves lesen können, verarbeiten können sollte, da hier nur die einfachste und ursprüngliche Form eines Waves geschrieben wird, ohne großen Schnickschnack. (RIFF-Wave ist, wie auch AVI z.B. ein Containerformat, mit dem man allerhand Zeug anstellen könnte. So gibts z.B. auch die Möglichkeit mp3 in Wave zu verpacken, oder programmspezifische Informationen. Nix dergleichen hier )


\Edits: Optimierungen am Code
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz