Encoding prerecorded video
From Streaming 411
Contents |
Encoding video using ffmpeg
One-pass encoding video MPEG4,h264,h263; audio AAC
Encoding mpeg4 video example:
ffmpeg -i /home/video/U0003765.avi -vcodec mpeg4 -r 12 -s qcif -b 64 -acodec aac -ac 1 -ar 16000 -ab 16 /home/enc/test01.mp4
Where
-vcodec h263- video codec h263-r 12- 12 frame per seconds-s qcif- qcif=176x144 pixels-b 64- 64kbit/s video stream
-acodec aac- audio codec is AAC-ac 1- 1 audio channel (mono)-ar 16000- audio sampling frequency - 16kHz-ab 16- 16kBit/s audio stream
For lower bitrates i used 24kHz/32kBit (-ar 24000 -ab 32) or 16kHz/16kBit (-ar 16000 -ab 16).
Encoding h264 video example:
ffmpeg -i /home/video/U0003765.avi -vcodec h264 -r 12 -s qcif -b 64 -acodec aac -ac 1 -ar 16000 -ab 16 /home/enc/test02.mp4
Encoding h263 video example (QT player required, IMHO, .3gp extension for files with h263 codec):
ffmpeg -i /home/video/U0003765.avi -vcodec h263 -r 12 -s qcif -b 64 -acodec aac -ac 1 -ar 16000 -ab 16 /home/enc/test04.mp4
Two-pass encoding video h263,MPEG4,h264; audio AAC
Using two pass encoding could be VERY usefull to create more smother video. If you have pre-recorded material - use two pass encoding.
MPEG4,AAC (h264 has the same manner):
#pass 1 ffmpeg -i /home/video/U0003773.avi -pass 1 -passlogfile logfile -vcodec mpeg4 -r 12 -s qcif -b 64 -an /home/enc/test04.mp4 #delete temp file rm -f /home/enc/test04.mp4 #pass 2 ffmpeg -i /home/video/U0003773.avi -pass 2 -passlogfile logfile -vcodec mpeg4 -r 12 -s qcif -b 64 -acodec aac -ac 1 -ar 24000 \ -ab 32 /home/enc/test06.3gp
H263,AAC:
#pass 1 ffmpeg -i /home/video/U0003773.avi -pass 1 -passlogfile logfile -vcodec h263 -r 12 -s qcif -b 64 -an /home/enc/test04.mp4 #delete temp file rm -f /home/enc/test06.3gp #pass 2 ffmpeg -i /home/video/U0003773.avi -pass 2 -passlogfile logfile -vcodec h263 -r 12 -s qcif -b 64 -acodec aac -ac 1 -ar 24000 \ -ab 32 /home/enc/test06.3gp
Encoding H263+amr_nb (amr narrow band)
Befor start to encode check if your ffmpeg version support AMR codec:
[root@dev-3 enc]# ffmpeg -formats | grep amr FFmpeg version SVN-r5504, Copyright (c) 2000-2004 Fabrice Bellard configuration: --prefix=/usr/local/enctools --enable-mp3lame --enable-libogg --enable-vorbis --enable-theora --enable-faad \ --enable-faadbin --enable-faac --enable-xvid --enable-x264 --enable-a52 --enable-a52bin --enable-amr_nb --enable-amr_wb \ --enable-dc1394 --enable-gpl --enable-pp --enable-shared --extra-cflags=-I/usr/local/enctools/include \ --extra-ldflags=-L/usr/local/enctools/lib libavutil version: 49.0.0 libavcodec version: 51.9.0 libavformat version: 50.4.0 built on Jun 29 2006 13:27:24, gcc: 4.1.1 20060525 (Red Hat 4.1.1-1) DE amr 3gpp amr file format DEA amr_nb DEA amr_wb
Used amr encoder supports sampling freq is 8kHz only ( -ar 8000 ) and eight bitrate ranges:
min,Hz max,Hz Bitrate 0 4999 MR475 5000 5899 MR515 5900 6699 MR59 6700 7000 MR67 7001 7949 MR74 7950 9999 MR795 10000 11999 MR102 12000 64000 MR122
encoding h263, arm_nb (4.75kBit):
ffmpeg -i /home/video/U0003765.avi -vcodec h263 -r 12 -s qcif -b 64 -acodec amr_nb -ac 1 -ar 8000 -ab 4 /home/enc/test07.3gp
encoding h263, arm_nb (12.2kBit):
ffmpeg -i /home/video/U0003765.avi -vcodec h263 -r 12 -s qcif -b 64 -acodec amr_nb -ac 1 -ar 8000 -ab 12 /home/enc/test08.3gp
Two-pass encoding could be processed like in previous topic (h263,5fps,32kbs;amr_nb,8kHz,12kB/s):
#pass 1 ffmpeg -i /home/video/U0003773.avi -pass 1 -passlogfile logfile -vcodec h263 -r 5 -s qcif -b 32 -an /home/enc/test10.3gp #delete temp file rm -f /home/enc/test10.3gp #pass 2 ffmpeg -i /home/video/U0003773.avi -pass 2 -passlogfile logfile -vcodec h263 -r 5 -s qcif -b 32 -acodec amr_nb -ac 1 -ar 8000 \ -ab 12 /home/enc/test10.3gp
Encoding video using VLC.
Single file encoding
Encoding MPEG4,AAC video:
vlc -I dummy /home/video/R0004529.avi vlc:quit --sout '#transcode{
vcodec=mp4v,vb=168,width=176,height=144,deinterlace,
acodec=mp4a,ab=32,channels=2,samplerate=22100}:
std{access=file,mux=mp4,dst=/home/enc/test12.mp4}'
Where:
-I dummy- use text mode (do not start GUI)vlc:quit- exit from VLC after end of playlist (finish encoding)vcodec=mp4v- encode video with MPEG4 codec.vb=168- with 168kB/s bitrate.width=176,height=144- scale video to 176x144 px.deinterlace- deinterlace incoming video.fps=12- frame rate to 12 fps.acodec=mp4a- encode audio with AAC codecab=32- with 32kB/s bitrate.channels=2- stereosamplerate=22100- audio sampling freq
In the same manner encoding h264,H263:
vlc -I dummy /home/video/R0004529.avi vlc:quit
--sout '#transcode{
vcodec=h264,vb=168,width=176,height=144,deinterlace,
acodec=mp4a,ab=32,channels=2,samplerate=22100
}:std{access=file,mux=mp4,dst=/home/enc/test13.mp4}'
vlc -I dummy /home/video/R0004529.avi vlc:quit --sout '#transcode{
vcodec=H263,vb=168,width=176,height=144,deinterlace,
acodec=mp4a,ab=32,channels=2,samplerate=22100
}:std{access=file,mux=mp4,dst=/home/enc/test14.3gp}'
Multiple files encoding
Using duplicate feature of VLC (multiple files output from one source):
vlc -vvv -I dummy /home/video/R0004529.avi vlc:quit --sout '#duplicate{
dst="transcode{
vcodec=H263,vb=96,width=352,height=288,deinterlace,fps=10,
acodec=mp4a,ab=32,channels=2,samplerate=22050}:
std{access=file,mux=mp4,dst=/home/enc/test14_a.3gp}
",dst="transcode{
vcodec=mp4v,vb=96,width=352,height=288,deinterlace,fps=10,
acodec=mp4a,ab=32,channels=2,samplerate=22050}:
std{access=file,mux=mp4,dst=/home/enc/test14_b.mp4}
",dst="transcode{
vcodec=h264,vb=96,width=352,height=288,deinterlace,fps=10,
acodec=mp4a,ab=32,channels=2,samplerate=22050}:
std{access=file,mux=mp4,dst=/home/enc/test14_c.mp4}
"}'
Hinting
For hinting media files we will use mpeg4ip packet. (http://www.mpeg4ip.net)
NB!
mp4creator use extension to determinate file type. Next extensions should be used to name elementary stream files (in our case):
.263 - h263 elementary stream .264 - h264 elementary stream .mp4v, .m4v - mpeg4 elementary stream .aac - aac elementary stream .amr - amr elementary stream
Hinting mp4 files
check content of file:
[root@dev-3 enc]# mp4creator -list test05.mp4 Track Type Info 1 video H264 Baseline@5.1, 222.166 secs, 75 kbps, 176x144 @ 12.000036 fps 2 audio MPEG-4 AAC LC, 221.909 secs, 0 kbps, 24000 Hz
[root@dev-3 enc]# mp4creator -list test04.mp4 Track Type Info 1 video MPEG-4 Simple @ L1, 222.166 secs, 0 kbps, 176x144 @ 12.000036 fps 2 audio MPEG-4 AAC LC, 221.909 secs, 0 kbps, 24000 Hz
For creating proper mp4 or 3gp file with hint tracks we should remultplex and add hint track:
remultiplex:
[root@dev-3 enc]# mp4creator -extract=1 test05.mp4 test05.264 [root@dev-3 enc]# mp4creator -extract=2 test05.mp4 test05.aac [root@dev-3 enc]# mp4creator -extract=1 test04.mp4 test04.mp4v [root@dev-3 enc]# mp4creator -extract=2 test04.mp4 test04.aac
compose new file (mp4: h264,aac):
[root@dev-3 enc]# mp4creator -create=test05.264 -rate=12 -optimize -variable-frame-rate test05_r.mp4 [root@dev-3 enc]# mp4creator -hint=1 test05_r.mp4 [root@dev-3 enc]# mp4creator -create=test05.aac -interleave -optimize test05_r.mp4 [root@dev-3 enc]# mp4creator -hint=3 test05_r.mp4 [root@dev-3 enc]# mp4creator -list test05_r.mp4 Track Type Info 1 video H264 Baseline@5.1, 222.166 secs, 75 kbps, 176x144 @ 12.000036 fps 2 hint Payload H264 for track 1 3 audio MPEG-4 AAC LC, 221.909 secs, 32 kbps, 24000 Hz 4 hint Payload mpeg4-generic for track 3
compose new file (mp4: mpeg4,aac):
[root@dev-3 enc]# mp4creator -create=test04.mp4v -rate=12 -optimize -variable-frame-rate test04_r.mp4 [root@dev-3 enc]# mp4creator -hint=1 test04_r.mp4 [root@dev-3 enc]# mp4creator -create=test04.aac -interleave -optimize test04_r.mp4 [root@dev-3 enc]# mp4creator -hint=3 test04_r.mp4 [root@dev-3 enc]# mp4creator -make-isma-10-compliant test04_r.mp4 [root@dev-3 enc]# mp4creator -list test04_r.mp4 Track Type Info 1 video MPEG-4 Simple @ L1, 222.166 secs, 64 kbps, 176x144 @ 12.000036 fps 2 hint Payload MP4V-ES for track 1 3 audio MPEG-4 AAC LC, 221.909 secs, 32 kbps, 24000 Hz 4 hint Payload mpeg4-generic for track 3 5 od Object Descriptors 6 scene BIFS
When trying the above hinting on a file encoded with ffmpeg as decribed earlier I get the error message "MP4ERROR: MP4File::FindIntegerProperty: no such property - moov.trak[1].mdia.minf.stbl.stsd.*.esds.decConfigDescr.objectTypeId". The file still appears to be created properly and the hinted tracks show up with mp4info, but DSS complains about the movie not matching the SDP file. [see last section for a workaround]
Hinting 3gp files
check content of source files:
[root@dev-3 enc]# mp4creator -list test06.3gp Track Type Info 1 video H.263, 222.166 secs, 64 kbps, 176x144 @ 12.000036 fps 2 audio MPEG-4 AAC LC, 221.909 secs, 0 kbps, 24000 Hz
[root@dev-3 enc]# mp4creator -list test10.3gp Track Type Info 1 video H.263, 222.400 secs, 32 kbps, 176x144 @ 5.000000 fps 2 audio AMR, 222.020 secs, 13 kbps, 8000 Hz
demultiplex:
[root@dev-3 enc]# mp4creator -extract=1 test06.3gp test06.263 [root@dev-3 enc]# mp4creator -extract=2 test06.3gp test06.aac [root@dev-3 enc]# mp4creator -extract=1 test10.3gp test10.263 [root@dev-3 enc]# mp4creator -extract=2 test10.3gp test10.amr
multiplex (h263,aac):
[root@dev-3 enc]# mp4creator -create=test06.263 -rate=12 -force3GPCompliance -optimize test06_r.3gp [root@dev-3 enc]# mp4creator -create=test06.aac -interleave -optimize test06_r.3gp [root@dev-3 enc]# mp4creator -hint=1 test06_r.3gp [root@dev-3 enc]# mp4creator -hint=2 test06_r.3gp [root@dev-3 enc]# mp4creator -list test06_r.3gp Track Type Info 1 video H.263, 222.088 secs, 64 kbps, 176x144 @ 12.004251 fps 2 audio MPEG-4 AAC LC, 221.909 secs, 32 kbps, 24000 Hz 3 hint Payload H263-2000 for track 1 4 hint Payload mpeg4-generic for track 2
multiplex (h263,amr):
[root@dev-3 enc]# mp4creator -create=test10.263 -rate=5 -force3GPCompliance -optimize test10_r.3gp [root@dev-3 enc]# mp4creator -create=test10.amr -interleave -optimize test10_r.3gp [root@dev-3 enc]# mp4creator -hint=1 test10_r.3gp [root@dev-3 enc]# mp4creator -hint=2 test10_r.3gp [root@dev-3 enc]# mp4creator -list test10_r.3gp Track Type Info 1 video H.263, 222.222 secs, 32 kbps, 176x144 @ 5.004005 fps 2 audio AMR, 222.020 secs, 13 kbps, 8000 Hz 3 hint Payload H263-2000 for track 1 4 hint Payload AMR for track 2
Encoding video using mencoder
man mplayer
Encoding audio and video stream separately using ffmpeg
Sometimes, mp4creator cannot extract the video track for remuxing (it crashes with this error: "MP4ERROR: MP4File::FindIntegerProperty: no such property - moov.trak[1].mdia.minf.stbl.stsd.*.esds.decConfigDescr.objectTypeId"). I got this error when converting a .vob file to both 3gp and mp4 using ffmpeg.
A workaround is to encode each stream (video and audio) separately, skip the demuxing part (you already have two separate files with each stream), and continue normally with multiplexing and hinting (as above). Two-pass video encoding also works (use it just for the video stream).
For encoding video stream (h263):
# ffmpeg -i test.avi -f h263 -vcodec h263 -b 64 -r 12 -s qcif test.263
For encoding video stream (mpeg4):
# ffmpeg -i test.avi -f rawvideo -vcodec mpeg4 -b 64 -r 12 -s qcif test.mpv4
For encoding audio stream (amr_nb):
# ffmpeg -i test.avi -f amr -acodec amr_nb -ac 1 -ar 8000 -ab 12200 test.amr
For encoding audio stream (aac):
ffmpeg -i test.avi -f aac -acodec aac -ac 1 -ar 16000 -ab 16000 test.aac
After you have the two streams (video with extensions .263 or .mpv4, and audio with extensions .amr or .aac), do the multiplexing as above.
Note: for some versions of ffmpeg, the amr_nb audio codec is named libamr_nb and the aac audio codec is named libfaac.

