Use VLC to play multiple video clips on multiple computers in sync en

By Luuk1983 on Saturday 15 June 2013 17:43 - Comments (7)
Category: Software, Views: 41.002

Like most tweakers, this tweaker has way too many hardware which is not being used at the moment. So when it was time to plan my birthday party I decided to utilize the unused computers and even a 37" LCD television. The goal would be to play (music) video clips on multiple screens at the same time and preferably in sync. I found at that achieving this goal is not a walk in the park.

As observed in the title of this blog, I used VLC at the end. But before I choose VLC I tried out some other options. The first option was some kind of remote desktop, like RDP, TeamViewer or similar. But as expected, these protocols are not efficient enough for showing HD video fluently. It is also not an option to use lang cable to attach multiple monitors to one computers. So in the end, the best option would be a video stream, much like a television broadcast, which could be played on multiple computers.

The power of VLC
So when it comes to free streaming software for Windows, VLC is one of the best options as a streaming host. Most people know VLC as a video player which can play virtually anything you throw at it, but I found out that VLC can do much, MUCH more than most people know. VLC has many options for streaming and transcoding. But unfortunately the documentation is seriously lacking. Most documentation is not up to date, missing, or ambiguous. That why I'm writing this blog in English to appeal to more people who are struggling with VLC and streaming.

In this blog I will be using VLC 2.0.6. The target stream is a multicast stream, since this is the most effective way to stream on a network and also because I have a feeling that it's also the only type of stream that can be synchronized on multiple systems, but more about that later.

When using the interface of VLC, it's really easy to start a stream. In the VLC menu, an option 'stream' is available (Ctrl + S). Using the wizard it's really easy to start a stream. But here the first problem surfaces: You can only select one file as the source of the stream. If you select multiple files, only the first file will be used for the stream, if you select a playlist it does not work.

VLC by command prompt - setting up a stream
I found at that VLC has a huge array of start up parameters you can enter at the command prompt when starting VLC. You can actually do things that are not possible to do through the interface. I will explain the steps I took to create a batch file (a windows .bat file) step by step.

On a windows system, VLC is usually located in C:\Program Files\VideoLAN\VLC on 32-bit systems or C:\Program Files (x86)\VideoLAN\VLC on 64-bit systems. A .bat file to simply start VLC would look like this:
cd\program files (x86)\videolan\vlc

As I mentioned at the start of this blog, I want to play multiple video clips. So I decided that I want VLC to load all files from a certain folder in the playlist (in this case the music/clips folder on the S: disk). And now that we're at it, set the playlist to play at random and on loop, so that VLC doesn't ever stop playing:
vlc "file:///s:/music/clips/" --random --loop

In this case all files from a certain folder are loaded, but you can also use a playlist, or stream if you like.

So vlc can now be started from the bat file, clips can be loaded and played at random and loop. But now we need to determin the output, which will be a stream in multicast format. Here I set the ouput as a multicast stream at the multicast IP at port 5004:
vlc "file:///s:/music/clips/" --random --loop --sout="#rtp{dst=,port=5004,mux=ts}"

This however causes a new problem. Unless the files you play are exactly identical in bitrate, codec and all other characteristics, the clients will get disconnected after each played file. To have a continuing stream, it's neccesary to transcode all output in the same format. Transcode needs to be done real-time, so rather powerfull hardware is required. In this case I encode to a 1200kbit MPEG2 output on 1280 x 720 and 256kbit 2 channel audio:
vlc "file:///s:/music/clips/" --random --loop --sout="#transcode{vcodec=mp2v,vb=1200,scale=1,width=1280,height=720,acodec=mpga,ab=256,channels=2,samplerate=44100}:rtp{dst=,port=5004,mux=ts}"

On a Core 2 Duo Q9450, all 4 cores will use around 60% of processing power to do this real time.

Now, we also need to tell VLC that we want to treat all the individual files as a single entity in the output stream, so for the clients it should be a single stream, unaware that it's build from multiple files:
vlc "file:///s:/music/clips/" --random --loop --sout-keep --sout="#transcode{vcodec=mp2v,vb=1200,scale=1,width=1280,height=720,acodec=mpga,ab=256,channels=2,samplerate=44100}:gather:rtp{dst=,port=5004,mux=ts}"

--sout-keep makes sure the stream stays open/available after each file. I'm not sure what 'gather' exactly does, only that it's needed ;)

One thing remains, By default, it's possible that the steam will not take more than one hop on the network, meaning the stream will stop at the first router and not go further. Setting the TTL (Time To Live), makes sure that the stream will also cross routers:
vlc "file:///s:/music/clips/" --random --loop --ttl="5" --sout-keep --sout="#transcode{vcodec=mp2v,vb=1200,scale=1,width=1280,height=720,acodec=mpga,ab=256,channels=2,samplerate=44100}:gather:rtp{dst=,port=5004,mux=ts,ttl=5}"

You're now able to start a stream. Make sure your router support multicast and make sure the required port is open on the firewall.

VLC by command prompt - playing the stream.... in sync
Playing a stream in VLC player is really easy. You can open the stream through the user interface by selecting Media > Open Network Stream, and entering: rtp:// This is enough to open the stream.

As usual, this can also be done on through the command prompt:
vlc rtp://

Now if you play this stream on multiple computers (in my case three), the stream will never exactly play in sync. Network latency and even computer speed seem to make a difference. So, we need a way to make sure the computer are in sync. VLC has a option 'Network sync'. This can also be set from the user interface, but I will stick to the command prompt. Please note that the net sync feature is poorly documented and doesn't always work flawlessly.
Network sync works by making one computer the 'netsync master' to which the other computer refer to.
Let's update the startup parameters. We need two bat files: one for the net sync master and one for the netsync 'clients'. And while we're at it, also start the stream fullscreen:

For the master:
vlc rtp:// --fullscreen --control netsync --netsync-master

For the 'clients' who need to sync with the master:
vlc rtp:// --fullscreen --control netsync --netsync-master-ip <IP OF MASTER>

In my experience it's best to first start all the 'clients', THEN the master . If all goes well, the screens should all play in sync. It's possible you will see one of the screens 'hang', but this wil usually correct itself very quickly.

After some research, it's clear that playing video's in perfect sync is very hard to achieve. There are many extremely expensive software suites or hardware solutions to achieve this. So it's nothing short of a miracle that an open source program can do this. Sure it's badly documented and it doesn't work flawlessly, but it's the best you can get without paying some serious money.

I hope you enjoyed learning new things about VLC and using the command prompt. Hopefully, my party will be a success!

Mobiel kwijt? En nu?

Door Luuk1983 op donderdag 14 maart 2013 12:10 - Reacties (31)
Categorie: Software, Views: 16.982

Af en toe lees je van die handige tips waarvan je denkt: goh, daar heb ik eigenlijk nog nooit zo bij stil gedaan. Als het ware een probleem waarvan je niet wist dat je het had en wat je met een kleine moeite kan oplossen. Vandaag kwam ik iets dergelijks tegen en dat wil ik graag met jullie delen.

Want stel, je raakt je mobiele telefoon kwijt. En stel, er is een eerlijke vinder die graag je telefoon wilt terug geven, hoe weet de eerlijke vinder van wie de telefoon is?

Het probleem mag duidelijk zijn. Tegenwoordig wil iedereen graag zijn gegevens veilig houden en heeft daarom logischerwijs iets in de vorm van een lockscreen met code. Maar hoe kan iemand nou zien van wie de telefoon is? Vroeger kon je nog door een adressenboek bladeren, maar door een lockscreen is dat vaak niet meer mogelijk. Het lockscreen dan maar weghalen is ook niet echt een optie, dus wat doe je dan?

Soms liggen de dingen heel erg voor de hand: maak een eigen afbeelding voor je lockscreen met daarop informatie over hoe iemand je kan bereiken. Een (alternatief) telefoonnummer of e-mailadres is eigenlijk al genoeg, zolang iemand maar contact met je kan opnemen. Volgens mij is dit een hele kleine moeite wat een hoop mensen een hoop ellende had kunnen besparen.

Dat wilde ik even met jullie delen.

Met dank aan de Vodafone advertorial op

Viral launch TNT in België

Door Luuk1983 op donderdag 12 april 2012 12:34 - Reacties (12)
Categorie: Overige toelie, Views: 5.196

Om de lancering van de TV-zender TNT in België te promoten is er een hele gave reclamecampagne opgezet. Mochten jullie 'm nog niet gezien hebben, dan raad ik dat zeker aan! Ik ben normaal niet van het plaatsen van YouTube-filmpjes, maar deze vind ik echt te meesterlijk om jullie te onthouden!

OV-chipkaart perikelen

Door Luuk1983 op woensdag 17 augustus 2011 16:20 - Reacties (43)
Categorie: Overige toelie, Views: 9.565

De OV-chipkaart. Iedereen heeft het er wel over gehad. Lek, onhandig en duur zijn veelgebruikte woorden. Maar wat merk je daar zelf van in de praktijk? Ik deze blog mijn ervaring met de OV-chipkaart.

Ik ben nooit echt heel negatief geweest over de OV-chipkaart. Natuurlijk waren er problemen, natuurlijk werd het project veel te duur en natuurlijk was de beveiliging zo lek als een mandje, maar eerlijk is eerlijk: direct merk ik daar als consument weinig van. Ik ben al jaren geleden afgestudeerd, dus de problemen met het activeren van de OV-studentenkaarten heb niet bewust meegemaakt. Ik zag wel hele duidelijke voordelen die zo'n kaart zou kunnen bieden. Wel moet ik er even bij vermelden dat ik voornamelijk met de trein reis, met bussen en trams heb ik beperkte ervaring.

Enfin, om een lang verhaal kort te maken. Op een dag besloot ik dat het wel handig zou zijn om een anonieme OV-chipkaart aan te schaffen. Ik ging wat regelmatiger met de trein en ik vond het handig als ik niet in de rij voor de automaten zou moeten gaan staan.
Het aanschaffen van een anonieme OV-chipkaart kan gewoon bij de automaat en is net zo simpel als het aanschaffen van een kaartje. Ook wat geld op de kaart zetten ging zonder problemen. Eigenlijk best simpel dus allemaal. Totdat je bij het incheckpaaltje komt...

De incheckpaaltjes kunnen twee geluiden maken: een dubbele, subtiele zachte piep in combinatie met een groen lampje en bevestiging van je inchecken, of een hele harde, schelle piep die niet zou misstaan als je illegaal door de alarmpoortjes van een dure kledingzaak loopt met een aanzienlijk deel van de nieuwe collectie. oh ja, en er hoort ook nog een rood lampje bij. Mag je één keer raden... Juist, het rode lampje. Maar verder geen melding van wat er nou precies fout is en waarom het inchecken niet werkt. Volgens mij geeft de gemiddelde Windows foutmelding onderhand meer uitleg over wat er aan de hand is. En je verwacht het niet, maar ook de tweede en derde keer lukte het niet. Van ellende ben ik maar een kaartje uit de automaat gaan halen, omdat ik anders de trein zou missen.

Eenmaal op de bestemming aangekomen had ik wat meer tijd om even bij de automaat te gaan rotzooien met de kaart. Ik moest zelf uitzoeken dat:
  • Je reizen op saldo bij de NS moet activeren
  • Je minimaal 20 euro op de kaart moet hebben staan om überhaupt in te kunnen checken
Nou zijn beide problemen heel simpel om op te lossen en ergens is het minimale saldo van 20 euro goed te begrijpen, maar dat moeten activeren van reizen op saldo bij NS komt nogal vreemd over. Mijn oma zal daar maar gestaan hebben. Of een buitenlandse bezoeker. Het is toch één kaart voor bus, trein en metro? Ijdele hoop...

Maar goed, sindsdien gebruik ik de kaart eigenlijk zonder problemen. Inchecken lukt altijd, saldo opladen lukt altijd. En toen ik een weekendje in Den Haag was (en mijn vriendin ten huwelijk gevraagd heb O-)) bleek de OV-chipkaart prima in de trams te werken. Het enige waarvan ik me afvroeg hoe je dat zou moeten doen is het volgende:
Stel, je hebt iemand met een OV-studentenkaart of iemand met een voordeelurenabonnement, dan mogen er een paar andere mensen op meereizen met korting. Echter, dit kan je alleen bereiken door een kaartje met 40% korting te kopen. Er is geen manier om in te checken met de korting van een ander. Ik zou ook niet weten hoe je dat moet oplossen, maar handig is anders.

Nou wil het zo zijn dat mijn vriendin ergens anders gaat werken en daardoor full-time de auto nodig heeft. Ja, ondergetekende is lief voor z'n meisje en offert zich op en laat haar de auto meenemen. Aangezien ik makkelijk met de trein naar het werk kan, is het zonde om een tweede auto aan te schaffen. Dus wat bedenk je als nuchtere Hollandse tweakert? Dat je een persoonlijke OV-chipkaart gaat halen, daar een maandtrajectkaart op gaat zetten en dat je je anonieme OV-chipkaart gaat verpatsen aan je ouders of schoonouders. En zoals wel vaker klopt de theorie niet bij de praktijk. Even een korte samenvatting van de abonnementen van de NS. De bedenker van de NS-systemen moet in ieder geval een IQ van onder die van zanger Rinus hebben gehad om dit überhaupt te kunnen verzinnen:
  • Een voordeelurenabonnement kan op een 'gewone' persoonlijke OV-chipkaart. Hiermee kan je bij de NS en andere aanbieders op Saldo reizen en krijg je korting buiten de spits bij de NS. Niet interessant voor mij in ieder geval, want ik reis in de spits.
  • Zodra je een ander abonnement hebt worden deze meestal (met uitzondering van maandabonnementen) standaard op een persoonlijke OV-chipkaart geleverd. Zodra er een abonnement op de kaart staan kan je NIET MEER OP SALDO REIZEN met de betreffende kaart bij de NS. Uh...whut? Nou, zodra er een abonnement op de kaart staan kan je NIET MEER OP SALDO REIZEN met de betreffende kaart bij de NS. Maar je kan wel op saldo reizen bij de andere aanbieders. Een quote:
    Ook andere NS-abonnementen - met uitzondering van het Maandabonnement - worden standaard op een OV-chipkaart geleverd. U ziet het aan het OV-chipkaartlogo op de kaart. Het is nu nog niet mogelijk om met deze abonnementen bij NS op saldo te reizen. U blijft dus reizen zoals u gewend bent. Zodra er iets verandert, krijgt u bericht. U kunt met uw OV-chipkaart met NS-abonnement wel bij andere vervoerders op saldo reizen.
    8)7 8)7 8)7 8)7 8)7
Ik in mijn oneindige onschuldigheid dacht toch echt dat het hele idee van de OV-chipkaart was dat je één kaart hebt waar je abonnementen aan kan toevoegen en verwijderen. Bij de NS in ieder geval niet. En er klopt wel meer niet bij de NS. Als je bijvoorbeeld in Nijmegen van de NS-trein overstapt op een Veolia-trein moet je eerst uitchecken bij de NS en inchecken bij Veolia. En als je student bent kan je je 'OV-studentenabonnement' niet op een OV-chipkaart zetten waar al een ander product op staat. En ga zo maar door.

De conclusie lijkt me duidelijk. Bij de NS werkt het hele OV-gebeuren voor geen ene meter. Het instaptarief is vrij hoog met 20 euro, maar dit is nog te begrijpen. En zolang je af en toe met de trein gaat is het handig dat je je niet druk hoeft te maken dat je mogelijk bij de automaat in de rij moet staan. Als je daarbij je saldo gewoon netjes in de gaten houdt en op tijd oplaadt, dan is er weinig aan de hand.
Zodra je ook maar iets meer wil dan dat, dan wordt het onoverzichtelijk, onduidelijk en soms zelf onmogelijk. Laten we het bij de trein gewoon lekker bij kaartjes houden. Dat is waarschijnlijk nog een stuk goedkoper ook.

Bij de metro, bus en tram lijkt de OV-chipkaart meer potentie te hebben. Door de lagere instaptarieven en relatief kleine bedragen is het handig dat je niet met kleingeld hoeft te klooien. Maar er is voorlopig in ieder geval nog geen enkele sprake van één kaart voor bus, trein, tram en metro.

Edit: Nog een mooi artikel over de 'logica' van de OV-chipkaart:

.NET Features: question mark

Door Luuk1983 op donderdag 23 juni 2011 09:03 - Reacties (11)
Categorie: Programmeren, Views: 5.023

Als .NET-programmeur merk ik regelmatig dat andere programmeurs niet op de hoogte zijn van sommige handige en slimme features in het .NET framework die het programmeren een stuk makkelijker kunnen maken. Soms zijn deze features verstopt, of soms zijn ze pas nieuw, maar handig zijn ze altijd. Dit is deel 4 van een serie met kleine voorbeelden van features die je als .NET-programmeur (met name in C#) mogelijk nog niet kent. Deze keer: het vraagteken in C#.

Met het vraagteken kan je in C# een hoop dingen doen. Ik zal een aantal voorbeelden geven van toepassingen van het vraagteken.

Ten eerste kan je het vraagteken gebruiken om objecten die dat standaard niet zijn nullable te maken. Nullable houdt in dat er een null waarde toegekend kan worden. De toepassing hiervan is redelijk beperkt omdat objecten die afstammen van de Object class al nullable zijn, maar dingen zoals een int of bool zijn dat standaard niet.
//This doesn't work
int aNotNullableInt = null;
//This is OK
int? aNullableInt = null;

Je kan nu met .HasValue en .Value controleren of het object null is of niet en wat de waarde dan is.
object foo;
//The long version
if (aNullableInt.HasValue)
    foo = DoSomething(aNullableInt.Value);
    foo = DoSomething(-1);

//The short version that does the same thing
object foo = (aNullableInt.HasValue) ? DoSomething(aNullableInt.Value) : DoSomething(-1);

Als de conditie voor het vraagteken true is zal de code direct achter het vraagteken uitgevoerd worden. Als de conditie false is zal de code direct achter de dubbele punt uitgevoerd worden.

Al laatste is er een constructie met een dubbel vraagteken. Waar de constructie hierboven bedoeld is om middels een conditie optie A of B te laten uitvoeren, is de dubbele vraagteken constructie bedoeld om een alternatieve optie te geven in het geval dat een object null is:
//This is the long version
object newObject;
if (foo != null)
    newObject = foo;
    newObject = new object();

//This is the short version that does the same thing
object newObject = foo ?? new object();

In het geval dat 'foo' null is zal de waarde achter de ?? toegekend worden aan newObject.

Wederom hoop ik dat jullie er wat aan hebben. En wederom zijn suggesties altijd welkom.