[mythtv-users] Mythtube: Internet Video on Demand
Jeff volckaert
jvolckaert at gmail.com
Sat Nov 4 12:20:12 UTC 2006
Hello Everybody,
I have created a userjob and webpage to play Myth videos in a browser
over the internet. I call it MythTube. It's very simple to setup and
plays video great. Each flash video is about 80M for an hour long
show (minus commercials). It consists of a php page, a transcode
script, and a flash player. I run the transcode job after the remove
commercials script from the Wiki. The remove commercials may be
important as I saw comments about B-Frames being a problem with
mencoder. I believe lossless transcoding removes any B-Frames.
To setup Mythtube, first create a directory under your webserver
called mythtube. Mine was "/data/www/html/mythtube". You will need
to change any references below to whatever your directory is.
Next, get flvplayer.swf. Download
http://www.jeroenwijering.com/upload/flash_flv_player.zip and move
flash_flv_player/extras/flvplayer.swf into your mythtube directory
under your webserver.
Then create "play.php" and put it in the mythtube directory as well.
Here's play.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
<head>
<title>Welcome to MythTube!</title>
</head>
<body bgcolor="#002650">
<h3>Now playing: <?php echo $_GET["movie"]; ?></h3>
<br>
<div style="text-align: center;">
<object type="application/x-shockwave-flash" width="<?php echo
$_GET["h"]; ?>" height="<?php echo $_GET["w"]; ?>"
wmode="transparent" data="flvplayer.swf?file=<?php echo $_GET["movie"]; ?>">
<param name="movie" value="flvplayer.swf?file=<?php echo $_GET["movie"]; ?>" />
<param name="wmode" value="transparent" />
</object>
</div>
<br>
<h3>Videos:</h3>
<table border="1">
<?php
$files = scandir("/data/www/html/mythtube");
// filter for only .flv files
$movies = array();
foreach($files as $file) {
if(substr($file,-4) == ".flv") {
echo "<tr><td>".$file."</td>";
echo "<td><a
href=\"".$PHP_SELF."?movie=".$file."&h=640&w=480\">Large</a></td>";
echo "<td><a
href=\"".$PHP_SELF."?movie=".$file."&h=360&w=240\">Small</a></td></tr>";
$movies[] = $file;
}
}
?>
</table>
</body>
</html>
Next you need to create the userjob which generates the flv files.
Here's the MYSQL commands I used in creating userjob 3:
use mythconverg;
UPDATE settings SET data='/usr/local/bin/flashtranscode %DIR% %FILE%
"%TITLE%" %STARTTIME%' WHERE value='UserJob3';
UPDATE settings SET data='Flash Transcode' WHERE value='UserJobDesc3';
UPDATE settings SET data='1' WHERE value='JobAllowUserJob3';
Here's the /usr/local/bin/flashtranscode script:
#!/bin/sh
# flashtranscode
#
# created by Jeff Volckaert (inspired by Zach White)
# modified 11/03/06 to use Flash
VIDEODIR=$1
FILENAME=$2
TITLE=$3
# Remove non-alpha characters from TITLE
TITLE=${TITLE//[^a-zA-Z0-9]/}
STARTTIME=$4
# Sanity checking, to make sure everything is in order.
if [ -z "$VIDEODIR" -o -z "$FILENAME" ]; then
echo "Usage: $0 <VideoDirectory> <FileName> "<Title>" <Starttime>"
exit 5
fi
if [ ! -f $VIDEODIR/$FILENAME ]; then
echo "File does not exist: $VIDEODIR/$FILENAME"
exit 6
fi
# Transcode the file
mencoder -ofps 12 -of lavf -lavfopts
i_certify_that_my_video_stream_does_not_use_b_frames -oac lavc
-lavcopts acodec=mp3:abitrate=32 -channels 1 -srate 22050 -ovc lavc
-lavcopts vcodec=flv:vbitrate=200:cbp:mv0:mbd=2:trell:v4mv:predia=2:dia=2:last_pred=3
-vop spp,scale=360:240,harddup -o
/data/www/html/mythtube/$TITLE-$STARTTIME.flv $VIDEODIR/$FILENAME
# For a smaller file use this instead.
# (It take three times longer to encode though)
# mencoder -ofps 12 -of lavf -lavfopts
i_certify_that_my_video_stream_does_not_use_b_frames -oac lavc
-lavcopts acodec=mp3:abitrate=32 -channels 1 -srate 22050 -ovc lavc
-lavcopts vcodec=flv:vbitrate=100:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=0:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2
-vop spp,scale=320:240 -o
/data/www/html/mythtube/$TITLE-$STARTTIME-2.flv $VIDEODIR/$FILENAME
# Uncomment this if you want to insert MetaData tags into the file
# /usr/bin/flvtool2/flvtool2 -U /data/www/html/mythtube/$TITLE-$STARTTIME.flv
ERROR=$?
if [ $ERROR -ne 0 ]; then
echo "Transcoding failed for ${FILENAME} with error $ERROR"
exit 3
fi
After at least one file has been transcoded you can pull up the
play.php page and start watching video.
Enjoy,
Jeff
More information about the mythtv-users
mailing list