Transcodes all videos in the given directory and all of it's subdirectories using ffmpeg.
- ffcvt - ffmpeg convert wrapper tool
- Install Debian/Ubuntu package
- Download/install binaries
- Install Source
- Author
- Contributors
Add a more tolerable transpose approach.
For all transpose features, check out https://github.com/suntong/ffcvt/wiki/Tips:-To-transpose-song's-key
Implemented on 2024-02-08, dedicated to 龙年春节.
Skipped.
Now able to have specific CRF environment variable for libx26?
types:
- libx264:
FFCVT_CRF4
- libx265:
FFCVT_CRF5
Now able to restrict CPU usage by limiting max conversions done in each run.
Now able to
- change the key signature of a song. Details in #30.
- add a karaoke audio track to the MTV videos. Details in #31.
- Release v1.9.0
ffcvt -version
now checks/outputs dependent program versions too- now finished percentage are calculated from file size
- Release v1.8.1, enable parallel execution
- Now able to define your own defaults. Just make a copy of ffcvt.json and customize it to your heart's content, then use the
-cfg
option to point to it. Better yet, setFFCVT_CFG
environment variable and forget all about it afterwards.- This means that
ffcvt
is now not only limited to its own predefined transcoding sets, but you can also define your own transcoding rules and names and then fully enjoy its advanced addon assistants. - BTW, If you have a good set, don't forget to send in a PR so that everybody can also benefit from it.
- This means that
- Now the subtitles, nfo, html or any files in the source directory will be duplicated into the output (work) directory, first by hard-link and if it fails due to cross storage devices, a copy will be used instead.
- And when creating
par2
checksum/repair files, all files in the output (work) directory will be covered.
- Now able to speed up playback speed (
-Speed
). Details in #22 - Also have added a
copy
target type that can speed up theSeg
(split video) operation (v1.7.4). Details in #21
- Now able to split video into multiple segments (
-S,Seg
) by the given time. Details in #16
- Able to choose streams by language, instead of streams index. Details in #9
- Fixed #8. Now force copy all subtitle streams. Details in #8
- Added option -sel, so now able to pick subtitle language(s). Details in #12
Added option -C,Cut
which allows cutting multiple segments.
For further details, check out the wiki https://git.io/JuK0c, in which the source file of
Nice_scenic_videos_from_dashcam_With_Evening_sunset_view.mp4
is cut-short into
Nice_scenic_videos_from_dashcam_With_Evening_sunset_view_cut.mp4
Added wx
type for weixin.
Convert to video that is recognizable and playable by weixin/wechat, by using the -t wx
option as the convertion type. Here is a converted sample:
FloatingHeliumBalloonInMovingCar.mp4
(credit here)
For further details, check out the wiki https://git.io/JuK0q
- The next-generation codec like High Efficiency Video codec (HEVC), H.265 or VP9 can produce videos visually comparable to H.264's result, but in about half the file size.
- Meanwhile the Opus audio codec is becoming the best thing ever for compressing audio -- A 64K Opus audio stream is comparable to mp3 files of 128K to 256K bandwidth.
- Such fantastic high efficiency audio/video codec/encoding capability has long been available in
ffmpeg
, but fewer people know it or use it, partly because theffmpeg
command line is not that simple for every one. - The
ffcvt
is designed to take the burden from normal Joe -- All you need to do to encode a video is to give one parameter toffcvt
, i.e., the path and file name of the video to be encoded, andffcvt
will take care of the rest, using the recommended values for both audio/video encoding to properly encode it for you. - It can't be more simpler than that. However, beneath the simple surface,
ffcvt
is versatile and powerful enough to allow you to touch every corner of audio/video encoding. There is a huge list of environment variables (or command-line parameters) which will allow you tweak the encoding methods and parameters to exactly what you prefer instead. - Moreover, to encode a directory full of video files, including under its sub-directories, you need just to give
ffcvt
one single parameter, the directory location, andffcvt
will go ahead and encode all video files under that directory, including all its sub-directories as well.
There is a quick usage help that comes with ffcvt
, produced when it is invoked without any parameters:
$ ffcvt -version
ffcvt version 1.15.0 built on 2024-02-08
ffmpeg version 5.1.3-1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12 (Debian 12.2.0-14)
ffprobe version 5.1.3-1 Copyright (c) 2007-2022 the FFmpeg developers
built with gcc 12 (Debian 12.2.0-14)
Usage:
ffcvt [flags]
Flags:
-cfg cfg file to define your own targets: webm/wx/youtube etc (FFCVT_CFG)
-t target type: webm/x265-opus/x264-mp3/wx/youtube/copy, or empty (FFCVT_T)
-ves video encoding method set (FFCVT_VES)
-aes audio encoding method set (FFCVT_AES)
-ses subtitle encoding method set (FFCVT_SES)
-vep video encoding method prepend (FFCVT_VEP)
-aep audio encoding method prepend (FFCVT_AEP)
-sep subtitle encoding method prepend (FFCVT_SEP)
-vea video encoding method append (FFCVT_VEA)
-aea audio encoding method append (FFCVT_AEA)
-abr audio bitrate (64k for opus, 256k for mp3) (FFCVT_ABR)
-crf the CRF value: 0-51. Higher CRF gives lower quality
(28 for x265, ~ 23 for x264) (FFCVT_CRF)
-d directory that hold input files (FFCVT_D)
-f input file name (either -d or -f must be specified) (FFCVT_F)
-sym symlinks will be processed as well (FFCVT_SYM)
-exts extension list for all the files to be queued (FFCVT_EXTS)
-suf suffix to the output file names (FFCVT_SUF)
-ext extension for the output file (FFCVT_EXT)
-w work directory that hold output files (FFCVT_W)
-ac copy audio codec (FFCVT_AC)
-vc copy video codec (FFCVT_VC)
-an no audio, output video only (FFCVT_AN)
-vn no video, output audio only (FFCVT_VN)
-vss video: same size (FFCVT_VSS)
-C,Cut Cut segment(s) out to keep. Specify in the form of start-[end],
strictly in the format of hh:mm:ss, and may repeat (FFCVT_C,CUT)
-S,Seg Split video into multiple segments (strictly in format: hh:mm:ss) (FFCVT_S,SEG)
-Speed Speed up/down video playback speed (e.g. 1.28) (FFCVT_SPEED)
-K,karaoke Add a karaoke audio track to .mp4 MTV (FFCVT_K,KARAOKE)
-tkf Transpose song's key from (e.g. C/C#/Db/D etc) (FFCVT_TKF)
-tkt Transpose song's key to (e.g. -tkf C -tkt Db) (FFCVT_TKT)
-tkb Transpose song by (e.g. +2, -3, etc) chromatic scale (FFCVT_TKB)
-lang language selection for audio stream extraction (FFCVT_LANG)
-sel subtitle encoding language (language picked for reencoded video) (FFCVT_SEL)
-o more options that will pass to ffmpeg program (FFCVT_O)
-ato-opus audio encode to opus, using -abr (FFCVT_ATO_OPUS)
-vto-x265 video video encode to x265, using -crf (FFCVT_VTO_X265)
-p par2create, create par2 files (in work directory) (FFCVT_P)
-nc no clobber, do not queue those already been converted (FFCVT_NC)
-bt breath time, interval between conversion to take a breath (FFCVT_BT)
-maxc max conversion done each run (default no limit) (FFCVT_MAXC)
-n no exec, dry run (FFCVT_N)
-force overwrite any existing none-empty file (FFCVT_FORCE)
-debug debugging level (FFCVT_DEBUG)
-ffmpeg ffmpeg program executable name (FFCVT_FFMPEG)
-ffprobe ffprobe program execution (FFCVT_FFPROBE)
-version print version then exit (FFCVT_VERSION)
Details:
-C value
Cut segment(s) out to keep. Specify in the form of start-[end],
strictly in the format of hh:mm:ss, and may repeat
-Cut value
Cut segment(s) out to keep. Specify in the form of start-[end],
strictly in the format of hh:mm:ss, and may repeat
-K Add a karaoke audio track to .mp4 MTV
-S string
Split video into multiple segments (strictly in format: hh:mm:ss)
-Seg string
Split video into multiple segments (strictly in format: hh:mm:ss)
-Speed string
Speed up/down video playback speed (e.g. 1.28)
-abr string
audio bitrate (64k for opus, 256k for mp3)
-ac
copy audio codec
-aea string
audio encoding method append
-aep string
audio encoding method prepend
-aes string
audio encoding method set
-an
no audio, output video only
-ato-opus
audio encode to opus, using -abr
-bt duration
breath time, interval between conversion to take a breath (default 2m0s)
-cfg string
cfg file to define your own targets: webm/wx/youtube etc
-crf string
the CRF value: 0-51. Higher CRF gives lower quality
(28 for x265, ~ 23 for x264)
-d string
directory that hold input files
-debug int
debugging level (default 1)
-ext string
extension for the output file
-exts string
extension list for all the files to be queued (default ".3GP.3G2.ASF.AVI.DAT.DIVX.FLV.M2TS.M4V.MKV.MOV.MPEG.MP4.MPG.RMVB.RM.TS.VOB.WEBM.WMV")
-f string
input file name (either -d or -f must be specified)
-ffmpeg string
ffmpeg program executable name (default "ffmpeg")
-ffprobe string
ffprobe program execution (default "ffprobe -print_format flat")
-force
overwrite any existing none-empty file
-karaoke
Add a karaoke audio track to .mp4 MTV
-lang string
language selection for audio stream extraction (default "eng")
-maxc int
max conversion done each run (default no limit)
-n no exec, dry run
-nc
no clobber, do not queue those already been converted
-o string
more options that will pass to ffmpeg program
-p par2create, create par2 files (in work directory)
-sel value
subtitle encoding language (language picked for reencoded video)
-sep string
subtitle encoding method prepend
-ses string
subtitle encoding method set
-suf string
suffix to the output file names
-sym
symlinks will be processed as well
-t string
target type: webm/x265-opus/x264-mp3/wx/youtube/copy, or empty (default "webm")
-tkb int
Transpose song by (e.g. +2, -3, etc) chromatic scale
-tkf string
Transpose song's key from (e.g. C/C#/Db/D etc)
-tkt string
Transpose song's key to (e.g. -tkf C -tkt Db)
-vc
copy video codec
-vea string
video encoding method append
-vep string
video encoding method prepend
-version
print version then exit
-ves string
video encoding method set
-vn
no video, output audio only
-vss
video: same size (default true)
-vto-x265
video video encode to x265, using -crf
-w string
work directory that hold output files
To reduce output, use '-debug 0', e.g., 'ffcvt -force -debug 0 -f testf.mp4 ...'
For each ffcvt
command line parameter, there is a environment variable corresponding to it. For example you can use export FFCVT_FFMPEG=avconv
to use avconv
instead of ffmpeg
(Don't, I use it for my CommandLineArgs to develop/test ffcvt
without invoking ffmpeg
each time).
The detailed guide to choose/provide proper parameters to ffcvt
have been moved to wiki. For example,
- HEVC vs VP9
- HEVC Preset Method Comparison
- The HEVC CRF Comparison
- Example 1: YouTube Encoding
- Example 2: Talk Encoding
Please check them out in the wiki, and for other documents like "Most used ffmpeg options", "How to crop a video", etc.
As suggested before, don't use avconv
, use ffmpeg
instead (the avconv
fork was more for political reasons. I personally believe ffmpeg
is technically superior although might not be politically).
As for video/movie play back, use mpv. It is a fork of mplayer2 and MPlayer, and is a true modern all-in-one movie player that can play ANYTHING, and one of the few movie players being actively developed all the time. Download link is in mpv.io, from which Ubuntu repo I get my Ubuntu ffmpeg
package as well. If you are unsatisfied with mpv's simple user interface, check out https://wiki.archlinux.org/index.php/Mpv#Front_ends.
sudo apt install -y ffcvt
- The latest binary executables are available as the result of the Continuous-Integration (CI) process.
- I.e., they are built automatically right from the source code at every git release by GitHub Actions.
- There are two ways to get/install such binary executables
- Using the binary executables directly, or
- Using packages for your distro
- The latest binary executables are directly available under
https://github.com/suntong/ffcvt/releases/latest - Pick & choose the one that suits your OS and its architecture. E.g., for Linux, it would be the
ffcvt_verxx_linux_amd64.tar.gz
file. - Available OS for binary executables are
- Linux
- Mac OS (darwin)
- Windows
- If your OS and its architecture is not available in the download list, please let me know and I'll add it.
- The manual installation is just to unpack it and move/copy the binary executable to somewhere in
PATH
. For example,
tar -xvf ffcvt_*_linux_amd64.tar.gz
sudo mv -v ffcvt_*_linux_amd64/ffcvt /usr/local/bin/
rmdir -v ffcvt_*_linux_amd64
The repo setup instruction url has been given above. For example, for Debian --
curl -1sLf \
'https://dl.cloudsmith.io/public/suntong/repo/setup.deb.sh' \
| sudo -E bash
# That's it. You then can do your normal operations, like
sudo apt update
apt-cache policy ffcvt
sudo apt install -y ffcvt
To install the source code instead:
go install github.com/suntong/ffcvt@latest
Powered by WireFrame
the one-stop wire-framing solution for Go cli based projects, from init to deploy.
Thanks goes to these wonderful people (emoji key):
suntong 💻 🤔 🎨 🔣 |
sanjaymsh 📦 |
Billy West 🐛 📓 |
Brian Rozmierski 🐛 📓 |
Roman Valls Guimera 🐛 📓 |
This project follows the all-contributors specification. Contributions of any kind welcome!