Recently I was co-organizing our Ignite Taipei #2 event (see the pictures and watch the talks – this latter if you speak Chinese…) I try to be the self-proclaimed Chief Technology Officer (CTO) of the event. Either because I hope the tech side of things goes down well, or more likely if things fail then there’s no-one else to blame just myself. And things do indeed fail all the time all different ways.
So as a CTO I try to make sure that everything computer related runs well and I did collect some useful scripts (for that mostly command-line driven way I do things). I thought it would be useful to write them all up, mostly for me to remember, not just the scripts themselves but the rationale of some choices made along the way.
As Ignite’s motto is “Inspire us but make it quick”, I found that that the Ignite organizer’s motto can be “Everything will be just fine.”
Intro
Ignite in short is an evening of quick presentations, each one of them exactly 5 minutes, 20 slides that auto-advance every 15 seconds. Altogether there are 10-16 talks on evening, It aims to be an event for inspiring people, and something that should be relatively straightforward to organize.
Computer setup
I had 2 computers for the event, but those were actually 3 systems:
- A Linux system (Arch Linux), my own computer that I knew very well and run the presentation off.
- A Linux/Windows dual boot system that I borrowed, Windows (Vista of all things) for PPT-PDF conversion and Ubuntu for live streaming.
Pre-event
Most of the organization was done on Google Docs with a shared document, keeping tabs of who we have as speakers, what needs to be done.
Shameless plug: next time it will be even easier with WatchDoc, a Chrome extension I wrote after Ignite to get notification when shared documents change :)
Besides keeping up with what to do, I had to take care of the presentations that the speakers sent to me. Since I’m not a fan of PowerPoint and its unreliability to display things the same way on different computers (and LibreOffice not being ready to handle .ppt/.pptx as well as I’d like it to), I had to convert everything into PDF. People with Mac, using Keynote were easy, they have PDF export. Most people using Windows/MS Office didn’t have. First I installed a “print to PDF” plugin but that was just terrible, awful quality photo conversion and all. In the end I had to get an Office 2007 just for this occasion and use their own Save to PDF add-in, for great good. Actually, it worked like a charm, I just wonder why they didn’t make the same thing for Office 2003 that seems to be much more abundant (I know, 8 years old software has no love). Finally I had everyone’s thing in the same, reliable format, and uploaded to Google Docs and Dropbox, so can transfer it between computers easily.
One more thing I had to do the the slides: add an empty slide on the end of the 20 slides of each presentation, so it’s easy to see when they are finished. Used pdfmanipulate for that. Prepare an empty slide, can use e.g. LibreOffice, export it as empty.pdf
, then having all the talk PDFs in a a sub-directory called “original, run a script like this:
#!/bin/bash
DIR=original
for f in $DIR/*.pdf
do
remf="${f%.pdf}"
newf="${remf##*/}"
echo "${newf}"
pdfmanipulate merge --output="${newf}_extra.pdf" "$f" empty.pdf
Slides
The tech setup in the front; From Ignite Taipei #2 |
There were two kinds of slides to take care of: one with the speakers’ names and their talks titles, the other one is the talks themselves, prepares as described earlier.
The speaker intro slides were done in LibreOffice. Had a little problem with that one as well, as if Chinese characters were set to bold text, they showed up blurred. Not good looking, lot even legible sometimes. So just before start I was scrambling to change all text from bold to normal. It’s just a pain.
The talk slides were shown using Impressive, a command line presentation software written in Python. It is pretty good, quite flexible and easy to set the slide show times, transitions and total time progress bar.
Use the following script saved as e.g. present.sh
to show the talk as present.sh nextalk_extra.pdf
:
#!/bin/bash
# Run the presentation
PRESENTATION="$1"
SLIDETIME=15
TOTALTIME=300
./impressive.py -D 1 \
-a ${SLIDETIME} \
-d ${TOTALTIME} \
-T 350 \
-t CrossFade \
-c persistent \
"${PRESENTATION}"
There are some problems with it, though. Sometimes it took quite a while to show a slide that had a good quality photo, which messed up the timing. The total time didn’t quite work out the way I expected, I think every presentation was a bit longer than 5 minutes overall. Not too big problem., but if I can do right, then I could.
Previously used the Adobe Acrobat Reader’s auto-advance when full screen mode, that was just fine, might go back there next time if I cannot fix Impressive.
Web streaming + recording
A common thing to live-stream Ignite so other people can watch it to. I found it easiest to do with VLC + Justin.TV, they already have some software done that seems to work quite well. The first time I had some sound sync issues, this time managed to fix that, but in the end it didn’t matter.
To do the stream using my Logitech QuickCam S7500 and sound on the line-in from the venue’s sound system, start VLC with the following script:
#!/bin/bash
# http://community.justin.tv/forums/showthread.php?t=7081
# Using webcam + line-in audio
# Display + Transcode (Save + Stream)
# needs jtvlc to get it out
vlc v4l2:///dev/video0 \
:input-slave=alsa://plughw:0,0 \
--sout='#duplicate{dst=display,dst="transcode{venc=x264{keyint=60,idrint=2},vcodec=h264,vb=600,acodec=mp4a,ab=128,channels=1,deinterlaceaudio-sync}:duplicate{dst=standard{access=file,mux=mp4,dst=/home/user/ignite.mpg},dst=rtp{dst=127.0.0.1,port=1234,caching=2000,rtcp-mux,sdp=file:///tmp/vlc.sdp}}"}'
It as some mighty long line and not sure if it can really be wrapped anywhere. Basically it displays the webcam’s picture, transcodes it to x264 and sends it to an rtp socket and saves into a file in the same time. Might want to be careful with this, as the saved file will be overwritten every time the script is run.
The most curious thing is that in the copy that is displayed, the sound is not in sync, but actually the transcoded video is okay.
Next step is sending the stream out to Justin.tv, using jtvlc:
#!/bin/bash
./jtvlc-lin-0.41/jtvlc ${JUSTINTV_USERNAME} ${JUSTINTV_STREAM_KEY} "/tmp/vlc.sdp" -d
Here the username and stream key has to be filled in with your values. If everything’s fine then there’s a big stream of debug information on the screen and on the website the channel goes online.
At our event I had a problem that after reboot somehow the sound input is borked and all out video was without sound, the final saved file couldn’t even be opened. Never mind, fortunately we had recording from a proper camera.
HD recording + postprocessing
It is also essential to have some good recording of the show, since that can make it really reach a wider audience, and it’s good to look back at it later as well.
This time we had a cameraman helping out, and after the talks finished I got the videos from him. He’s using a Sony camera with a FAT32-formatted SD card, which was a nice pain to manage. Last the video we had was straightforward mp4 format, while this time 2Gb chunks of AVHCD, a proprietary format. Had to convert that into something I can manage.
It took a wile to figure out, but in the end the result was acceptable.
1) join the spilt parts with tsMuxeR. Had to make sure I’m using joins, not just listing all the files and saving them as one (sounds like the same thing but it isn’t). In the end I had some “.m2ts” files
2) Next I had to convert those into mp4. The m2ts files had actually h264 video that is good for mp4, so ended up just copying it. The audio had to be transcoded to aac, because the original was ac3 while that’s not accepted audio codec for mp4. Fortunately ffmpeg could handle AVHCD files now. The only really tricky part was that the original video was 1080i – interlaced. Next time have to make sure that the cameraman sets things to progressive, makes life so much easier.
#!/bin/bash
INFILE=$1
OUTFILE=$2
# Start recreating video
ffmpeg -deinterlace \
-i ${INFILE} \
-f mp4 \
-vcodec copy \
-strict experimental \
-acodec aac \
-ab 128k \
-y ${OUTFILE}
This took quite short time, which is a relief, before I figured out that things can be this simple I had transcoded files in hundreds of giga-bytes, and things took hours.
3) Spilt the video for uploading to YouTube. Used Avidemux for that, which can – barely – handle h264 encoded video. Somehow it couldn’t find the key-frames so it decided that every 30th frame must be that and I can only split things there. This resulted in every video having some strange pictures in the beginning (duh, missing keyframe). Might be better with re-encoding, or rather finding a better program to handle h264 video.
Future
Fixing stuff at halftime; From Ignite Taipei #2 |
Of course there are some things to improve next time:
- Better video recording that eases post-processing. Preferably have our own camera that we learn how to use and not have to figure out something new every time
- One a computer is set up and tested, no more reboots
- Check the timing of the slides to make sure they are really 15 seconds each
- Improve Impressive, maybe prepare some patches: exit when presentation finished, show empty screen after last slide, timing issues
- Switch to scripted intro slides so I don’t have to edit each of them to make sure they look the same. Maybe use one of the Javascript web presentation frameworks and a full-screen Chrome window…
- Set up our own website for Ignite. This one is the big one. Should allow us to do a lot of interesting things, but I try get myself to make it first with a few features only, not with all bells and whistles. A WordPress page with some plugins or a full blown Django site or something else? Time will tell…