delphi - डेल्फी में एक साथ.wav फ़ाइलों को एक साथ कैसे खेलें




audio media-player (4)

मैं डेल्फी में कई .wav फ़ाइलों को एक साथ करना चाहता हूं।

जब मैं पहली चीजों को खोलता हूं और चीजें ठीक करता हूं हालांकि दूसरी बार किसी त्रुटि का कारण बनता है जब वह खोलने की कोशिश करता है

ऐसा प्रतीत होता है कि मैं एक समय में केवल एक मीडिया प्लेयर का उपयोग कर सकता हूं .... क्या इसके चारों ओर कोई रास्ता नहीं है मैं क्या करूं?


आप डायरेक्टशो ट्रांस्फ़ॉर्म फ़िल्टर का उपयोग कर सकते हैं यह एक माइक्रोसॉफ्ट विंडोज़ एप्लिकेशन प्रोग्रामिंग इंटरफेस (एपीआई) है जो Windows अनुप्रयोगों को विंडोज "मीडिया" इनपुट डिवाइसों के साथ इंटरैक्ट करने और नियंत्रित करने में सक्षम बनाता है,

या आप WaveMix DLL का उपयोग कर सकते हैं यह एक ऐसी सुविधा है जो एकाधिक WAV फ़ाइलों को एक साथ खेली जा सकती है यह संभव के रूप में उपयोग करने के लिए उतना आसान बनाया गया है, लेकिन फिर भी उनको ऐसा करने की शक्ति है जो गेम द्वारा आवश्यक है। DLL एक साथ तरंग नाटक के 8 चैनलों का समर्थन करता है, एक ही चैनल और लहर पूर्णता अधिसूचना के साथ लहरों को पंक्तिबद्ध करने की क्षमता।


इसके लिए आप एसओएक्स (ध्वनि एक्सचेंज) का उपयोग कर सकते हैं यह ऑडियो फ़ाइलों को चला सकता है, रिकॉर्ड कर सकता है, विभिन्न प्रभावों को लागू कर सकता है, विभिन्न स्वरूपों को परिवर्तित कर सकता है ....
एक साथ फाइलें चलाने के लिए चेक -एम पैरामीटर उदाहरण:

sox -m 1.wav 2.wav -d

मुझे लगता है कि हम उपयोग कर सकते हैं

sndPlaySound('filename1.wav',SND_SYN OR SND_NODEFAULT);
sndPlaySound('filename2.wav',SND_SYN OR SND_NODEFAULT);
sndPlaySound('filename3.wav',SND_SYN OR SND_NODEFAULT);
sndPlaySound('filename4.wav',SND_SYN OR SND_NODEFAULT);

आप एक ध्वनि कैसे खेलेंगे? जब मैं अच्छा नियंत्रण चाहता हूँ, तो मैं इस जवाब के रूप में, waveOut फ़ंक्शन का उपयोग करता हूं। मेरा जवाब वहाँ भी आप एक धागा का उपयोग कर ध्वनि खेलने के लिए अनुमति देता है (है, अन्य बातों के अलावा, asynchronously)। मुझे लगता है कि आप एक ही समय में दो ऐसे धागे शुरू कर एक ही समय में दो ध्वनियों को खेल सकते हैं, यदि आप केवल ग्लोबल threadvar को वैश्विक threadvar एस के साथ threadvar

अद्यतन करें

PlaySound का उपयोग करने के लिए एक एकल ध्वनि खेलने का सरलतम तरीका है इसका उपयोग एसिंक्रोनिक रूप से किया जा सकता है, लेकिन जब से आप यह सवाल पूछते हैं, तो मैं मानता हूं कि यह आपको दो फ़लों के एक साथ प्लेबैक को शुरू करने के लिए पंक्ति में दो बार इस फ़ंक्शन का उपयोग करने की अनुमति नहीं देता है। लेकिन: यदि आप एक धागा बनाते हैं जो केवल ध्वनि चलाता है ( सिंक्रोनिक रूप से ताकि थ्रेड प्लेबैक से पहले मर न जाए), तो आप शायद दो ऑडियो फ़ाइलों को एक साथ खेलने के लिए दो ऐसे धागे का उपयोग कर सकते हैं (मुझे अभी डेल्फी कंपाइलर तक पहुंच नहीं है, इसलिए मुझे डर है कि मैं मेरी अवधारणाओं का परीक्षण नहीं कर सकता।)

अपडेट 2

मेरी परिकल्पना यह थी कि आप PlaySound दो कॉल्स का उपयोग कर सकते हैं यदि केवल दो अलग-अलग धागे से फ़ंक्शन को बुलाया गया था, लेकिन जाहिरा तौर पर यह काफी अच्छा नहीं है आपको वास्तव में दो अलग-अलग प्रक्रियाओं की आवश्यकता है, ऐसा लगता है, जो खराब है (स्पष्ट राज्य)। मैंने कोशिश की

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TSoundPlayerThread.Create(true) do
  begin
    SetFileName('C:\Users\Andreas Rejbrand\Downloads\Anna.wav');
    FreeOnTerminate := true;
    Resume;
  end;

  with TSoundPlayerThread.Create(true) do
  begin
    SetFileName('C:\Users\Andreas Rejbrand\Downloads\Mike.wav');
    FreeOnTerminate := true;
    Resume;
  end;
end;

साथ में

unit SoundPlayerThread;

interface

uses
  Classes, MMSystem, Windows;

type
  TSoundPlayerThread = class(TThread)
  private
    { Private declarations }
    FAudioFileName: string;
  protected
    procedure Execute; override;
  public
    procedure SetFileName(const FileName: string);
  end;

implementation

procedure TSoundPlayerThread.Execute;
begin
  PlaySound(PChar(FAudioFileName), 0, SND_SYNC);
end;

procedure TSoundPlayerThread.SetFileName(const FileName: string);
begin
  FAudioFileName := FileName;
end;

end.

और केवल बाद की तरंग फाइल खेला गया था।

अपडेट 3

मैंने वास्तव में एक छोटी WAV फ़ाइल पुस्तकालय लिखा है I इसका उपयोग करके, मैं दो WAV फ़ाइलों को लोड कर सकता हूं, उन्हें मर्ज कर सकता हूं, और परिणाम को ऑडियो ड्रायवर भेज सकता हूं। हालांकि, यहां पोस्ट करने के लिए यह बहुत अधिक कोड है। यदि मुझे कुछ दिनों का समय बिताने का समय मिलता है तो मैं एक और हल्के PlaySimultaneously प्रक्रिया लिख ​​सकता हूं और इसे पोस्ट कर सकता हूं।

अन्यथा: डायरेक्टएक्स?