Encoding to h264/aac mp4 for N8x0 with Linux
Updated script available since 02.08.2008!
I tried a while and searched through internettablettalk forums but now I have a solution for converting almost any video source to h264/aac mp4 playable with n8x0s default Media Player (OS2008) using linux tools. I have written a little script to make it easier to convert stuff for the Tablet.
Necessary Tools
These are the tools used:
- mplayer
- faac
- x264
- mp4creator
The Script
save this code into a file, e.g. n800-encode.sh and make it executable (do chmod +x n800-encode.sh on a shell).
You can also download the script here: n800-encode_02082008.zip
#!/bin/bash
_INFILE="$1"
_OUTFILE="$2"
_MPOPTS="$3"
identifySource()
{
mplayer -identify -ao null -vo null -endpos 2 ${_MPOPTS} "${_INFILE}" | grep ID_ > /tmp/n800-encode.$$.ident
FPS=$(cat /tmp/n800-encode.$$.ident | grep ID_VIDEO_FPS | uniq | cut -d '=' -f 2)
ASPECT=$(cat /tmp/n800-encode.$$.ident | grep ID_VIDEO_ASPECT | tail -n 1 | cut -d '=' -f 2 | cut -d ' ' -f 2)
WS=`expr $ASPECT \> 1.6 \& $ASPECT \< 1.9`
if [[ `expr $ASPECT \> 2.0` -eq 1 ]]
then
WS=2
fi
case ${WS} in
0) SCALE="320:240"
echo "encoding for standard"
;;
1) SCALE="400:224"
echo "encoding for widescreen"
;;
2) SCALE="400:192"
echo "encoding for extra-widescreen"
;;
esac
}
encode()
{
x264 -o "$PWD/n800-encode.$$/video.264" "$PWD/n800-encode.$$/video.y4m" --threads 3 --no-cabac --bitrate 250 -A i4x4,p4x4,p8x8,b8x8 --level 1.2 >/dev/null 2>/dev/null &
faac -b 96 --mpeg-vers 4 -o "$PWD/n800-encode.$$/audio.aac" "$PWD/n800-encode.$$/audio.wav" 2>/dev/null >/dev/null&
sleep 1
mplayer -vf scale=${SCALE},unsharp=c4x4:0.3:l5x5:0.5 -ao pcm:file="$PWD/n800-encode.$$/audio.wav" -vo yuv4mpeg:file="$PWD/n800-encode.$$/video.y4m" -ass -embeddedfonts -noframedrop ${_MPOPTS} "${_INFILE}"
rm -f "${_OUTFILE}"
mp4creator -create "$PWD/n800-encode.$$/audio.aac" "${_OUTFILE}"
mp4creator -create "$PWD/n800-encode.$$/video.264" -r ${FPS} "${_OUTFILE}"
}
prepareTemp()
{
mkdir -p "$PWD/n800-encode.$$"
mkfifo "$PWD/n800-encode.$$/video.y4m"
mkfifo "$PWD/n800-encode.$$/audio.wav"
}
cleanupTemp()
{
rm -Rf "$PWD/n800-encode.$$"
rm -f /tmp/n800-encode.$$.ident
}
trap cleanupTemp SIGINT SIGTERM
identifySource
prepareTemp
encode
cleanupTemp
Using it
Usage is simple, The script accepts 3 options: first the input, second the output and third any additional options for mplayer. Some examples:
- encode test.avi into test.mp4:
n800-encode.sh test.avi test.mp4
- encode test.avi into test.mp4 telling mplayer to render the first subtitle track and the second audio track:
n800-encode.sh test.avi test.mp4 "-sid 0 -aid 1"
Note: all options for mplayer have to be enclosed into one pair of “
