Laden...
K
Kravnos
myCSharp.de - Member
11
Themen
46
Beiträge
Letzte Aktivität
vor 13 Jahren
Dabei seit
29.05.2007
Alter
43
Erstellt vor 13 Jahren

Hallo Zusammen

Ich lasse über einen vlc wrapper Videos in einer Form abspielen. Das klappt auch alles sehr gut. Bei einigen Videos jedoch klappt das nicht. Ich glaube dass er da vll eine Art "Fingerzeig" braucht denn der VLC als Anwendung spielt die Videos ab.
Nun ist mir aufgefallen dass es noch eine libvlc_medialibary gibt. Ich werde aber nicht so recht schlau daraus für was genau sie gut ist. Könnte es sein das mir das noch fehlt?
Oder muss ich noch etwas besonderes beachten?

Hier die Kurzfassung:


IntPtr Handle = LibVlc.libvlc_new(args.Length, args);
libvlc_media_player_set_media(Handle, value.Handle);
libvlc_media_player_play(Handle)

Ich hoffe das ist kurz genug 😉
Da ich ein Hobbyprogrammierer bin fällt es mir noch schwer so ganz da durch zu steigen. Ich benötige einfach nur einen Tipp was fehlen könnte damit ich weiss wonach ich suchen muss. Und bitte erklärt mir kurz was die fehlende medialibary macht, dazu ist die Doku recht schweigsam oder ist verstehe es einfach nicht 😉

Vielen Danke schonmal für jeden Tipp

Erstellt vor 16 Jahren

Ich möchte euch heute die Arbeit eines sehr guten Freundes von mir vorstellen. Den "SmartStart". Leider ist er vor kurzen sehr jung gestorben. Damit jedoch ein Teil von ihm weiterlebt stelle ich das Projekt ein. Er hat jahrelang hart und verbissen daran gearbeitet und es immer wieder verbessert. Es würde mich einfach freuen wenn diese Arbeit nicht umsonnst war und es jemand gebrauchen kann.

Beschreibung:
Der SmartStart wurde für Laptops & Ähnliches entwickelt. Er gewährt schnellen Zugriff auf verschiedenste Windowsfunktionen. Leichter erreichbare sowie auch im System gut vergrabene. Da es ja mit dem Touchpad so ne sache ist sich durch Menüs zu wühlen ist der SmartStart das ideale Programm für Leute die ebne halt nicht immer ne Maus zur verfügung haben. Entwickelt wurde es für Windows Vista, läuft aber auch unter XP.

Systemvoraussetzungen:
.Net Framework 2.0 oder höher
Windows XP/Vista

Hier zum Download.

In gedenken an Jan B., einem der besten Freunde die ich je hatte.

Kravnos

Erstellt vor 16 Jahren

Habe es editiert 😉

Liebe Grüsse

Kravnos

Erstellt vor 16 Jahren

Auf den Link klicken 😉

Erstellt vor 16 Jahren

Danke muntablues für deine Hilfe, habe jetzt mal um diesen Graus anderen zu ersparen die Klasse hochgeladen und ein recht simples beispiel dazu gemacht. Hoffe das ist verständlich. die Lösong findet ihr also hier.

Liebe Grüsse

Kravnos

Erstellt vor 16 Jahren

Beschreibung:

Hallo Alle zusammen. Hier eine Klasse mit der ihr in der Lage seid einen Bass.NET-Filestream zu einem Shoutcastserver zu streamen. Das hat mich echt ne menge Nerven gekostet und um das dem Nächsten der die Idee hat zu ersparen, stelle ich es hier rein. Ein dickes Danke geht an muntablues der mir sehr geholfen hat. Ohne Ihn würde ich wohl jetzt immernoch hier sitzen und mir die Haare raufen g

Das Testprojekt habe ich Angehangen es sollte Verdeutlichen wie die Klasse zu Benutzen ist. Bitte gebt euch nicht der Illusion hin dass ihr jeden stream dafür verwenden könnt, die BassFlags sind wichtig dabei. Wie im Snipe dargestellt. So benutzt ihr die Klasse beispielsweise, wobei jeder mit // überschriftete Abschnitt für sich alleine steht.

Ihr Braucht auchnoch folgende Dateien im Ausführungsverzeichniss:
* Bass.Net.dll (als Referenz hinzufügen)
* bass.dll
* bassenc.dll
* bassmix.dll
* lame.exe
* lame._enc.dll
Zu bekommen hier, oder im Testprojekt schon vorhaden.


//Varibalen
Radiostreaming streaming;
int stream;

public Form1()
{
   InitializeComponent();
   Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, this.Handle, null);
}
      
//Senden starten
streaming = new Radiostreaming();
stream = Bass.BASS_StreamCreateFile("1.mp3", 0, 0,  BASSFlag.BASS_STREAM_DECODE);
streaming.StartStreaming(stream, "Titel");
          

//Um einen neuen stream hinzuzufügen (Nächstes Lied zB)
Bass.BASS_StreamFree(stream);
stream = Bass.BASS_StreamCreateFile("2.mp3", 0, 0, BASSFlag.BASS_STREAM_DECODE);
streaming.UpdateStreaming(stream, "Neuer Titel");

//Um den Stream zu stoppen und das Senden zu beenden
Bass.BASS_StreamFree(stream);
streaming.StopStreaming()

So ich denke mal mit der Beispielanwendung und dem kurzen Snipe hier kommt ihr nun klar 😉 Wenn nicht fragt mich einfach per privater Nachricht oder durch ne Antwort hier.

Hier noch der Link zum Testprojekt.

Die Klasse selber Hängt an dem Beitrag dran g

Liebe Grüsse und viel Glück

Kravnos
Schlagwörter: <Shoutcast Bass.Net>

Erstellt vor 16 Jahren

Hallo nochmal, der Tipp mit dem Mixer war supi danke 😉 Genau das habe ich gesucht. Leider komme ich damit nicht klar, ich habe den Eindruck dass der Stream immer leer ist. Habe mir das Sample x mal angesehen und versucht das für meine zwecke anzugleichen. Dabei ist diese Klasse herausgekommen. Aber es funktioniert einfach nicht. Der Broudcast connectet einfach nicht. Wenn ich ihm statt dem _mixer einfach einen normalen stream gebe klappt es wunderbar. Ich hoffe ihr könnt mir helfen.

Liebe Grüsse

Kravnos


using System;
using System.Threading;
using System.IO;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

using Un4seen.Bass;
using Un4seen.Bass.AddOn.Mix;
using Un4seen.Bass.AddOn.Tags;
using Un4seen.Bass.Misc;

namespace BassPlayit
{
    class Mixerstream
    {
        //Mixerzeugs
        public int _mixer = 0;
        private Track _currentTrack = null;
        private Track _previousTrack = null;
        public string Filename;
        //Hier beginnt der Serverstreamteil
        EncoderLAME lame;
        SHOUTcast shoutcast;
        BroadCast _broadCast = null;
        IBaseEncoder encoder = null;
        IStreamingServer server = null;
        public void InitMixer() 
        {
            if (!Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT,IntPtr.Zero, null))
            {
                return;
            }
            Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_BUFFER, 200);
            Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_UPDATEPERIOD, 20);
            _mixer = BassMix.BASS_Mixer_StreamCreate(44100, 2, BASSFlag.BASS_SAMPLE_FLOAT);
            if (_mixer == 0)
            {
                
                Bass.BASS_Free();
                return;
            }
            Bass.BASS_ChannelPlay(_mixer, false);
        }
        public void StartMixer(string tFilename)
        {
            InitMixer();
            this.Filename = "1.mp3";
            AddTracksToMixerstream();
            lame = new EncoderLAME(_mixer);
            lame.InputFile = null;	//STDIN
            lame.OutputFile = null;	//STDOUT
            lame.LAME_Bitrate = 128;
            lame.LAME_Mode = EncoderLAME.LAMEMode.Default;
            lame.LAME_TargetSampleRate = (int)EncoderLAME.SAMPLERATE.Hz_44100;
            lame.LAME_Quality = EncoderLAME.LAMEQuality.Q0;
            if (lame.EncoderExists)
            {
                encoder = lame;
            }
            //Server
            shoutcast = new SHOUTcast(encoder, true);
            shoutcast.ServerAddress = "127.0.0.1";
            shoutcast.ServerPort = 8000;
            shoutcast.Password = "passwort";
            shoutcast.PublicFlag = false;
            shoutcast.Genre = "Alles *g*";
            shoutcast.StationName = "Kravis Server";
            shoutcast.Url = "";
            shoutcast.Aim = "";
            shoutcast.Icq = "";
            shoutcast.Irc = "";
            server = shoutcast;
            server.SongTitle = "hallo";
            if (_broadCast != null && _broadCast.IsConnected)
            {
                _broadCast.Disconnect();
            }
            GC.Collect();
            _broadCast = new BroadCast(server);
            _broadCast.AutoReconnect = true;
            _broadCast.ReconnectTimeout = 5;
            _broadCast.AutoConnect();
        }

        public void AddTracksToMixerstream()
        {
            Track track = new Track(Filename);
            // add the new track to the mixer (in PAUSED mode!)
            BassMix.BASS_Mixer_StreamAddChannel(_mixer, track.Channel, BASSFlag.BASS_MIXER_PAUSE | BASSFlag.BASS_MIXER_DOWNMIX | BASSFlag.BASS_STREAM_AUTOFREE);

            // an BASS_SYNC_END is used to trigger the next track in the playlist (if no POS sync was set)
            track.TrackSync = new SYNCPROC(OnTrackSync);
            BassMix.BASS_Mixer_ChannelSetSync(track.Channel, BASSSync.BASS_SYNC_END, 0L, track.TrackSync, new IntPtr(0));

            if (_currentTrack == null)
            {
                PlayNextTrack();
            }


        }
        private void PlayNextTrack()
        {
            _previousTrack = _currentTrack;
            _currentTrack = new Track(Filename);
            BassMix.BASS_Mixer_ChannelPlay(_currentTrack.Channel);
        }
        private void OnTrackSync(int handle, int channel, int data, IntPtr user)
        {
            if (user.ToInt32() == 0)
            {
                //An der Stelle muss ich mogeln weil ich nicht mit this.Handle initialisieren kann
                // END SYNC
                //BeginInvoke(new MethodInvoker(PlayNextTrack));
                PlayNextTrack();
            }
            else
            {
                // POS SYNC
                //BeginInvoke((MethodInvoker)delegate()
                //{
                // this code runs on the UI thread!
                PlayNextTrack();
                // and fade out and stop the 'previous' track (for 4 seconds)
                if (_previousTrack != null)
                    Bass.BASS_ChannelSlideAttribute(_previousTrack.Channel, BASSAttribute.BASS_ATTRIB_VOL, -1f, 1000);
                //}
                //);
            }
        }

    }
    public class Track
    {
        public Track(string filename)
        {
            Filename = filename;
            Tags = BassTags.BASS_TAG_GetFromFile(Filename);
            if (Tags == null)
                throw new ArgumentException("File not valid!");

            // we already create a stream handle
            // might not be the best place here (especially when having a larger playlist), but for the demo this is okay ;)
            CreateStream();
        }

        public override string ToString()
        {
            return String.Format("{0} [{1}]", Tags, Utils.FixTimespan(Tags.duration, "HHMMSS"));
        }

        // member
        public string Filename = String.Empty;
        public TAG_INFO Tags = null;
        public int Channel = 0;
        public long TrackLength = 0L;
        public SYNCPROC TrackSync;
        public int NextTrackSync = 0;
        public long NextTrackPos = 0L;

        private bool CreateStream()
        {
            Channel = Bass.BASS_StreamCreateFile(Filename, 0L, 0L, BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_STREAM_PRESCAN);
            if (Channel != 0)
            {
                TrackLength = Bass.BASS_ChannelGetLength(Channel);
                return true;
            }
            return false;
        }
    }

}

Uns als download angehängt

Erstellt vor 16 Jahren

Hallo genau das habe ich schon gemacht, aber sobald ein Lied wechselt disconnectet sich der broadcast weil der stream ja zurückgesetzt wird. Ich lasse ihn dann im mom neu connecten, das bedeutet bei jedem neuen lied wird ein diconnect vom Server gemacht und dann wieder connectet, das dauert etwa 5 Sekunden. Diese 5 Sekunde fehlen dann natürlich vom lied. Es funktioniert zwar aber das wahre ist das auch nicht. Deswegen wollte ich das recording verwenden weil das kein ende hat und ich nicht neu connecten muss.

Trotzdem danke für die Idee 😉

Liebe Grüsse

Kravnos

PS im Moment habe ich es so gemacht

Das wird zuerst gemacht, damit wird connectet.


 public void StreamToServer() 
        {
             
            if (_broadCast != null && _broadCast.IsConnected)
            {
                _broadCast.Disconnect();
                _broadCast = null;
                Bass.BASS_RecordFree();
                GC.Collect();
            }
            else
            {
                lame = new EncoderLAME(stream);
                lame.InputFile = null;	//STDIN
                lame.OutputFile = null;	//STDOUT
                lame.LAME_Bitrate = 128;
                lame.LAME_Mode = EncoderLAME.LAMEMode.Default;
                lame.LAME_TargetSampleRate = (int)EncoderLAME.SAMPLERATE.Hz_44100;
                lame.LAME_Quality = EncoderLAME.LAMEQuality.Q0;
                if (lame.EncoderExists)
                {
                    encoder = lame;
                }
                //Server
                shoutcast = new SHOUTcast(encoder, true);
                shoutcast.ServerAddress = "127.0.0.1";
                shoutcast.ServerPort = 8000;
                shoutcast.Password = "passwort";
                shoutcast.PublicFlag = false;
                shoutcast.Genre = "Alles *g*";
                shoutcast.StationName = "Kravis Server";
                shoutcast.Url = "";
                shoutcast.Aim = "";
                shoutcast.Icq = "";
                shoutcast.Irc = "";
                server = shoutcast;
                server.SongTitle = t.artist + " - " + t.title;
                if (_broadCast != null && _broadCast.IsConnected)
                {
                    _broadCast.Disconnect();
                }
                GC.Collect();
                _broadCast = new BroadCast(server);
                _broadCast.AutoReconnect = true;
                _broadCast.ReconnectTimeout = 5;
                _broadCast.AutoConnect();
            }
            

Dann ist das lied zu ende und es passiert folgendes:


 Bass.BASS_StreamFree(stream);
stream = 0;
stream = Bass.BASS_StreamCreateFile(@Pfad, 0L, 0L, BASSFlag.BASS_DEFAULT);
Bass.BASS_ChannelPlay(stream, false);

//Nun das wieder Connecten
if (_broadCast.IsConnected) 
                {
                    UpdateServerstream();
                }

//Hier meine Methoade dazu
    public void UpdateServerstream()
        {
            _broadCast.Disconnect();
            lame = new EncoderLAME(stream);
            lame.InputFile = null;	//STDIN
            lame.OutputFile = null;	//STDOUT
            lame.LAME_Bitrate = 128;
            lame.LAME_Mode = EncoderLAME.LAMEMode.Default;
            lame.LAME_TargetSampleRate = (int)EncoderLAME.SAMPLERATE.Hz_44100;
            lame.LAME_Quality = EncoderLAME.LAMEQuality.Q0;
            if (lame.EncoderExists)
            {
                encoder = lame;
            }
            //Server
            shoutcast = new SHOUTcast(encoder, true);
            shoutcast.ServerAddress = "127.0.0.1";
            shoutcast.ServerPort = 8000;
            shoutcast.Password = "passwort";
            shoutcast.PublicFlag = false;
            shoutcast.Genre = "Alles *g*";
            shoutcast.StationName = "Kravis Server";
            shoutcast.Url = "";
            shoutcast.Aim = "";
            shoutcast.Icq = "";
            shoutcast.Irc = "";
            server = shoutcast;
            server.SongTitle = t.artist + " - " + t.title;
            if (_broadCast != null && _broadCast.IsConnected)
            {
                _broadCast.Disconnect();
            }
            GC.Collect();
            _broadCast = new BroadCast(server);
            _broadCast.AutoReconnect = true;
            _broadCast.ReconnectTimeout = 5;
            _broadCast.AutoConnect();
        }

Wie gesagt, ist ne Brechstangenmethode, funzt aber nicht zufriedenstellend. Wäre schick wenn da jemand ne Idee hat wie ich das vll noch anders machen kann ohne immer neu connecten zu müssen.

Erstellt vor 16 Jahren

Hallo. Ich habe ein Problem. Ich möchte einen Audiostream an einen Shoutcastserver senden. Das aufnehmen klappt auch wunderbar, allerdings werden Eingänge und Ausgänge meiner Soundkarte aufgenommen. Ich will ja nicht dass mein Mic oder meine Wave-Eigentschft der Soundkarte an den Server gestreamt werden sondern der Audiostream der abgespielt wird.

Hier mein Code mit dem es schonmal klappt:

using System;
using System.Xml;
using System.IO;
using System.Threading;
using System.Net;
using System.Text;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using Un4seen.Bass;
using Un4seen.Bass.AddOn.Enc;
using Un4seen.Bass.AddOn.Tags;
using Un4seen.Bass.Misc;

namespace TestStream
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // LOCAL VARS
        public BroadCast _broadCast = null;
        int kbps = 128;
        SimpleBassPlay s = new SimpleBassPlay(); //s.stream ist der standart Audiostream von Bass.NET
        int _recHandle = 0;
        RECORDPROC _rec = null; 
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                if (!Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, this.Handle, null))
                    MessageBox.Show(this, "Bass_Init error!");

               
                s.InitialBass();
                s.Play("1.mp3");
                s.SetLautstärke(0);
                Bass.BASS_RecordInit(-1);
                _rec = new RECORDPROC(RecordingHandler);
                _recHandle = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_DEFAULT,_rec , IntPtr.Zero);
            }
            catch (System.Exception) 
            {
                MessageBox.Show("Fehler im Load");
            }
        }
        private bool RecordingHandler(int handle, IntPtr buffer, int length, IntPtr user)
        {
            return true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
           
               
                

                IBaseEncoder encoder = null;
                IStreamingServer server = null;
                // MP3
                EncoderLAME lame = new EncoderLAME(_recHandle);
                lame.InputFile = null;	//STDIN
                lame.OutputFile = null;	//STDOUT
                lame.LAME_Bitrate = kbps;
                lame.LAME_Mode = EncoderLAME.LAMEMode.Default;
                lame.LAME_TargetSampleRate = (int)EncoderLAME.SAMPLERATE.Hz_44100;
                lame.LAME_Quality = EncoderLAME.LAMEQuality.Q0;
                if (lame.EncoderExists)
                {
                    encoder = lame;
                }
                else
                {
                    MessageBox.Show(this, "LAME.EXE can not be found or does not exist!\r\n\r\nMake sure it exists in your executable directory.");
                    return;
                }
                //Server
                SHOUTcast shoutcast = new SHOUTcast(encoder, true);
                shoutcast.ServerAddress = "127.0.0.1";
                shoutcast.ServerPort = 8000;
                shoutcast.Password = "meinPasswort";
                shoutcast.PublicFlag = false;
                shoutcast.Genre = "Hörspiel";
                shoutcast.StationName = "Kravis Server";
                shoutcast.Url = "";
                shoutcast.Aim = "";
                shoutcast.Icq = "";
                shoutcast.Irc = "";
                server = shoutcast;

                server.SongTitle = "BASS.NET";

                // disconnect, if connected
                if (_broadCast != null && _broadCast.IsConnected)
                {
                    _broadCast.Disconnect();
                }
                _broadCast = null;
                GC.Collect();
                _broadCast = new BroadCast(server);
                _broadCast.AutoReconnect = true;
                _broadCast.ReconnectTimeout = 5;
                _broadCast.AutoConnect();
                timer1.Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (_broadCast != null && _broadCast.IsConnected)
            {
                _broadCast.Disconnect();
                _broadCast = null;
                GC.Collect();
            }

            Bass.BASS_Stop();
            Bass.BASS_Free();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
           label1.Text = (_broadCast.TotalBytesSend / 1024).ToString();
        }
    
    }
}

Wie bekomme ich jetzt meinen Stream s.stream in das Recording?

Vielen dank schonmal an dieser Stelle für eure Antworten

Liebe Grüsse

Kravnos

Erstellt vor 16 Jahren

Ich denke ich habe mich etwas "komisch" ausgedrückt, ich möchte einen Internetradiosender "rippen" halt nur nicht auf die Platte sondern erstmal in den RAM und dann bei badarf auf die Platte. Ich hoff das ist verständlicher als das Kauderwelsch oben und es kann mir jemand helfen. Habe auch schon einen Hinweis hier gefunden dass es mit HttPWeBRequest gehen soll, Aber immer wenn ich das probier, erhalte ich ne Fehlermeldung. Irgendwer muss mir helfen bevor ich irre werde g

Liebe Grüsse

Kravnos