Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Wave aus dem Speicher abspielen (https://www.delphipraxis.net/122214-wave-aus-dem-speicher-abspielen.html)

Cyf 11. Okt 2008 13:49


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;

igel457 11. Okt 2008 13:55

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): http://www.planet-source-code.com/vb...=4422&lngWId=3

PS: Neben dem Tutorial ist ansonsten das MSDN dein Freund...

Cyf 12. Okt 2008 11:47

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.

sx2008 13. Okt 2008 00:00

Re: Wave aus dem Speicher abspielen
 
PlaySound mit dem Parameter SND_MEMORY aufrufen.
http://msdn.microsoft.com/en-us/library/ms712879.aspx

Cyf 30. Okt 2008 18:54

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?

igel457 30. Okt 2008 19:21

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: http://www.delphipraxis.net/internal...t.php?t=139422 - Im Sourcecode des Programms ist ein Wrapper für das WaveOut Interface enthalten. Das kannst du dir ja mal anschauen.


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