suche wav to mp3 konvertierung
Verfasst: 09.11.2006 15:40
Hallo ist es möglich in pure auch wav to mp3 konvertierung zu realisieren?
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Wenn man LAME einbindet wird es sogar sehr gut.24dan hat geschrieben:Hallo ist es möglich in pure auch wav to mp3 konvertierung zu realisieren?
Code: Alles auswählen
;- Beispiel für die Nutzung der lame_enc.dll zur Erzeugung von MP3-Dateien aus Wave-Dateien
;- Die Wave-Datei muss folgendes Format haben: 44100 Hertz, Stereo, 16 Bits per Sample
;- Diese PB-Datei, die Test.wav und die lame_enc.dll müssen im selben Verzeichnis liegen
;- "Helle" Klaus Helbing, 18.11.2006, PB v4.01
;- Um Zeitaufwand und Festplatten-Stress zu minimieren wird die komplette Wave-Datei
;- ins RAM geladen und die MP3-Datei erst als Ganzes auf Festplatte gespeichert
Global DLL_ID.l ;für die lame_enc.dll
Global Samples.l
Global BufferSize.l
Global StreamHandle.l
Global FilelaengeWav.l
Global OutputBytes.l
Global FileWav$ = "Test.wav" ;oder sonstwie
Global FileMP3$ = "Test.mp3"
Global Version$
Global TempWord.w
Global TempByte.b
Global Dim BufferInf.b(511) ;reichlich Luft
Global *PointerInf = @BufferInf()
Global Dim Einstellungen.l(83) ;eigentlich 331 Bytes
Global *PointerEinst = @Einstellungen()
StartTime = ElapsedMilliseconds()
DLL_ID = OpenLibrary(#PB_Any, "lame_enc.dll")
;--------
If ExamineLibraryFunctions(DLL_ID)
;-------- Versionsdaten einlesen -----------------------------------------------------------
CallFunction(DLL_ID,"beVersion", *PointerInf) ;das Ergebnis der Abfrage in BufferInf schreiben
Version$ = "Lame Interface Version : "
TempByte = PeekB(*PointerInf)
Version$ = Version$ + Str(TempByte) + "."
TempByte = PeekB(*PointerInf + 1)
Version$ = Version$ + Str(TempByte) + #CRLF$ + "Lame Engine Version : "
TempByte = PeekB(*PointerInf + 2)
Version$ = Version$ + Str(TempByte) + "."
TempByte = PeekB(*PointerInf + 3)
Version$ = Version$ + Str(TempByte) + #CRLF$ + "Vom : "
TempByte = PeekB(*PointerInf + 4)
Version$ = Version$ + Str(TempByte) + "."
TempByte = PeekB(*PointerInf + 5)
Version$ = Version$ + Str(TempByte) + "."
TempWord = PeekW(*PointerInf + 6) ;das Jahr ist Word!
Version$ = Version$ + Str(TempWord) + #CRLF$ + "URL : "
Version$ = Version$ + PeekS(*PointerInf + 8)
;----------------------------------------------------------------------------------------
Else
MessageRequester("Fehler!", "Die Lame-Datei kann nicht verwendet werden!")
End
EndIf
If OpenFile(0, FileWav$)
FilelaengeWav = Lof(0) - 44 ;die 44 Bytes des Wave-Headers überspringen
*BufferWav = AllocateMemory(FilelaengeWav + 44)
If *BufferWav = 0
MessageRequester("Fehler!", "Die Wave-Datei kann nicht in einem Rutsch verarbeitet werden!")
End
EndIf
FileSeek(0, 44)
ReadFile(0, FileWav$)
ReadData(0, *BufferWav, FilelaengeWav)
Else
MessageRequester("Fehler!", "Die Wave-Datei kann nicht gefunden werden!")
End
EndIf
If OpenFile(1, FileMP3$)
Else
MessageRequester("Fehler!", "Die MP3-Datei kann nicht angelegt werden!")
End
EndIf
;-------- "Struktur" füllen, -1 = False ------------------------------------------------------
PokeL(*PointerEinst, 256) ;Config = 256 (BE_CONFIG_LAME) für aktuelle Version
PokeL(*PointerEinst + 4, 1) ;StructVersion = 1 für aktuelle Version
PokeL(*PointerEinst + 8, 331) ;StructSize = 331 diese "Struktur" ist 331 Bytes gross
PokeL(*PointerEinst + 12, 44100) ;SampleRate in Hertz
PokeL(*PointerEinst + 16, 0) ;ReSampleRate 0 = Auto
PokeL(*PointerEinst + 20, 1) ;Mode 1 = BE_MP3_MODE_JSTEREO
PokeL(*PointerEinst + 24, 128) ;Bitrate
PokeL(*PointerEinst + 28, 0) ;MaxBitrate nur für VBR, wird für CBR ignoriert
PokeL(*PointerEinst + 32, 2) ;Preset High-Quality
PokeL(*PointerEinst + 36, -1) ;Copyright kein
PokeL(*PointerEinst + 40, -1) ;CRC nicht
PokeL(*PointerEinst + 44, 0) ;Original ja
PokeL(*PointerEinst + 48, -1) ;Private nein
PokeL(*PointerEinst + 52, -1) ;VbrMethod keine
PokeL(*PointerEinst + 56, -1) ;WriteVBRHeader nein
PokeL(*PointerEinst + 60, -1) ;Enable VBR nein
PokeL(*PointerEinst + 64, 0) ;VBRQuality Null wäre höchste Qualität
PokeL(*PointerEinst + 68, 64000) ;VbrAbr_bps Muster ohne Wert, nur für VBR
PokeL(*PointerEinst + 72, 0) ;NoBitRes Bit-Reservoir nein
PokeL(*PointerEinst + 76, $fd02) ;Quality 2 High-Byte = NOT Low-Byte
;---------------------------------------------------------------------------------------------
If CallFunction(DLL_ID, "beInitStream", *PointerEinst, @Samples, @BufferSize, @StreamHandle) = 0
*BufferMP3 = AllocateMemory((FilelaengeWav / 2) / ((BufferSize / Samples) - 1))
If *BufferMP3 = 0
MessageRequester("Fehler!", "Die Wave-Datei kann nicht in einem Rutsch verarbeitet werden!")
End
EndIf
Else
MessageRequester("Fehler!", "Irgendwas ist faul!")
End
EndIf
CallFunction(DLL_ID, "beEncodeChunk", StreamHandle, FilelaengeWav / 2, *BufferWav, *BufferMP3, @OutputBytes)
OutputBytesGes = OutputBytes
CallFunction(DLL_ID, "beDeinitStream", StreamHandle, *BufferMP3, @OutputBytes)
OutputBytesGes + OutputBytes
CallFunction(DLL_ID, "beCloseStream", StreamHandle)
WriteData(1, *BufferMP3, OutputBytesGes)
CloseFile(1)
CloseFile(0)
CloseLibrary(DLL_ID)
EndTime = ElapsedMilliseconds() - StartTime
Version$ = Version$ + #CRLF$ + "Benötigte Zeit : " + Str(EndTime / 1000) + " s"
MessageRequester("Einige Angaben :", Version$)
End
Code: Alles auswählen
PokeL(*PointerEinst + 12, 44100) ;SampleRate in Hertz