Ahoy Mateys! Finally my PC is back from the shop and I’m ready to begin re-encoding my “loot” to a smaller footprint for Plex. I’ve decided on HEVC (10-Bit)/AAC encoding and want to use ffmpeg but I know ZERO about the command line so I’m seeking a good front-end that uses hardware acceleration (AMD GPU), does batch processing, allows video dimension & aspect control and audio normalization. I’ve tried several and it appears only ffBatch comes close & provides good encode times. I would appreciate any input if anyone knows of any other free, good ffmpeg front-ends with the features I listed. Thanks!
Use https://home.tdarr.io/, it has what you are looking for and will do everything automatically! The first setup is never easy!
Tdarr is great if you are comfortable setting up a Docker environment. It is a great way to reprocess your whole library.
A good GUI alternative is Handbrake. It uses a different library than ffmpeg but can do the same stuff. One thing about Handbrake to remember is that it is centered around video encoding. So while ffmpeg can process your audio streams without touching the video stream, Handbrake will reencode video every time.
It uses a different library than ffmpeg
From here:
HandBrake leverages tools such as FFmpeg, x264, and x265 to create new MP4, MKV, or WebM video files
I think you might be confused because ffmpeg is the project and also the name of the executable, the library is libavcodec but it’s still ffmpeg. See here.
Another Tdarr alternative with (i think) a more flexible and automatable setup is FileFlows (the free version is all you need) you can build node based rulesets and apply those rules to different libraries.
Handbrake can help. It is one of the best open-source transcoders. It is not exactly an ffmpeg front end, though.
Agreed, handbrake is what you want.
I wrote a bash script for this, but I’m not sure of the correct settings so I haven’t used it to re-encode my whole library yet.
Here’s my script in case anyone has any tips:
spoiler
#!/bin/sh
shopt -s globstar
for FILE in */
{
if [[ -d $FILE ]]; then continue fi match="*-re.mp4" if [[ $FILE == $match ]]; then echo already encoded, skipping $FILE continue fi match="*-ex.mp4" if [[ $FILE == $match ]]; then echo already excluded, skipping $FILE continue fi if [[ $(du "${FILE}" | awk '{print $1}') -lt 10000 ]]; then #echo $(date),$(pwd)/,$FILE,toosmall >> errors.csv echo $(date),$(pwd)/,$FILE, 0,0,0,0, original too small >> encoding.csv continue fi if [[ $(mediainfo "${FILE}" | grep -c -e'Audio #') -gt 1 ]]; then #echo $(date),$(pwd)/,$FILE,skip-audio >> errors.csv echo $(date),$(pwd)/,$FILE, 0,0,0,0, multiple audio tracks >> encoding.csv continue fi if [[ $(mediainfo "${FILE}" | grep -c -e'Text #') -gt 1 ]]; then #echo $(date),$(pwd)/,$FILE,skip-subs >> errors.csv echo $(date),$(pwd)/,$FILE, 0,0,0,0, contains subtitles >> encoding.csv continue fi FULLM=${FILE%.*} REN="$FULLM-re.mp4" echo writing $REN #ffmpeg -y -i "${FILE}" -vcodec libx264 -crf 23 "${REN}" #ffmpeg -y -i "${FILE}" -vcodec h264_nvenc -crf 23 "${REN}" ffmpeg -y -i "${FILE}" -vcodec libx265 -crf 23 "${REN}" ORIGSIZE=$(du "${FILE}" | awk '{print $1}') NEWSIZE=$(du "${REN}" | awk '{print $1}') ORIGBITRATE=$(mediainfo "${FILE}" | grep Overall | sed 's/[^0-9]*//g') NEWBITRATE=$(mediainfo "${REN}" | grep Overall | sed 's/[^0-9]*//g') echo $FILE vs $REN echo $ORIGBITRATE vs $NEWBITRATE #if [[ $NEWBITRATE -gt $ORIGBITRATE ]]; then #echo new bitrate is too big, renaming $FILE to $FULLM-ex.mp4 #echo $(date),$(pwd)/,$FILE, $ORIGBITRATE, $NEWBITRATE, $ORIGSIZE, $NEWSIZE, bitrate increased >> encoding.csv #mv "${FILE}" "${FULLM}"-ex.mp4 #rm -f "${REN}" #continue #fi if [[ $ORIGSIZE -lt $NEWSIZE ]]; then #echo $(date),$(pwd)/,$FILE,sizeToSmall: $ORIGSIZE vs $NEWSIZE >> errors.csv echo $(date),$(pwd)/,$FILE, $ORIGBITRATE, $NEWBITRATE, $ORIGSIZE, $NEWSIZE, filesize increased >> encoding.csv echo deleting "${REN}" rm -f "${REN}" mv "${FILE}" "${FULLM}"-ex.mp4 else echo $(date),$(pwd)/,$FILE, $ORIGBITRATE, $NEWBITRATE, $ORIGSIZE, $NEWSIZE, ENCODED >> encoding.csv rm -f "${FILE}" fi
}