AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wave aus dem Speicher abspielen
Thema durchsuchen
Ansicht
Themen-Optionen

Wave aus dem Speicher abspielen

Ein Thema von Cyf · begonnen am 11. Okt 2008 · letzter Beitrag vom 30. Okt 2008
Antwort Antwort
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#1

Wave aus dem Speicher abspielen

  Alt 11. Okt 2008, 13:49
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;
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Wave aus dem Speicher abspielen

  Alt 11. Okt 2008, 13:55
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...
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#3

Re: Wave aus dem Speicher abspielen

  Alt 12. Okt 2008, 11:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Wave aus dem Speicher abspielen

  Alt 13. Okt 2008, 00:00
PlaySound mit dem Parameter SND_MEMORY aufrufen.
http://msdn.microsoft.com/en-us/library/ms712879.aspx
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#5

Re: Wave aus dem Speicher abspielen

  Alt 30. Okt 2008, 18:54
Kam leider erst jetzt dazu das zu testen. Klappt wunderbar, danke.

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?
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Wave aus dem Speicher abspielen

  Alt 30. Okt 2008, 19:21
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  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 01:38 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