We are working on setting Roku up to be a set top box for an all IP-TV delivery system, so I thought I would share the progress from yesterday.
Since "professional" encoders often use consumer cards, linux software and marketing "magic" to squeeze $8,000/stream out of content providers, we are going to go a different direction.
Progress So Far:
The architecture is simple:
Video Source (HD Receiver, Sat Feed, Over-Air, DVD Player, AVI Archives, Etc.) Composite Out -> Hauppauge HD-PVR or HDHomeRun Tech Dual
Decoder USB 2.0 (or *.ts IP stream) -> Debian Lenny
Debian Lenny -> IP Network
IP Network -> Roku
Roku -> HDTV
The Decoder is COTS, so most of the work is going to be on Debian:
Configure ffserver. (Not as easy as it sounds, but an example below)
Pump the video into the local ffserver:
nohup ffmpeg -i /dev/video0 http://localhost:8090/feed1.ffm &
Now connect to the remote machine using (in this case) Media Center Classic.
File > Open File > http://IPADDRESS:8090/test.asf
The example below encodes the stream as mpeg4, but it can be encoded as H.264. The Roku box is then set to connect to the stream (haven't got that part working[started] yet).
ffserver even supports multiple output formats from the same input stream.
This approach is open source, relatively simple, and will allow you to encode broadbast HDTV, satallite fed HDTV, or output from a DVD player, or Fixed Camera.
We are now working with content providers to license the content. Restrictions are handled at the network level. Available to fiber members only at this time.
EXAMPLE ffserver setup. (Obviously final version will be of higher quality, however, be careful with lame. Bitrates above 41000 are flakey)
Port 8090
# bind to all IPs aliased or not
BindAddress 0.0.0.0
# max number of simultaneous clients
MaxClients 1000
# max bandwidth per-client (kb/s)
MaxBandwidth 10000
# Suppress that if you want to launch ffserver as a daemon.
NoDaemon
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 10M
</Feed>
# ASF output - for media player classic
<Stream test.asf>
# the source feed
Feed feed1.ffm
# the output stream format - ASF
Format asf
VideoCodec mpeg4
# this must match the ffmpeg -r argument
VideoFrameRate 15
# generally leave this is a large number
VideoBufferSize 100000
# another quality tweak
VideoBitRate 768
# quality ranges - 1-31 (1 = best, 31 = worst)
VideoQMin 1
VideoQMax 5
VideoSize 352x240
# this sets how many seconds in past to start
PreRoll 0
# Audio Codec
AudioCodec libmp3lame
AudioBitRate 56
AudioChannels 2
AudioSampleRate 24000
</Stream>
<Stream stat.html>
Format status
# Only allow local people to get the status
ACL allow localhost
ACL allow 10.129.0.1 10.129.0.254
</Stream>