subtitle, svcd, transcode, Video, xvid, TV, VLC

  • Here are some commands to get informations about the nature of a video:
$ ffmpeg -i ./video.avi
$ file ./video.avi
$ avprobe ./video.avi
$ mplayer -frames 0 -identify ./video.avi
$ tcprobe -i ./video.avi

FFmpeg

  • Remux a Flash video to an MP4 container without transcoding:
$ ffmpeg -i ./inpout.flv -vcodec copy -acodec copy ./output.mp4
  • Remove audio:
$ ffmpeg -i ./input.mp4 -vcodec copy -an ./input-no-audio.mp4
  • Start audio 1.5 seconds later:
$ ffmpeg -i ./input.mkv -itsoffset 1.5 -i ./input.mkv -map 0:v -vcodec copy -map 1:a -acodec copy ./video-fixed.mkv
  • Start audio 1.5 seconds earlier (notice the difference in -map index value compared to CLI above):
$ ffmpeg -i ./input.mkv -itsoffset 1.5 -i ./input.mkv -map 1:v -vcodec copy -map 0:a -acodec copy ./video-fixed.mkv
  • Transcode the audio track into AAC but keep the video and subtitles as-is:
$ ffmpeg -i ./input.mkv -vcodec copy -acodec aac -scodec copy ./output.mkv
$ ffmpeg -i ./MVI_5547.MOV -movflags use_metadata_tags -c:v libx265 -crf 20 -preset slow -tag:v hvc1 -c:a aac -ac 1 -b:a 64k ./MVI_5547-2.mp4
  • Transcode all audio tracks to AAC (-map 0:a & -acodec aac) but keep all video streams as-is (-map 0:v & -vcodec copy). Introduce a negative 128.5 seconds delay on the sole subtitle track using the srt Python package as an intermediate step. The -map 1:s option ensure only the original subtitle tracks are ignored:
$ pip install srt
$ ffmpeg -i ./input.mkv ./subtitle.srt
(...)
$ srt fixed-timeshift --input ./subtitle.srt --inplace --seconds -128.5
(...)
$ ffmpeg -i ./input.mkv -i ./subtitle.srt -map 0:v -vcodec copy -map 0:a -acodec aac -map 1:s -scodec copy ./video-fixed.mkv
(...)
Input #0, matroska,webm, from 'input.mkv':
    Stream #0:0(eng): Video: h264 (High), yuv420p(progressive), 1280x720, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Stream #0:1(fre): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (default)
    Stream #0:2(eng): Subtitle: subrip (default)
    (...)
Input #1, srt, from 'subtitle.srt':
    Stream #1:0: Subtitle: subrip
    (...)
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (dts (dca) -> aac (native))
  Stream #1:0 -> #0:2 (copy)
  (...)
Output #0, matroska, to 'video-fixed.mkv':
    Stream #0:0(eng): Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
    Stream #0:1(fre): Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, 5.1(side), fltp, 394 kb/s (default)
    Stream #0:2: Subtitle: subrip
$ cat ./M2U01802.MPG ./M2U01803.MPG ./M2U01804.MPG | ffmpeg -i - -acodec flac ./output.flac
  • Remove the first 16 seconds of video and change container to Matroska:
$ ffmpeg -ss 16 -i ./MVI_8763.MOV -vcodec copy -acodec copy ./MVI_8763.mkv
  • Extract the first frame of a video (great to generate image preview):
$ ffmpeg -i ./video.mov -r 1 -t 00:00:01 -f image2 ./images%05d.png
  • Extract a frame every 10 seconds:
$ ffmpeg -i ./video.mov -f image2 -r 1/10 ./preview-%04d.png
$ ffmpeg -i ./MVI_1714.MOV -vcodec huffyuv -sameq ./MVI_1714-lossless.avi
  • Produce a dummy 10 seconds video of a solid pink background at 1080p/60fps:
$ ffmpeg -f lavfi -i "color=color=pink:size=1920x1080" -r 60 -t 10 -c:v libx264 ./dummy.mp4
$ ffmpeg -loop 1 -y -i ./album-front-cover.jpg -i ./track-01.flac -c:v libx264 -tune stillimage -vf "crop='min(in_h,in_w)':'min(in_h,in_w)',scale=-2:1080" -c:a copy -shortest ./track-01-video.mkv
  • Same as above but instead of cropping, pad with either vertical or horizontal black bars to fit a typical Full HD 1080p steam of 1920x1080 pixels:
$ ffmpeg -loop 1 -y -i ./album-front-cover.jpg -i ./track-01.flac -c:v libx264 -tune stillimage -vf "scale=-2:1080:force_original_aspect_ratio=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" -c:a copy -shortest ./track-01-video.mkv
  • Extract a segment of a video and produce a gif animation out of it. The extracted fragment is from the absolute time reference of 00:24:52.4 to 00:24:57.0. The first video stream is selected ([0:v]), and the audio naturraly discarded. Framerate is reduced to 12 fps, and horizontal size to 480 pixels while keeping the aspect ratio. It use special filters to generate a global optimized color palette limited to 64 colors. The first subtitle track (si=0) embedded in the original source.mp4 file is burned down, in a bold Arial Black font at 26pt (as per ASS specs).
$ ffmpeg -i ./source.mp4 -ss 00:24:52.4 -to 00:24:57.0 -filter_complex "[0:v] fps=12,scale=width=480:height=-1:flags=lanczos,subtitles=source.mp4:si=0:force_style='FontName=Arial Black,Bold=-1,FontSize=26',split [a][b];[a] palettegen=64 [p];[b][p] paletteuse" ./meme.gif

To pinpoint the right moment to cut your segment, here is a variation of the above to produce a set of timecoded frames with embedded subtitles for preview:

$ ffmpeg -i ./source.mp4 -ss 00:24:52.700 -to 00:24:57.371 -filter_complex "drawtext=text='%{pts\:hms}': fontcolor=black: fontsize=32: box=1: boxcolor=white,subtitles=source.mp4:si=0" -f image2 "%04d.jpg"

VLC

  • Transcode the first video stream found in a m3u playlist to a 384 kbps MPEG-2 video and 48 kHz Vorbis audio, and serve the resulting stream ina Ogg container to http://localhost:8888. To save bandwidth we reduce by two the size of the video:
$ vlc -vvv https://mafreebox.freebox.fr/freeboxtv/playlist.m3u --sout '#transcode{vcodec=mp2v,vb=384,scale=0.5,acodec=vorbis,ab=48,channels=1}:standard{access=http,mux=ogg,url=:8888}' -I ncurses 2> /dev/null

libAV

  • Re-encode a yuv422p video into a lossless h264, but this time in yuv420p:
$ avconv -i yuv422p.mkv -c:v libx264 -pix_fmt yuv420p -preset veryslow -qp 0 yuv420p.mkv
  • Re-encode a lossless h264 video with a lower bitrate:
$ avconv -i lossless.mkv -b:v 45M -preset veryfast lower-bitrate.mkv

Mplayer / Mencoder

  • Change the aspect ratio of a film for the playback. Standard aspect ratio are : 1.33 (4:3), 1.66 (1.66:1), 1.77 (16:9) and 2.35 (2.35:1):
$ mplayer -aspect 2:1 ./video.avi
  • Play the video with subtitles:
$ mplayer -sub ./subtitle_file.txt ./video.avi
  • This will extract audio track no. 128, downmix the AC3 sound to PCM and write the results to file.wav:
$ mplayer -vo null -hardframedrop -aid 128 -ao pcm -aofile file.wav dvd://1
  • This will extract the audio, convert it to PCM and write the resulting wave file to audio.wav:
$ mplayer -vo null -hardframedrop -ao pcm:file=audio.wav myvideo.avi
  • Show all subtitles streams:
$ mplayer -vo null -ao null -frames 0 -v 2 dvd://1 >&1 | grep sid
  • Create a rotated copy of the file.avi video (rotate=1: clockwise; rotate=2: anti-clockwise):
$ mencoder -vop rotate=2 -oac pcm -ovc lavc ./source.avi -o ./dest.avi
  • Preview a video composed of all jpeg files from the current folder at 15fps (mplayer only support jpeg, png, tga and sgi formats):
$ mplayer "mf://*.jpg" -mf fps=15
  • Create a 15fps video from all jpeg files of the current folder:
$ mencoder "mf://*.jpg" -mf fps=15 -ovc lavc -o ./dest.avi
  • Encode a SVCD to AVI file:
$ mencoder -oac lavc -ovc lavc vcd://1 -o ./svcd.avi
  • Transcode video to raw format (be carefull: usually the output video got annoying audio delay):
$ mencoder -oac pcm -ovc raw -ofps 25 -noskip ./video.wmv -o ./video.avi
  • Encode a video using the default mpeg4 codec at 400 kbps for video and mp3 codec at constant 32 kbps bitrate for audio:
$ mencoder -oac mp3lame -lameopts cbr:preset=32 -ovc lavc -lavcopts vbitrate=400 in.avi -o out.avi
  • Enhance the sharpness of the video:
$ mplayer video.avi -vf smartblur=.6:-.5:0,unsharp=l5x5:.8:c5x5:.4
  • Cut a video to keep the first 5.4 seconds:
$ mencoder big-file.avi -ss 0 -endpos 5.4 -ovc copy -oac copy -o cutted.avi
  • Cut a video to keep everything exept the first 5.4 seconds:
$ mencoder big-file.avi -ss 5.4 -ovc copy -oac copy -o cutted.avi
  • Show all mplayer filter list:
$ mplayer -vf help
  • Get help of a particular filter (eq2 in this example):
$ mplayer -vf eq2=help
  • Here is the filter I use to light up a video taken in the dark with my cheap camera. Of course it add noise but thanks to this we can distinguish shapes in the dark.
$ mencoder -vf eq2=1.61:1.95:0.54:2.43 -oac pcm -ovc lavc video.avi -o bright-vid.avi
  • And this is the command to preview the result of the filter used above:
$ mplayer video.avi -vf eq2=1.61:1.95:0.54:2.43
  • This is how I convert raw videos taken with my digital camera into ISO standard MPEG-4 (DivX 5, XVID compatible) videos (to encode in grayscale, add :gray option to -lavcopts):
$ mencoder source.avi -ovc lavc -oac lavc -ffourcc DX50 -lavcopts vcodec=mpeg4:vbitrate=400:v4mv:mbd=2:trell:autoaspect:dia=2:acodec=mp3:abitrate=32:vpass=1 -vf hqdn3d -o output.avi
$ mencoder source.avi -ovc lavc -oac lavc -ffourcc DX50 -lavcopts vcodec=mpeg4:vbitrate=400:v4mv:mbd=2:trell:autoaspect:dia=2:acodec=mp3:abitrate=32:vpass=2 -vf hqdn3d -o output.avi
  • Play all videos of the current folder fullscreen at 4x speed with 50% more brightness:
$ mplayer -speed 4 -brightness 50 -fs ./*.avi
  • Extract audio stream from a video:
$ mplayer -dumpaudio -dumpfile audio.ac3 video_source.mpg

Transcode

  • Merge multiple video into one:
$ avimerge -i part1.avi part2.avi -o big-file.avi
  • Extract the raw subtitle stream. The -a 0x21 option correspond to the subtitle stream’s hexadecimal number (= 0x20 + id of the stream):
$ tccat -i /space/st-tng/dic1/ -T 1 -L | tcextract -x ps1 -t vob -a 0x22 > subs-en
  • List export video codecs:
$ transcode -i . -y ffmpeg -F list
  • Batch stabilization script:
SEARCH_FOLDER="/home/kevin/project/raw_sources"
DEST_FOLDER="/home/kevin/project/stabilized"

for FILE_PATH in $(find "$SEARCH_FOLDER" -name "*.mp4")
do
    FILE_NAME=$(basename "$FILE_PATH")

    STAB_FILE="$DEST_FOLDER/$FILE_NAME.trf"
    if [ ! -e "$STAB_FILE" ]; then
        # vis.stab's deshake/stabilize documentation:
        # https://github.com/georgmartius/vid.stab/blob/36173857bfc0fa111983a5934f2cc6322969e928/transcode/filter_deshake.c#L75-L106
        transcode -J stabilize=result="$STAB_FILE" -i "$FILE_PATH" -y null,null -o dummy
    fi

    FINAL_FILE="$DEST_FOLDER/$FILE_NAME-stabilized.mkv"

    if [ ! -e "$FINAL_FILE" ]; then

        # Create a stabilized stream of JPG files at 100% quality.
        FRAME_BASEPATH="$DEST_FOLDER/$FILE_NAME.stabilized_"
        # vid.stab's transform documentation:
        # https://github.com/georgmartius/vid.stab/blob/36173857bfc0fa111983a5934f2cc6322969e928/src/transform.h#L122-L149
        transcode -J transform=input="$STAB_FILE" -i "$FILE_PATH" -y jpg,null -F 100 -o "$FRAME_BASEPATH"

        # Convert to a lossless h264 video in 4:2:0 color space.
        FRAME_RATE=$(tcprobe -i "$FILE_PATH" | grep "frame rate:" | cut -d ':' -f 2 | cut -d ' ' -f 3)
        avconv -r $FRAME_RATE -i "$FRAME_BASEPATH%06d.jpg" -c:v libx264 -pix_fmt yuv420p -preset veryfast -qp 0 "$FINAL_FILE"

        find "$DEST_FOLDER" -name "$FRAME_BASENAME*.jpg" -delete

    fi

done

Others

  • List MLT audio codecs:
$ melt -query "audio_codecs"
  • Extract to chapter.txt the chapter file of the track n°1 of the DVD:
$ dvdxchap -t 1 /mnt/cdrom > chapter.txt
  • Test XV video driver output via gstreamer v0.10:
$ gst-launch-0.10 videotestsrc ! xvimagesink