Laden...

MP3 on the fly (reimt sich ja :)

Erstellt von tomschrot vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.772 Views
T
tomschrot Themenstarter:in
73 Beiträge seit 2004
vor 15 Jahren
MP3 on the fly (reimt sich ja :)

Hallo,

ich such mir schon seit tagen einen wolf im www und komm nicht weiter!
vieleicht kann mir ja hier jemand helfen... (bitte, bitte)

Also:

die idee ist eine MP3-datei frameweise zu lesen
(http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm)
was soweit schon klappt.

die einzelnen (mp3)frames sollen vom betriebsystem in PCM gewandelt werden.
(also on the fly -ohne wav file auf der platte! -direkt in einen buffer.)
an dieser stelle kann eine beliebiger (dsp)filter auf die daten losgelassen
werden bevor das ergebnis als wav abgespielt wird.

meine bisherigen recherchen führten zum AudioCompressionManager
(http://msdn.microsoft.com/en-us/library/ms705349(VS.85).aspx)
der die codecs auf dem pc verwaltet. hier sollte es möglich sein
(mp3)daten in den MPEG (lame, etc) codec zu pumpen und als pcm buffer
wieder ab zu holen.? (oder bin ich aufm holzweg)

die codecs bekomme ich auch schon ausgelesen 🙂


		//...
		
		public delegate bool DriverEnumCallbackDelegate(IntPtr handle, int inst, int flags);
		
        [DllImport("Msacm32.dll", EntryPoint = "acmDriverEnum", ExactSpelling=false)]
        public extern static int DriverEnum
        (
            [MarshalAs(UnmanagedType.FunctionPtr)]
            DriverEnumCallbackDelegate d,
            int instanceValue,
            int flags
        );

        [DllImport("Msacm32.dll", EntryPoint = "acmDriverDetails", ExactSpelling = false)]
        public extern static int DriverDetails
        (
            IntPtr      handle,
            [In, Out]
            DriverDetail  padd,
            int         reserved
        );

		//...
		
        private bool DriverEnumCallback(IntPtr handle, int instance, int flags)
        {
            DriverDetail d = new _Acm.DriverDetail();
            DriverDetails(handle, d, 0);
            //_Drivers.Add(new AcmDriver(handle, d));
            return true;
        }
		
		//...
		
	    #region structs

        [StructLayout(LayoutKind.Sequential)]
        public sealed class DriverDetail
        {
            public int      Size;
            public int      fccType;
            public int      fccComp;
            public short    wMid;
            public short    wPid;
            public int      vdwACM;
            public int      vdwDriver;
            public SupportFlags fdwSupport;
            public int      cFormatTags;
            public int      cFilterTags;
            public IntPtr   hIcon;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
            public string szShortName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string szLongName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szCopyright;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string szLicensing;
            
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
            public string szFeatures;

            [Flags]
            public enum SupportFlags : int
            {
                Codec       = 0x00000001,
                Converter   = 0x00000002,
                Filter      = 0x00000004,
                Hardware    = 0x00000008,
                Async       = 0x00000010,
                Local       = 0x40000000,
                Disabled    = unchecked((int)0x80000000)
            }

            public DriverDetail()
            {
                Size = Marshal.SizeOf(this);
            }

            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("{0}\n", szShortName);
                sb.AppendFormat("{0}\n", szLongName);
                sb.AppendFormat("{0}\n", szCopyright);
                sb.AppendFormat("{0}\n", szLicensing);
                sb.AppendFormat("{0}\n", szFeatures);

                return sb.ToString();
            }
        }

        #endregion
		
		//...


alle weiteren versuche (z.B. acmFormatEnum) liefern nix vernünftiges mehr...??

gibts jemanden der schon erfahrungen mit multimedia api hat und mir hier weiter helfen könnte?
evtl. auch eine zusammenarbeit am projekt?

es grüßt,
ein verzweifelter

TS

M
231 Beiträge seit 2007
vor 15 Jahren

Hi tomschrot

Um was geht es dir bei der Umwandlung genau? Willst du das MP3 File rein mit dem DSP Effekt versehen oder hast du noch mehr vor? Evtl. hab ich da was für dich...

Gruß MB


Gruß MB

Home of DigiJay - DJ-Freeware

T
tomschrot Themenstarter:in
73 Beiträge seit 2004
vor 15 Jahren

hallo muntablues,

im prinzip gehts um ein mini framework zum arbeiten mit mp3 (evtl. auch anderen formaten)

also input->decode->dsp->output etc...

eins hab ich bei meiner recherche gelernt: bei solchen techniken siehts mit .net ziemlich mau aus!

grüße,

ts

M
231 Beiträge seit 2007
vor 15 Jahren

Hi tomschrot

In dem Falls gibt es drei Möglichkeiten:

  1. DirectX (hab ich mir aber nur kurz angeschaut)
  2. Bass.NET (nehm ich selber)
  3. FMOD (nur kurz angesehn, war mir zu kompliziert)

Auf Google gibts genug Infos zu BASS und es bietet eigentlich alles was du brauchst. Sprich Mp3 (aber auch so gut wie allen andern Formate) Encoden, DSP drauf setzten, Output auf Soundkarte inkl ASIO.

Am Anfang sicher nicht einfach zu durchschauen, aber nach einer Eingewöhnung sehr sehr umfangreich. Großer Vorteil den ich für dich sehe ist, dass du freie und natürlich auch gekaufte VST Plugins einbinden kannst.

So denn

Gruß MB


Gruß MB

Home of DigiJay - DJ-Freeware

T
tomschrot Themenstarter:in
73 Beiträge seit 2004
vor 15 Jahren

hallo muntablues,

ja klar, bei bass bin ich auch schon gelandet. (benutze seit jahren den wmplay -ist mein liebster)

allerdings gibts auch gründe die dagegen sprechen:

warum eine dll + wrapper benutzen von der ich nur 5% brauche
und bass ist ja eigentlich lizenspflichtig wenn ich ein komerzielles produkt bzw. eine shareware bauen möchte (möcht ich ja eigentlich nicht, aber wer weiss....)

dann wäre ja noch der ehrgeiz es selber zu machen... (ist ja auch interessant)

aber im prinzip hast ja recht!

grüße,

ts

M
231 Beiträge seit 2007
vor 15 Jahren

Hi TS

Bei einer Freeware kostet das Ding aber nix. Also wenn du eine komerzielle Freeware baust sollte es kein Problem sein. Außer du willst Geld damit verdienen, dann sind aber die Shareware Lizensen auch nicht sehr teuer.

Ich hab eine Freeware mit alles Bass dll´s und die Bass Entwickler meinten es sei kein Problem...

Gruß MB


Gruß MB

Home of DigiJay - DJ-Freeware

T
tomschrot Themenstarter:in
73 Beiträge seit 2004
vor 15 Jahren

hallo muntablues,

bass ist schon seeeeeeeeehr komfortabel.
fuchst mich aber trotzdem es selber zu basteln... 😉

-ts