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
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
Habe es editiert 😉
Liebe Grüsse
Kravnos
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
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>
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
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.
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
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