Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 03.06.10 01:41
Hey,
ich such zur Zeit nach ner Lösung für folgendes Problem:
Ich will den Sound eines Programms (Firefox) abfangen, weil er bloß über den Front-Channel läuft. Den abgefangenen Stream will ich dann auf alle Boxen des Soundsystems legen. Leider hab ich bei google & Co kein Programm dafür gefunden, also hab ich mir vorgenommen sowas mal zu schreiben (vorrausgesetz ich bekomm das hin^^) Hat jmd von euch ne Idee, wie man sowas realisieren kann?
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 05.06.10 04:10
Hey,
ich bin grad dabei miene Idee in die Tat umzusetzn, aber es will nich so ganz wie ich will. Ich versuch das ganze mit der Bass.dll. Ich hab mir nen record Stream besorg un erstma versucht Daten aufzuzeichnen und wieder abzuspielen, aber da scheiter ich schon. Hier ma der Code: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall; begin FileStream.Write(buffer, length); Result := True; end;
i := 0; InputDevice := 0; while BASS_RecordSetInput(i, BASS_INPUT_OFF, -1) do i := i + 1; BASS_RecordSetInput(InputDevice, BASS_INPUT_ON, 1); RecStream:= BASS_RecordStart(44100, 2, 0, @RecordingCallback, 0); |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function Callback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall; begin if MemStream.Position + Length > MemStream.Size then begin result := false; end else begin FileStream.Read(buffer, Length); FileStream.Position := MemStream.Position + Length; Result := True; end; end;
PlayStream := Bass.BASS_StreamCreate(44100, 2, 0, @Callback, 0); BASS_ChannelPlay(PlayStream , false); |
Die aufnahme Funktionniert soweit ich das erkennen kann. Ich lass mir zum überprüfen die FFT-Daten des record-Stream ausgeben und in der Datei stehen auch Daten drin (leider kann ich die nich mit dem WMP anhören oder so).
Bei der Widergabe passiert gar nix, aber ich weiß nich warum. In der Bass-Hilfe wurde das auch so gemacht. Kann mir da jmd helfen?
€: ich habs jetz so weit, das ich ein total verzerrtes abspielen des Streams habe. Das Problem ist, das ich die Daten nciht wieder zusammensetzen kann. Die liegen im WAV-Format vor un da steht in der Doku, das die Block größe Channels * ( Samplerate / 8 ) ist. Bei mir wären das 4 Byte/Block. Wenn ich die Daten jetzt aber wie folgt auslesen will, dann hab ich dieses verzerrte Signal: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function Callback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall; var buf: ^DWord; i, len: Integer; begin buf := buffer; len := Length div 4; for i := 0 to len - 1 do begin MemStream.Read(buf^, 4); inc(buf); end; Result := True; end; |
MfG & Thx Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Sa 05.06.10 13:30
Hi, leider habe ich wenig Zeit, bin nicht zu Hause!
Bin aber selber am schreiben von sowas. Problem ist leider das die Wiedergabe nicht direkt, wie bei inetradio, gestreamt wird!
Also muss man über, Master oder Lineout(FrontLP) gehen, falls ich das richtig verstanden habe bei Dir!? Nun kann man aber nicht gleichzeitig ! Aufnehmen und wiedergeben. Da Du ja das gleiche Singal, wiedergabe FireFox z.B. Lineout(FrontLP) und wiedergabe Deines Records ebenfalls Lineout(FrontLP) machst!
FireFox kannst Du nicht sagen wo er das Singal hinschicken soll, im allg. FrontLP! Dein Rec/Wiedergabe aber schon, z.B RearLP.
Kongret!
In der BassInizialisierung musst Du die Speakerabfrage machen welche er überhaupt findet! Nur so kannst Du auch eine Trennung durchführen!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| var i: BASS_INFO; ....... ....... if (HIWORD(BASS_GetVersion) <> BASSVERSION) then begin MessageBox(0, 'An incorrect version of BASS.DLL was loaded', nil, MB_ICONERROR); Halt; end;
if not BASS_Init(-1, 44100, 0, Handle, nil) then Error('Error initializing audio!');
BASS_GetInfo(i); if (i.speakers < 4) then begin if (MessageBox(0, 'Lautsprecher Zuordnung trotzdem aktivieren?', 'Keine extra Lautsprecher gefunden', MB_ICONQUESTION or MB_YESNO) = IDYES) then begin BASS_Free; if (not BASS_Init(-1, 44100, BASS_DEVICE_SPEAKERS, Handle, nil)) then begin MessageBox(0, 'Can''t initialize device', nil, 0); Halt; end; BASS_GetInfo(i); end; end; |
Wird Dir aber sicherlich bekannt sein
Bei der Aufnahme solltest Du auch nicht gleich mit Volume 1, sondern mit 0,5 anfangen, und dann evtl höher gehen wenn das Signal nicht laut genug ist.
Wie gesagt! Wichtig ist die Trennung von den beiden Signalen, FirerFox und Dein Rec/WiedergabeSignal.
Ob ich richtig damit bin, bezogen auf Deine Info, kann ich nicht genau sagen, hoffe es aber!?
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 05.06.10 16:46
Hey,
den WiedergabeStream bekomm ich ohne Probleme auf die hinteren Boxen, woran ich grad scheiter, ist nur von den 2 vorderen Boxen aufzunehmen. Er nimmt immer den kompletten Soundausgang auf, un da die Wiedergabe leicht Zeitversetzt ist bekomm ich jedesmal ein Echo rein. Und ich hab bis jetzt auch nix gefunden, wie ich den RecordStream so initialisieren kann, das er nur die vorderen Boxen aufnimmt.
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 06.06.10 12:09
Jo, ist auch richtig so
FrontLP = Linout und kann so nicht für die Aufnahme genutzt werden.(nicht umschaltbar)
RearLP = LineIn also Aufnahmemöglichkeit!
Center = Microeingang also auch Aufnahmemöglichkeit!(Mono und empfindlicherer Eingang)
Je nach Soundkarte noch(7.1 System)
Site = Lineout.(nicht umschaltbar)!
Ich weiss jetzt zwar nicht was Du oder warum Du mit FireFox "aufnehmen" willst, aber versuch doch mal das was Du abspiellst als Inetstream zu machen, so hast Du alle Ausgänge frei und kannst das Signal auf die LPausgänge schicken!
Hier, oder in einem anderen Delphi Forum, habe ich den Code für sowas schon gesehen. Glaube das war sogar ein Tutorial für ein PLayer mit Bass.Dll!
muss wieder weg mist
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: So 06.06.10 19:15
Hey,
ich komm drad nich ganz mit^^ Die Aufnahmegeräte, die die Bass.dll mir anzeigt sind folgende:
0 - Mono Mix
1 - Stereo Mix
2 - Aux
3 - CD-Player
4 - Line-In
5 - Mikrofon
6 - Telefonleitung
Die einzigen wo ein Signal ankommt sind 0 und 1. Bei den anderen is funkstille.
Und ich möchste nicht MIT dem Firefox aufnehmen, sondern ich möchste den Sound VOM Firefox aufnehmen, damit der Sound bei Youtube und Co auf dem ganzen SoundSystem läuft und nicht nur auf den Front-Boxen...
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 06.06.10 21:51
Ok, kurz zur Erklärung.
0 = Monomix (Veraltet) ist für 2,5 und 6 gedacht. Dort wird auch das StereoSignal aufgespielt, als Monowiedergabe.
1 = StereoMix, sind alle Stereo AudioSignale die Du abspielen kannst. Incl. LineIn(4) und Micro(5)
2 = Aux (veraltet).
3 = CD (Veraltet) Wurde früher verwendet um das AudioSignal des PC - CD/DVDPlayer/Recorder direkt mit dem Board zu verbinden.
4 = LineIn. klar  Dort kann man einen externen CDPlayer anschliessen z.B. Liegt hier nichts an kannst Du auch nichts aufnehmen.
5 = Micro Eingang. Hier das gleiche wie bei 4.
6 = (veraltet) gibt es eigentlich gar nicht mehr.
Ältere Soundkarten mit 3 Anschlüssen, aber 5.1 Wiedergabe schalten 4 und 5 um als WiedergabeSignal!
Hatt aber nix mit der eigentlichen Sache zu tun.
Bleibt also nur der Stereomix(1) und Monomix(0) für die Aufname übrig!
Beispiel: Du schaust/hörst Dir mit NeroShowtime ne DVD an und hörst zur gleichen Zeit mit dem Mediaplayer Mp3 an.
Beides kannst Du über die Software einzeln in der Lautstärke regeln, gehen aber trotzdem gemeinsam auf den StereoMix  Demzufolge auch alles, was Du über Firefox anhörst.
Darum mein Vorschlag: Das ganze als Inetstream zu machen.
Nur find ich es leider auch nicht mehr, wie dies genau gemacht wird. Irgendwie war das so, glaube ich!?
Delphi-Quelltext 1:
| stream=BASS_StreamCreateURL('http://www.welchesite.com/file.mp3', 0, 0, NULL, 0); |
Wie das mit YouTube funct mh.....
Der rest ist dann ja nur noch die Zuordnung bei der Wiedergabe, welche Speaker Du ansprechen willst!
Ist die zweite '0' bei den Parametern.
Damit würdest Du das Signal nicht erst auf LineOut schicken und auf den Stereomix, dann recorden und wieder zurück. Zeitversetzt und evtl. mit schlechterer Qualität.
Mh... verdammt kompliziert das richtig zu erklären
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 09.06.10 11:52
Hi Bergmann89.
Bei mir wird z.B nur noch folgendes Angezeigt:
0=Line-Lautstärke
1=Front-Micro
2=Rear_Micro
3=StereoMix
Du siehst, die Angaben sind von der jeweiligen Board/Soundkarte abhängig.
Da kein anderer ne Idee hat, versuche ich nochmal was einzubringen. Ob dies allerdings sinnvolle Lösungen sind? (Aufwand und Nutzen)
Da dies ja Videos sind gehts natürlich nicht mit der bass.dll oder so wie Du es machen wolltest!
Zwei Möglichkeiten sehe ich da eigentlich nur.
1. Du biegst die AudioAusgabe von Firefox um, auf Dein Prog. Machbar ist alles, aber frag mich nicht wie
2. Du schreibst Dir mit der BassVideo.dll/Bass.Dll so eine art Realplayer.
Egal wie man es anstellt, Frage bleibt, Nutzen und Aufwand!
Persöhnlich würde ich für das 2. plädieren. Kann man sich richtig reinsteigern was vernünftiges zu machen!
Siehe "Nemp-Noch ein MP3-Player" von Gausi !
Tut mir leid, das ich nicht weiter Helfen konnte.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mi 09.06.10 13:19
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|