Autor Beitrag
pdelvo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 11



BeitragVerfasst: Mo 08.08.11 01:02 
Hallo zusammen!

und zwar verzweifel ich gerade damit die libmp3lame.so mittels DllImport unter Moo vernünftig anzusprechen. Laut meinen längeren Google recherchen, bin ich auch der erste, der das versucht. Unter Windows mit der lame_enc.dll rennt das alles auch schon wie geschmiert. Allerdings sind die Signaturen unter Windows und Linux völlig unterschiedlich. Ich versuche on the fly einen WaveStream in einem Mp3 Stream zu wandeln, nicht eine .wav Datei in eine .mp3 datei zu konvertieren. Diese Signaturen benutze ich im Moment:

ausblenden volle Höhe C#-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:
29:
30:
31:
32:
33:
34:
       [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern IntPtr lame_init();
        [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern uint lame_set_in_samplerate(IntPtr lame, int samplerrate);
        [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern uint lame_set_VBR(IntPtr lame, vbr_mode_e mode);
        [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern uint lame_init_params(IntPtr lame);
        [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern uint lame_close(IntPtr lame);

        [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern uint lame_encode_flush(IntPtr lame, byte[] mp3_buffer, int size);
        [DllImport("/usr/local/lib/libmp3lame.so")]
        public static extern uint lame_encode_buffer_interleaved(IntPtr lame, IntPtr pcm_buffer, int read, byte[] mp3_buffer, int size);

//und diese Encode funktion


        public static uint Encode(IntPtr p, byte[] input, int index, int count, byte[] output)
        {
            uint tencoded = 0;
            GCHandle handle = GCHandle.Alloc(input, GCHandleType.Pinned);
            try
            {
                IntPtr ptr = (IntPtr)(handle.AddrOfPinnedObject().ToInt32() + index);
                tencoded = lame_encode_buffer_interleaved(p, ptr,count / 2/*Samples*/,  output, output.Length);
            }
            finally
            {
                handle.Free();
            }
            return tencoded;
        }


Und mein Testcode

ausblenden volle Höhe C#-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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
         static unsafe void Main(string[] args)
        {
            try
            {
                //uint dwSamples = 0;
                //uint dwBufferSize = 0;
                //uint m_hLameStream = 0;
                IntPtr lame = Test.lame_init();
                Console.WriteLine(lame);
                uint result = Test.lame_set_in_samplerate(lame, 44100);
                Console.WriteLine(result);
                result = Test.lame_set_VBR(lame, vbr_mode_e.vbr_default);
                Console.WriteLine(result);
                result = Test.lame_init_params(lame);
                Console.WriteLine(result);
                FileStream stream = new FileStream("pdelvo7.wav", FileMode.Open);
                FileStream stream2 = new FileStream("pdelvo7.mp3", FileMode.Create);
                byte[] wavebuffer = new byte[8192];
                byte[] mp3buffer = new byte[8192];
                int count = 0;
                while ((count = stream.Read(wavebuffer,0,wavebuffer.Length)) > 0)
                {
                    int i = (int)Test.Encode(lame, wavebuffer, 0, wavebuffer.Length, mp3buffer);
                    stream2.Write(mp3buffer, 0, i);
                }

                int r = (int)Test.lame_encode_flush(lame, mp3buffer, mp3buffer.Length);
                stream2.Flush();

                result = Test.lame_close(lame);
                Console.WriteLine(result);
            }
            catch (Exception e)
            {
                File.WriteAllText("logger.log",e.ToString());
            }
        }


Ein Problem bei der Fehlersuche ist, dass ich nicht an die Fehlermeldung komme. Man bekommt sie nicht in ein File weitergeleitet. Das catch greift nicht, und ein weiterleiten der Ausgabe in eine Datei zeit nur die WriteLines an, und nich die Fehlermeldung.

Die ausgaben:

ausblenden Quelltext
1:
2:
3:
4:
32943872 <- das lame handle
0 <- fehlercode 0, kein fehler(?)
0 <- "
0 <- "


Das hier bekomme ich sonst noch präsentiert

user defined image
pdelvo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 11



BeitragVerfasst: Fr 19.08.11 20:39 
Hat denn niemand eine idee? :(
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 20.08.11 09:42 
Hallo pdelvo,

schwierig, darauf eine konkrete Antwort zu geben.
Du hast dir einfach den nativen Stack in der Encode-Methode zerschossen, d.h. mittels lame_encode_buffer_interleaved(...).
Verwendest du denn 32 oder 64-bit? Bei letzterem wäre ToInt32 natürlich fatal... wobei in der MSDN dazu steht, daß dann eigentlich eine Overflow-Exception kommen muß.
Ansonsten müßtest du noch mal genau die Parameter überprüfen.

Kommentiere am besten zu ersteinmal diese Methode aus und schau, ob es wirklich diese Methode (alleine) ist...
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 20.08.11 11:12 
user profile iconpdelvo hat folgendes geschrieben Zum zitierten Posting springen:
Ein Problem bei der Fehlersuche ist, dass ich nicht an die Fehlermeldung komme. Man bekommt sie nicht in ein File weitergeleitet. Das catch greift nicht, und ein weiterleiten der Ausgabe in eine Datei zeit nur die WriteLines an, und nich die Fehlermeldung.
Hast du stderr auch weitergeleitet?

_________________
>λ=