![]() |
Wave aus dem Speicher abspielen
Ich versuche derzeit, eine kleine Klasse zusammenzubasteln, die Waves (derzeit nur PCM) abspielen kann, das grundsätzliche dabei ist, dass die Daten bereits eingelesen sind und ich sie nur ungern erst wieder in eine Datei schreiben würde. Ich suche also eine Möglichkeit die Audiodaten mit möglichst wenig overhead abzuspielen. Entweder direkt aus einem Array oder wenn ich das entsprechend umbau aus einem TMemoryStream oder ähnlichem.
Gegeben folgende Klasse:
Delphi-Quellcode:
type
TWave = class(TObject) private FAvgBytesPerSec: Cardinal; FBitsPerSample: Word; FBlockAlign: Word; FChannels: Word; FData: array of Byte; FDataLength: Cardinal; FFormat: Word; FSampleRate: Cardinal; //samples pro Sekunde public constructor Create(Stream: TStream); procedure LoadWave(Stream: TStream); function GetInfo: string; end; |
Re: Wave aus dem Speicher abspielen
Ich würde dir das Windows API WaveOut Interface aus der Unit "MMSystem" empfehlen. Hier ist ein Tutorial (leider für C, das sollte aber nicht das Problem sein):
![]() PS: Neben dem Tutorial ist ansonsten das ![]() |
Re: Wave aus dem Speicher abspielen
Hmm das http://msdn.microsoft.com/en-us/library/ms678710(VS.85).aspx könnte was sein, ist mir aber für ein kleines Propeprogramm zuviel Aufwand darüber was zu implementieren (bzw., die Anwendung davon zu verstehen) nur um FData direkt abspielen zu können. Hintergrund war erstmal nur, dass ich die Klasse versuche so auszubauen, das man damit verschiedene Soundeffekte auf die Daten anwenden kann und sie schonmal probehören können soll und dass sich das später vielleicht auch gut für nen voice chat eignen würde. Werd das aber vielleicht noch nachholen.
|
Re: Wave aus dem Speicher abspielen
PlaySound mit dem Parameter SND_MEMORY aufrufen.
![]() |
Re: Wave aus dem Speicher abspielen
Kam leider erst jetzt dazu das zu testen. Klappt wunderbar, danke. :thumb:
:dp: Werde dann wohl meine Datenverwaltung in der Klasse so umbauen müssen (sollte nicht der große Aufwand werden), dass die Wave komplett am Stück mit Header im Speicher liegt. Gibt es allerdings grundsätzlich eine Möglichkeit die eigentlichen Audiodaten (also quasi RAW) ohne den Header abzuspielen, also unter Angabe der Channels, Bittiefe, etc. als Argument einer Funktion? Das erspart diese Angaben im Speicher davor zu kopieren und bei Netzwerkanwendungen den Header mitsenden zu müssen, denke aber klappt auch so ganz gut. Noch eine weitere Frage, wenn ich SoundPlay nutze, kann ich immer nur einen Sound gleichzeitig abspielen, wie kann ich dafür sorgen, dass sie "nebeneinander" laufen? |
Re: Wave aus dem Speicher abspielen
Ich habe dir bewusst die "Low Level API" empfohlen, da du damit nicht den Header übergeben musst. Außerdem kannst du mit PlaySound keine längeren Musikstücke abspielen. Ist der Soundbuffer voll, dann ist es mit Abspielen zu Ende (normalerweise nach 1-2 Minuten).
Mit WaveOut kannst du (wie in dem Tutorial beschrieben) sowohl das gleiche Verhalten wie PlaySound erreichen und alle Daten auf einmal in den Soundbuffer laden, oder die Daten an den Soundkartentreiber streamen, wodurch du beliebig lange Stücke abspielen kannst. Schau mal hier: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz