Archive

Archive for the ‘Multimedia’ Category

Open source DJ mixxx’ing

January 6th, 2008 Wesley 3 comments

Sinds vorige week ben ik begonnen met mee te helpen aan de ontwikkeling van het open source DJ programma mixxx. Mixxx is een stabiel programma waarmee men live muziek kan mixen. Het heeft een aantal zeer interessante features, zoals bijvoorbeeld automatische ritmedetectie en ondersteuning voor een heleboel hardware.

Mixxx 1.6.0 with Collusion/WS/Green skin

Waar staan we vandaag? 1.6.0

Ik werk mee aan de nieuwe versie waarvan twee weken geleden een eerste bètaversie werd gelanceerd. Voor de nieuwe 1.6.0 versie zijn een heleboel nieuwe features gepland. Ik som even de belangrijkste veranderingen op:

  • Scratchen via timecoded vinyl-platen [ link naar flash video 1, video 2 ]
  • Kleurenschema’s voor skins
  • Nieuwe muziekbibliotheek (muziekbrowser)
  • Verbeterde ritmedetectie
  • Verbeterde ondersteuning voor MIDI-controllers (hardware)
  • HQ-equalizer toegevoegd
  • Audio core herschreven/vernieuwd
  • Ondersteuning voor LADSPA geluidseffecten
  • Live broadcasten over internet (Icecast, Shoutcast)
  • Rechtstreeks opnemen naar MP3, Ogg Vorbis, Wav, Flac

Ik werk momenteel aan de laatste twee punten. Het is niet zeker of het helemaal af zal raken voor de Hardy freeze in februari (het moment waarop programma’s naar Ubuntu 8.04 Hardy Heron geupload worden en niet meer aangepast mogen worden) maar Ogg Vorbis Icecast/Shoutcast-ondersteuning is zo goed als af, dus dat zal er waarschijnlijk zeker inzitten.

Zelf kijk ik uit naar de ondersteuning voor LADSPA geluidseffecten, maar ik vermoed dat dat niet af zal raken voor de 1.6.0-versie. Dan maar wat langer wachten…

Evolutie van de broadcasting code

Mixxx Live Broadcasting Preferences

Zoals eerder gezegd ben ik momenteel bezig met het implementeren van Icecast/Shoutcast ondersteuning zodat we een mix rechtstreeks over internet kunnen broadcasten. Aanvankelijk dachten we dat het simpel zou zijn om dit systeem te implementeren (gewoon libshout gebruiken) maar al snel bleek dat we eerst nog een encoder moesten schrijven. Ik ben de laatste dagen dus vooral bezig geweest met het schrijven van een Ogg Vorbis-encoder met behulp van libvorbis, libogg en libvorbisenc.

Afgezien van het feit dat er voor libvorbis geen technische API-documentatie beschikbaar is, is het ons uiteindelijk toch gelukt om de encoder werkend te krijgen. Alles ging goed, maar de audio latency was nu wel verhoogd omdat de ‘audio callback thread’ voor een korte periode geblokkeerd werd wanneer de encoder zijn werk deed. Toen we ook nog beseften dat we om metadata te updaten een nieuwe stream moesten initialiseren was het onvermijdelijk om een nieuw systeem te ontwerpen om de encoder parallel in een aparte thread te laten draaien (multithreaded) met een eigen buffer.

Albert ging hiermee aan de slag en na twee of drie dagen knoeien presenteerde hij een nieuwe ‘engine’ (de SideChain-engine) aan ons die de audio buffert voor andere engines (zoals de broadcast engine) en deze engines in een aparte thread draait. Het resultaat is lage audio latency en geen enkel performanceprobleem meer. Ook werd het totale CPU-verbruik verlaagd omdat de encoder nu iets minder vaak aangeroepen wordt.

Om het schematisch voor te stellen:

voor: [ afbeelding: Oorspronkelijke Broadcast Implementatie ]
na:
[ afbeelding: Threaded Broadcast Implementatie ]

Wat moet er nog gedaan worden? De SideChain-engine moet nog een klein beetje aangepast worden, er moet nog een MP3-encoder worden geschreven, het instellingenvenster moet afgemaakt worden, en tenslotte moet de code wat opgeschoond worden, en moet alles grondig getest worden!

VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

Neem je Linux (of Wine) games op!

December 27th, 2007 Wesley 2 comments

Het laatste jaar zijn er twee projecten ontstaan die het mogelijk maken om OpenGL en Alsa op te nemen zonder al te veel verlies van performance. Voor de gamers die niet weten waarover ik het heb: dit is bij wijze van spreken ‘FRAPS for Linux’. Ik heb beide projecten uitgetest en ze werken allebei prachtig: yukon en glc.

glc recording

Klik hier voor de volledige video-opname op YouTube

Dit is Aquaria Demo in Wine
opgenomen met glc op 1024×768
met Compiz ingeschakeld.

Je bent vrij om te gebruiken wat voor jou het beste werkt:

Persoonlijk ben ik momenteel voorstander van glc omdat de ontwikkelaar zéér snel is met het reageren op bugreports en omdat glc is geoptimaliseerd voor multi-core systemen. Ook heeft glc enkele speciale mogelijkheden zoals on-the-fly color conversion van BGR naar YV12 (geeft grotere compressie) en je kan zowel QuickLZ als LZO gebruiken om de stream on-the-fly te comprimeren. Een andere speciale feature van glc is de mogelijkheid om meerdere OpenGL of Alsa streams tegelijkertijd op te nemen.

glc werkte perfect bij mij, maar ik had een klein probleem met het opnemen van sommige games in Wine (problemen met audio en af en toe een crash). Na een kort gesprek met de ontwikkelaar (nullkey) en na het opsturen van enkele gdb traces werd het probleem binnen 10 minuten volledig opgelost door de ontwikkelaar. Prachtig, toch? De nieuwste versie van glc is momenteel 0.4.4 en bevat de Wine patches.

VN:F [1.6.3_896]
Rating: 0 (from 0 votes)
Categories: Linux, Multimedia

SMPlayer Overlay Patches

December 9th, 2007 Wesley 2 comments

SMPlayer Time Overlay Patch

Ik ben bezig aan een patch voor SMPlayer voor mezelf:

  1. ik wil de huidige tijd kunnen zien zonder full-screen te verlaten (en zonder een klok te kopen) – zoals je kan zien op de bovenstaande screenshot heb ik dat reeds voor elkaar gekregen.
  2. ik wil de afspeeltijd van de film als een klein balkje op het scherm zien, niet via het tekstuele OSD, en ik wil eveneens de film kunnen doorspoelen door op een willekeurige plaats op mijn mooie alpha-transparante balk te klikken… want dat is veel mooier dan zo’n uitschuivend balkje dat je video naar boven duwt :)

Technische details:

  • mplayer gepatched en gecompileerd met vf_overlay patch
  • QPainter (van Qt 4.3) tekent de klok en tekst
  • getekende bitmap wordt vertaald naar het benodigde formaat en naar een gedeelde geheugenplek geschreven
  • mplayer (vf_overlay) leest de bitmap uit en legt hem over de video heen
  • mediaspeler waar de patch in wordt ontwikkeld is SMPlayer (mplayer frontend)

Ik denk niet dat ik deze patch upstream zal opsturen, tenzij er veel vraag naar is. De reden daarvoor is simpelweg dat je een onofficiële mplayer patch nodig hebt (vf_overlay patch) om van deze patch gebruik te maken, en (ik maak een gok) 95% van de smplayer-gebruikers zijn dus sowieso niets met deze patch.

Ik ben wel van plan om de patch op het forum van SMPlayer te plaatsen voor degenen die het eens willen bekijken of zelf willen proberen, maar de patch is momenteel nog niet in een “releasebare” status.

VN:F [1.6.3_896]
Rating: 0 (from 0 votes)
Categories: C++, Linux, Multimedia, Programming, Qt

Geautomatiseerde smplayer compilatie met Bash en chroots

June 8th, 2007 Wesley 4 comments

Vollen bak examens! En daardoor heb ik beseft dat het te lang duurt om elke week zeven nieuwe smplayer pakketten te compileren (zeven verschillende versies) Het is echt geen pretje om dit handmatig te doen. Er moeten telkens heel wat files aangepast/verplaatst worden etc. En een menselijke fout is ook nogal snel gemaakt :)

Konsole (Bash)

Dus wat doe je dan als oplossing?

  • Je stelt chroots in voor een dapper en edgy compileeromgeving zodat je geen andere computers (of een reboot naar een andere installatie) nodig hebt om pakketten voor dapper en edgy te compileren. (dit had ik al vanaf het begin gedaan, maar voor de volledigheid vermeld ik het nog een keer)
  • Je maakt een krachtig Bash script om de pakketten te compileren in jouw plaats.

Chroots

Een chroot is een map op je systeem waarin je kan chrooten, dat wil zeggen dat je als root directory dan die bepaalde map gebruikt. Chroots worden vaak gebruikt als een effectieve sandbox methode (om bijvoorbeeld een server optimaal te beveiligen door de webserver op die server te chrooten; hierdoor kan de webserver niets doen wat buiten de chroot omgeving ligt)

In mijn geval heb ik een hele lichte basisversie van Ubuntu Dapper Drake en Ubuntu Edgy Eft in een chroot gestoken, en daarna in elke installatie de nodige libraries (softwarebibliotheken) en compileerprogramma’s geïnstalleerd. Hierdoor kan ik software compileren voor Dapper Drake en Edgy Eft op een Feisty Fawn systeem.

Bash script

Hieronder bevindt zich het bash script dat ik gebruik om mijn pakketten te compileren. Het is maar heel snel in elkaar geflanst, maar het doet zijn werk goed genoeg :)

#!/bin/bash

## Little custom hacked together bash script to compile
## SMPlayer in every possible way for Ubuntu
##
##   - Feisty: qt3; qt3/kde; qt4
##   - Edgy: qt3; qt3/kde (needs chroot)
##   - Dapper: qt3; qt3/kde (needs chroot)
##
##   Usage: create-smplayer-packages sourcecode.tar.gz
##
##               -- Wesley Stessens (wesley@ubuntu.com)

echo -e "\e[1;34mPREPARING SCRIPT...\e[0m"

p="$@"

# strip .tar.gz extension
d=${p:0:${#p}-7}

# figure out deb package names
deb=`echo $d|sed 's/-/_/'`_i386.deb
kdeb=`echo $d|sed 's/-/-kde_/'`_i386.deb
q4deb=`echo $d|sed 's/-/-qt4_/'`_i386.deb

echo -e "\e[1;34mCOPYING PACKAGES...\e[0m"

# copy package to dev dirs
cp $p /media/exthome/dev/$p
cp $p /media/exthome/dapper/media/dev/$p
cp $p /media/exthome/edgy/media/dev/$p

echo -e "\e[1;34mEXTRACTING PACKAGES...\e[0m"

# extract packages
cd /media/exthome/dev
tar zxf /media/exthome/dev/$p
cd /media/exthome/dapper/media/dev
tar zxf /media/exthome/dapper/media/dev/$p
cd /media/exthome/edgy/media/dev
tar zxf /media/exthome/edgy/media/dev/$p

# cd + rename debian directory
cd /media/exthome/dev/$d
mv debian-rvm debian

echo -e "\e[1;34mBUILDING SMPLAYER FOR FEISTY/QT3...\e[0m"

if [ -e "/media/exthome/dev/packages/feisty/$deb" ]; then
	echo -e "\e[1;31mFile $deb already exists in /media/exthome/dev/packages/feisty... Skipping.\e[0m"
else
	# build feisty: qt3
	debian/rules binary > /dev/null
	mv /media/exthome/dev/$deb /media/exthome/dev/packages/feisty/$deb
fi

echo -e "\e[1;34mBUILDING SMPLAYER FOR FEISTY/QT3/KDE...\e[0m"

if [ -e "/media/exthome/dev/packages/feisty/$kdeb" ]; then
	echo -e "\e[1;31mFile $kdeb already exists in /media/exthome/dev/packages/feisty... Skipping.\e[0m"
else
	# build feisty: qt3/kde
	cd /media/exthome/dev/$d
	# backup rules file to rules.orig
	cp debian/rules ../rules.orig
	# remove old compile files
	rm -Rf src/.moc src/.obj src/.ui
	cd src
	make clean
	cd ..
	make clean
	# add kde support to rules file
	sed 's/$(MAKE) PREFIX=\/usr/$(MAKE) PREFIX=\/usr KDE_SUPPORT=1 KDE_INCLUDE_PATH=\/usr\/include\/kde/' < ../rules.orig > debian/rules
	debian/rules binary > /dev/null
	mv /media/exthome/dev/$deb /media/exthome/dev/packages/feisty/$kdeb
fi

echo -e "\e[1;34mBUILDING SMPLAYER FOR FEISTY/QT4...\e[0m"

if [  -e "/media/exthome/dev/packages/feisty/$q4deb" ]; then
	echo -e "\e[1;31mFile $q4deb already exists in /media/exthome/dev/packages/feisty... Skipping.\e[0m"
else
	# build feisty: qt4
	cd /media/exthome/dev/$d
	# remove old compile files
	rm -Rf src/.moc src/.obj src/.ui
	cd src
	make clean
	cd ..
	make clean
	# add qt4 support to rules file; remove qt3 support
	sed 's/# Qt 3/$(MAKE) prep/' < ../rules.orig > debian/rules
	sed -i 's/$(MAKE) PREFIX=\/usr/$(MAKE) PREFIX=\/usr QMAKE=qmake-qt4/' debian/rules
	debian/rules binary > /dev/null
	mv /media/exthome/dev/$deb /media/exthome/dev/packages/feisty/$q4deb
fi

echo -e "\e[1;34mBUILDING SMPLAYER FOR EDGY/QT3...\e[0m"

# Fix directory names
mv /media/exthome/edgy/media/dev/$d/debian-rvm /media/exthome/edgy/media/dev/$d/debian
mv /media/exthome/dapper/media/dev/$d/debian-rvm /media/exthome/dapper/media/dev/$d/debian

if [ -e "/media/exthome/dev/packages/edgy/$deb" ]; then
	echo -e "\e[1;31mFile $deb already exists in /media/exthome/dev/packages/edgy... Skipping.\e[0m"
else
	# build edgy: qt3
	# prepare script for chroot
	echo "cd /media/dev/$d" > /media/exthome/edgy/usr/local/bin/bsmplayerqt3
	echo "debian/rules binary > /dev/null" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3
	echo "exit 0" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3
	# do chroot
	chroot /media/exthome/edgy /bin/bash bsmplayerqt3
	# move package out of chroot
	mv /media/exthome/edgy/media/dev/$deb /media/exthome/dev/packages/edgy/$deb
fi

echo -e "\e[1;34mBUILDING SMPLAYER FOR EDGY/QT3/KDE...\e[0m"

if [ -e "/media/exthome/dev/packages/edgy/$kdeb" ]; then
	echo -e "\e[1;31mFile $kdeb already exists in /media/exthome/dev/packages/edgy... Skipping.\e[0m"
else
	# build edgy: qt3/kde
	# prepare script for chroot
	echo "cd /media/dev/$d" > /media/exthome/edgy/usr/local/bin/bsmplayerqt3kde
	echo "cp debian/rules ../rules.orig" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3kde
	echo "rm -Rf src/.moc src/.obj src/.ui; cd src; make clean; cd ..; make clean" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3kde
	echo "sed 's/\$(MAKE) PREFIX=\/usr/\$(MAKE) PREFIX=\/usr KDE_SUPPORT=1 KDE_INCLUDE_PATH=\/usr\/include\/kde/' < ../rules.orig > debian/rules" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3kde
	echo "debian/rules binary > /dev/null" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3kde
	echo "exit 0" >> /media/exthome/edgy/usr/local/bin/bsmplayerqt3kde
	# do chroot
	chroot /media/exthome/edgy /bin/bash bsmplayerqt3kde
	# move package out of chroot
	mv /media/exthome/edgy/media/dev/$deb /media/exthome/dev/packages/edgy/$kdeb
fi

echo -e "\e[1;34mBUILDING SMPLAYER FOR DAPPER/QT3...\e[0m"

if [ -e "/media/exthome/dev/packages/dapper/$deb" ]; then
	echo -e "\e[1;31mFile $deb already exists in /media/exthome/dev/packages/dapper... Skipping.\e[0m"
else
	# build dapper: qt3
	# prepare script for chroot
	echo "cd /media/dev/$d" > /media/exthome/dapper/usr/local/bin/bsmplayerqt3
	echo "debian/rules binary > /dev/null" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3
	echo "exit 0" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3
	# do chroot
	chroot /media/exthome/dapper /bin/bash bsmplayerqt3
	# move package out of chroot
	mv /media/exthome/dapper/media/dev/$deb /media/exthome/dev/packages/dapper/$deb
fi

echo -e "\e[1;34mBUILDING SMPLAYER FOR DAPPER/QT3/KDE...\e[0m"

if [ -e "/media/exthome/dev/packages/dapper/$kdeb" ]; then
	echo -e "\e[1;31mFile $kdeb already exists in /media/exthome/dev/packages/dapper... Skipping.\e[0m"
else
	# build dapper: qt3/kde
	# prepare script for chroot
	echo "cd /media/dev/$d" > /media/exthome/dapper/usr/local/bin/bsmplayerqt3kde
	echo "cp debian/rules ../rules.orig" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3kde
	echo "rm -Rf src/.moc src/.obj src/.ui; cd src; make clean; cd ..; make clean" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3kde
	echo "sed 's/\$(MAKE) PREFIX=\/usr/\$(MAKE) PREFIX=\/usr KDE_SUPPORT=1 KDE_INCLUDE_PATH=\/usr\/include\/kde/' < ../rules.orig > debian/rules" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3kde
	echo "debian/rules binary > /dev/null" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3kde
	echo "exit 0" >> /media/exthome/dapper/usr/local/bin/bsmplayerqt3kde
	# do chroot
	chroot /media/exthome/dapper /bin/bash bsmplayerqt3kde
	# move package out of chroot
	mv /media/exthome/dapper/media/dev/$deb /media/exthome/dev/packages/dapper/$kdeb
fi

echo -e "\e[1;34m  -- ThE EnD --  \e[0m"
exit 0
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)
Categories: Linux, Multimedia, Ubuntu

Jack up that volume

November 12th, 2006 Wesley 2 comments

Jack Audio Connection Kit (JACK) is een plezant ding op linux. Hiermee kan je geluidsinvoer/uitvoer van verschillende programma’s naar elkaar routen en op deze manier zijn er erg leuke dingen mogelijk.

Je kan bijvoorbeeld je stem laten vervormen in realtime door door je microfoon (capture) te linken aan een effecten processor zoals het programma Jack-Rack :) Daarnaast kan je dan je gitaar op Line in aansluiten en de line in linken aan een realtime digitale gitaarversterker zoals Creox. Dan gaan we nog een drumcomputer zoals Hydrogen gebruiken voor de drums… En daarna alles aan elkaar koppelen in een Ardour sessie waarmee je alles uiteindelijk kan opnemen en verwerken.

Geniaal? Zeker wel :)

Tip: met realtime patches in de kernel is superlage latency mogelijk, perfect voor professionele geluidsverwerking…

VN:F [1.6.3_896]
Rating: 0 (from 0 votes)
Categories: Linux, Multimedia, Music

Videostream rippen, converteren en op DVD branden

September 7th, 2006 Wesley 2 comments

DVD-REen videostream rippen vanaf het internet, converteren naar MPEG2 DVD formaat en branden op DVD met een DVD menu.

Voor een opdracht van Frans moest ik een streaming wmv (asf) bestand op een normale video DVD zien te krijgen. Met linux is dit natuurlijk easy ;)

edit: Leraar Frans was al jaren op zoek naar iemand die dit klaar kon krijgen en niemand kreeg het klaar met Windows. Eén van de “Windows kenners” van de klas heeft meer dan 10 programma’s geprobeerd zonder succes.

Benodigde programma’s: mplayer, mencoder, mandvd, mkisofs, growisofs

1. mplayer: videostream rippen vanaf het internet en opslaan als een lokaal bestand

mplayer -dumpstream http://viptf1.yacast.net/tf1webcast/septahuit/nappy/nappy_320.wmv?MSWMExt=.asf -dumpfile rip.wmv

2. mencoder: lokaal videobestand converteren naar MPEG2/AC3 en aanpassen om aan Pal DVD normen te voldoen

mencoder -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd -vf scale=352:288,harddup -srate 48000 -af lavcresample=48000 -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:acodec=ac3:abitrate=192:aspect=16/9 -ofps 25 -o dvd.mpg rip.wmv

3. mandvd: dvd menu en dvd directory layout maken

./mandvd

Er start een grafische interface op. Kies een bestemmingsmap en het gewenste formaat. In mijn geval PAL en 352×288.

Ga verder en klik op Voeg een video toe aan uw project.
Kies een video titel en klik op Extract een beeld uit de video om een kleine afbeelding te krijgen voor in het keuzemenu.

Ga verder en kies een achtergrond, eventuele achtergrondmuziek, lettertype.

Ga verder en selecteer de film(s) en klik op Voeg video toe aan menu.

Plaats de thumbnail op de gewenste plaats en vergroot/verklein indien gewenst en kies daarna voor Bevestig positie knop.

Ga verder en klik op Genereer DVD structuur.

Hierna kan u het resultaat bekijken en/of een DVD rechtstreeks branden met K3B.

4. mkisofs: dvd image maken

Ik heb ervoor gekozen om nog extra databestanden toe te voegen aan de DVD door enkele databestanden in de bestemmingsmap van ManDVD te zetten en om daarna de DVD te branden via de commandline. In K3B zit er namelijk een bug in versie 0.12.14 en hierdoor kunnen video DVD’s die gemaakt worden in K3B niet afgespeeld worden. Een nieuwere versie is reeds beschikbaar, maar moet je voorlopig zelf compileren en daar had ik geen zin in :)
edit: Ondertussen zit K3B 0.12.17 in de standaard Ubuntu repositories en daar werkt alles weer perfect :)

mkisofs -dvd-video -o /home/profox/dvd.img /home/profox/bestemmingsmap

5. growisofs: dvd image branden op een DVD-R

growisofs -dvd-compat -Z /dev/dvd=/home/profox/dvd.img -speed=4
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)
Categories: Linux, Multimedia

Audio rippen van eender welk videobestand

September 5th, 2006 Wesley No comments

als je een speciale film of een audiobestand hebt dat je niet kan rippen met je gewone software, maar je kan het wel afspelen met mplayer (aangezien die vrijwel alles kan afspelen…)

dan kan je dit zo doen:

mkfifo sndpipe; oggenc -b 128 sndpipe -o sound_rip.ogg & mplayer -vo null -vc dummy -quiet -ao pcm:file=sndpipe video_of_audio.avi; rm sndpipe

verklaring: mkfifo sndpipe maakt een named pipe aan. oggenc zet zich op de achtergrond klaar om inkomende audio te converten naar 128kbps ogg vorbis, input = rechtstreekse pipeline, output = sound_rip.ogg / Mplayer begint de video/audio af te spelen zonder video output en met dummy video codec. Geen console output (quiet) en audio output wordt via pcm audio output naar de named pipe geschreven. Achteraf de pipe verwijderen en klaar :)

In plaats van oggenc kan je natuurlijk ook lame gebruiken, dan wordt het meteen geconverteerd naar MP3. Maar iedereen weet dat Ogg Vorbis beter is qua kwaliteit/bitrate dan MP3 :)

VN:F [1.6.3_896]
Rating: 0 (from 0 votes)
Categories: Linux, Multimedia, Music