Konverter mediefiler med ffmpeg
HandBrake er fyldt med GUI funktioner til konvertering af medie filer, der er noget nemmere at overskue end ffmpeg, i hvertfald for folk der ikke er vant til terminalen, men HandBrake kan ikke merge filer, og den er betydelig langsommere end ffmpeg til at konvertere.
Har du mod på at prøve ffmpeg, så er der et par eksempler her. Har du en mappe med mange fx mkv filer, ønsker at konvertere dem til fx mp4, og ønsker at beholde fil navnene. Kommandoerne skal køres i terminalen fra den mappe der indeholder filerne:
# No recode:
for f in *.mkv;do ffmpeg -i "$f" -c copy -strict -2 "${f%mkv}mp4";done
Flaget -strict -2 er eksperimentel, men virker formentlig. Hvis filerne du ønsker at konvertere er i et andet format el. container, eller du ønsker at konvertere filerne til noget andet end mp4, så ændr det i koden.
# With recode:
for f in *.mkv;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "${f%mkv}mp4";done
Ønsker du noget andet end 'aac' (Advanced Audio Coding), så prøv dig frem.
Hvis du vil samle filerne til en:
# Create a list file (needed):
ls > list.txt
# Insert single quotes sign before and after the segment names in all the lines (this may not be needed, if no path is involved):
sed -i~ -e "s/^/'/;s/$/'/" list.txt
# Insert the word "file" (followed by a "space") as the first word in every line (needed):
sed -i -e 's_.*_file &_' list.txt
# Merge all segments into one movie using ffmpeg:
ffmpeg -safe 0 -f concat -i list.txt -vcodec copy -acodec copy merged-movie.mp4
26-05-2013
Er der tab i framerate, billedformat og kvalitet ved brug af ffmpeg i forhold til HandBrake? En af grundene til, at HandBrake tager så lang tid er fordi den encoder høj kvalitet. Og det bruger meget CPU.
Jeg tænker særligt på konvertering og encoding af af MakeMKV rippede bluray-film
05-12-2009
Handbrake bruger ffmpeg internt. så kvalitetsmæssigt er der nok ingen forskel. Men Handbrake er nemmere at bruge da den har en fin GUI.
Dette er mit eget script, ts2mp4, jeg bruger til at konvertere TS-filer optaget med fx TV4ever.
#!/bin/bash
for f in $*
do
filename=$(basename "$f")
extension="${filename##*.}"
basename="${filename%.*}"
ffmpeg -i $filename -acodec copy -vcodec copy -bsf:a aac_adtstoasc $basename.mp4
touch -r $filename $basename.mp4
done
touch-kommandoen gør at mp4-filerne får samme tidsstempel som originalerne.
Det bruges sådan: ts2mpg *.ts. Eller ts2mp4 minvideo.ts osv.
På trods af navnet er det nu ligeglad med kildeformatet. Det konverterer lige så fint fx avi til mp4.
20-05-2010
#1: Er der tab i framerate, billedformat og kvalitet ved brug af ffmpeg i forhold til HandBrake?
Nej, ikke til det brug jeg benytter ffmpeg til. Fil størrelserne i de konverterede filer, er omtrent det samme som originalerne, hvilket kræver nogen forståelse fra HandBrake's faneblade.
Vil jeg for alvor ændre på noget i en medie fil, så benytter jeg HandBrake, mest fordi jeg ikke er medie freek.
Det er (rettelse - #2) ikke korrekt at HandBrake bruger FFmpeg, og bemærk at FFmpeg ikke bliver installeret fordi HandBrake er. Det er en forskel fra Youtube-DL og Youtube-GUI. FFmpeg skal muligvis installeres, hvis ikke det er præinstalleret i OS. Forskellen er dog at Youtube-DL ikke virker uden fx FFmpeg er eksplicit installeret. Det skyldes Youtube-DL bruger FFmpeg.
Edit - rettelse: Det ser ikke ud til at HandBrake bruger FFmpeg, eller de to programmer har noget med hinanden at gøre. Det er beskrevet i #15
26-05-2013
Jeg har lige forsøgt at konvertere en bluray- 1920x1080p-mkv-fil til 1920x1080p-mp4-fil. Der valgte jeg Super HQ Surround 1080p, det tager 10 timer på min i7, 4 kerner 2.8 GHZ.
Ved Very Fast 1080p bliver kvaliteten sænket til det uacceptable med tab af framerate. Ubuntu 20.04.
20-05-2010
#4: det tager 10 timer på min i7, 4 kerner 2.8 GHZ.
LOL, Ja det kan tage timer. Brugte du HandBrake?
26-05-2013
Ja. Og afbrød igen. Det var her til aften. :-D
20-05-2010
#6: Ja. Og afbrød igen. Det var her til aften. :-D
Prøv med ffmpeg. Bemærk forskelle i ffmpeg's flags i #0 og #2. De giver ikke altid samme resultat.
26-05-2013
Der reddede du lige min bluray-samling, min aften og mit humør! Hold kæft, hvor er det her fedt, mand! 10 timer, vs. 5 minutter. Det kan intet konkurrere med.
20-05-2010
#5
Det er ret fedt ;)
26-05-2013
Utroligt, at der kan være så astronomisk forskel. Men det kan der altså. Ingen tab af kvalitet, 5. min. Så spiller det.
20-05-2010
#10: Utroligt, at der kan være så astronomisk forskel.
Teknisk kender jeg ikke årsagen, jeg kan kun gætte, fordi jeg ikke ved nok.
For hvad det er værd ...
Nyere versioner af ffmpeg,
Rå funktion i terminalen, der ikke involvere GUI programmers brugervenlighed eller DE ressourcer, der måske ikke er optimalt vedligeholdt.
26-05-2013
Mit gæt:
Dimensions, crop, og alt det gejl HandBrake presets laver. Her får man rå skønhed, som en slank 25 årig jomfru med lyst hår, når man lader ffmpeg bearbejde den pure data, lade det slå en kolbøtte og folde det ud som en lilje, uden bloat og filtre.
20-05-2010
Dette script konvertere medie filer i forskellige formater til mp4, og kopiere dem til en separat mappe. Scriptet er en one-liner, og skal blot kopieres til den mappe mediefilerne befinder sig i.
Scriptet lader ikke ffmpeg recode filerne, og det er forklaringen på at det går så hurtigt (muxer).
#!/bin/bash
# Converts media files to a separate folder called 'converted'
# Copy this script to the directory containing the media files and run it
# If you run the script on macOS and intend to watch the media files with QuickTime, you probably need to recode the files and you'll need to install ffmpeg. Some formats such as 'webm' may need more thorough (and slow) encoding.
# To install ffmpeg on macOS you may find it easiest through Homebrew (Note: Not older macOS no longer supported by Apple), run the command:
# /bin/bash -c "$(curl -fsSL https ://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
# Then run the command: brew install ffmpeg
# function - Wait for Enter to be pressed.
PAUSE1(){
echo "Do you wish to convert?"
read -p "Press [Enter] key to continue..." fackEnterKey
}
PAUSE1
# Let the terminal read the path to the directory (Linux only)
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# Start converting to mp4
# Please, add more formats if needed
mkdir -p "converted"
# No recode
for f in *.mkv;do ffmpeg -i "$f" -c copy -strict -2 "converted/${f%mkv}mp4";done
for f in *.webm;do ffmpeg -i "$f" -c copy -strict -2 "converted/${f%webm}mp4";done
for f in *.ts;do ffmpeg -i "$f" -c copy -strict -2 "converted/${f%ts}mp4";done
# With recode
#for f in *.mkv;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted/${f%mkv}mp4";done
#for f in *.webm;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted/${f%webm}mp4";done
#for f in *.ts;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted/${f%mkv}ts";done
$SHELL
20-05-2010
Hvis du ønsker at installere ffmpeg på Windows 10, har du to muligheder fra repositories
Et Windows repos, Chocolatey. FFmpeg køres fra en DOS prompt. Efter installering af Chocolatey er kommandoen:
chocolatey install ffmpeg
WSL - Windows Subsystem for Linux. Efter installering af WSL, afhænger ffmpeg installeringen af hvilken Linux du har valgt.
20-05-2010
I forbindelse med Handbrake, ser det ud til at Handbrake's udviklere ikke har tænkt sig at tilføre Handbrake multiplekser funktion af mediefiler. De begrunder det med at Handbrake er tænkt som en encoder og ikke en muxer.
De siger også at det er for besværligt at ændre Handbrake, også at det ikke handler om kompleksitet, hvad de så mener med det, og iøvrigt at Handbrake ikke er en frontend til ffmpeg.
Sagen er at mange mediefiler (ikke alle), er udmærket coded med x264 m.f., og ikke behøver en total langvarig recode, fx hvis de afspilles med VLC, SMPlayer eller på visse TV. Det kan Handbrake, og mange andre tilsvarende programmer, så ikke levere.
Konsekvensen er derfor at bruge ffmpeg, hvis fuld encoding ikke er nødvendig.
26-05-2013
Problemet med ffmpeg, er, at det er uden lyd på Samsung Smart TV. Det sker ikke med HandBrake. Der er lyd på.
20-05-2010
#16
I det tilfælde kan Samsung's medieafspiller, tilsyneladende ikke håndtere audio kodningen fra ffmpeg uden recode af den specifikke fil. Det er muligvis samme problem som sker med Apple's QuickTime.
Der er rettet i kommentaren.
Du kan forsøge om lyden virker med recode fx fra scriptet i #13 (du skal selv (un)comment), eller fra scriptet i #31, der er nemmere at bruge, og du kan forsøge om medie filen fungere på dit TV, forbundet til en computer med et HDMI kabel, hvor det er computeren, og ikke TV, der afspiller filen. VLC burde virke, fra ethvert HW eller VM installeret OS, inklusiv macOS (bortset fra på en VM installeret Mac).
FFmpeg med recode tager længere tid.
26-05-2013
Jeg bruger min gamle Dell Precision T1600. Den blæser min T550 omkuld. Så Handbrake tager ultra kort tid nu på denne Intel Xeon E31245 (8) @ 3.292GHz processor i forhold til den i7 der er i min T550.
Så det ser ikke ud til at ffmpeg er nødvendigt nu. Men det er altid godt at have i baghånden.
05-12-2009
#18: Scriptet er en one-liner, og skal blot kopieres til den mappe mediefilerne befinder sig i.
En one-liner er det nu ikke. Det er en 38-liner :-)
20-05-2010
#19
;)
Det er mest denne linje der er en one-liner:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
Dit link i #19 skal da lige bogmærkes
05-12-2009
#20: Dit link i #19 skal da lige bogmærkes
Ja, der er mange gode one-liners på siden.
18-12-2007
#19: En one-liner er det nu ikke. Det er en 38-liner :-)
Bare et fedt site. Det er bokmarket.
Vejen delte sig i to i skoven, og jeg tog den der var mindst benyttet, og det har gjort hele forskellen. - Robert Frost
Frit Software
02-06-2020
#16
Mit Samsung Tv, afspiller mkv filer direkte ud af kassen, så jeg har derfor
ingen grund til at omkode/formatere/ændre dem. Og dog! Jeg kan ikke få
tekst på mine blu ray rips uden at hårdkode dem ind i filmen.
Bemærk: Jeg er en tåbe, men prøver ikke at lede tråden i en anden retning.
Jeg finder blot emnet i tråden interessant.
Jeg har afprøvet alle frogmasters konverterings forslag og de har alle virket
på mit Tv.
Kun havet frygter ikke en tåbe
20-05-2010
#23: Og dog! Jeg kan ikke få tekst på mine blu ray rips uden at hårdkode dem ind i filmen.
Det kan jeg heller ikke på mit Philips TV, med mindre jeg kopiere mediefilen, inklusiv en UTF-8 formateret undertekst, fx en *.srt, til en USB, og forbinder USB direkte til et af fjernsynets USB porte. Det virker uanset om det er en mkv, mp4, mov eller avi. Du skal imidlertid sikre dig, at underteksten har tegnsættet UTF-8, og ikke en eller anden ISO-whatever ... og det er bedst at navnet på undertekst filen, har samme navn som filmen.
En anden metode er at tilslutte en computer til TV med HDMI, og køre filerne (mp4, mkv, mov og avi m.f.), med eksempelvis VLC. Det viser også underteksterne.
Med begge metoder slipper du for at hardcode underteksterne ind i filmen.
Med andre ord, hvis du ændre vaner, så vil samtlige film fremtidigt fungere på TV med eksterne undertekster, uden de først er hårdtkodede ind i filmene.
Alt det her er naturligvis ikke nødvendigt, hvis MKV filen virker med de eventuelt indlejrede/embedded (bemærk, ikke hårdtkodede) undertekster, eller du benytter en metode hvor en ekstern undertekst fungere. Det gør de ikke med en medieserver på lokalnettet.
For intresserede ...
Du kan ekstrahere undertekster fra mkv, hvis de indeholder sådan nogle. Det gør Bluray ofte. Jeg bruger Windows programmet Subtitle Edit (https://www.nikse.dk/subtitleedit/) til det. Subtitle Edit, der iøvrigt er skrevet af en dansker - Nikse, er nemmest at installere på Windows, men kan installeres på Linux og macOS med CrossOver el. Wine. Det er desværre ikke så nemt.
En kort video herunder, viser hvordan man hiver en undertekst ud af en Bluray mkv, der tilfældigvis hedder Extraction.mkv (Official Trailer: https://www.youtube.com/watch?v=L6P3nI6VnlY):
https://www.dropbox.com/s/arnjt8ygea363cx/extract-...
20-05-2010
Det der med at ændre vaner, er ikke altid så nemt som det måske lyder. Derfor vil jeg godt vise, så kort som muligt, for interesserede, hvad du kan gøre for at undgå at hardcode undertekster ind i film, og alligevel at gøre det hurtigt og nemt at vise film med undertekster på dit TV.
Du skal installere en Remote Desktop server på den maskine der er forbundet til TV med HDMI. Mit fortrukne er RealVNC, fordi det fungere med samtlige launchd (macOS), systemd (Linux) og Windows 10 OS.
TV skal være tilsluttet til computeren med et HDMI kabel el. trådløs HDMI, og du skal vælge HDMI porten i fjernsynets menu. I eksemplet er det en macOS, men kunne også være en systemd kompatibel Linux eller Windows. Resten vises i videoen herunder:
https://www.dropbox.com/s/zvr9s8wr9zguram/realvncl...
Så skal jeg iøvrigt undlade at gentage fra tidligere, at Apple først udviklede launchd, og senere at Linux udviklede systemd, for at erstatte FreeBSD's init og SystemStarter, med noget mere brugervenligt ...
26-05-2013
Så skal jeg iøvrigt undlade at gentage fra tidligere, at Apple først udviklede launchd, og senere at Linux udviklede systemd, for at erstatte FreeBSD's init og SystemStarter, med noget mere brugervenligt ...
Med fare for, at gå for offtopic, må jeg lige smide en lille rettelse ind, at det var FreeBSD's RC init i MacOS, der blev erstattet af launchd, og UNIX System V Init, der blev erstattet af systemd i Linux.
20-05-2010
#26
Du har ret i at det er off-topic ;) Det hører til i en ny tråd.
Sagen er blot at det er overordentligt besværligt at crossplatform administrere maskinerne, iHT hurtig visning af film med eksterne undertekster fra lokalnettet på et TV, uden launchd, systemd eller Windows 10.
Ellers er der stadig metoden med en USB tilsluttet TV. Det virker glimrende med eksterne undertekster. Visse TV registrere selv at en USB er tilsluttet, og tilbyder at vise film på den, uden at enter TV's menu. Det kan ikke blive meget mere brugervenligt.
26-05-2013
Hvis man da ellers har en kraftig desktop maskine stående kan man med fordel bruge Handbrake, og så tilvælge hardcoded undertekster.
Men har man ikke kan det blive noget mere bøvlet, at få undertekster i de forskellige respektive formater. Der er dog løsninger, og du, frogmaster, gør en forbilledlig indsats mht. den problemstilling. :-)
20-05-2010
Handbrake er en super encoder. Jeg bruger den ofte, blot ikke til at hardcode subtitles. Jeg hardcoder aldrig subtitles med noget som helst, fordi det ikke er nødvendigt.
Jeg bruger heller ikke TV's USB porte. Til gengæld en medie server (Twonky), hvis ikke undertekster er nødvendige, og en remote desktop hvis de er.
Har man først vænnet sig til metoderne, så går det hurtigt.
26-05-2013
Evt. kan en NAS - som også er en medieserver i hjemmet - løse problemet vha. Plex + NAS.
Det bundsolide FreeBSD-baserede FreeNAS, som kører med ZFS filsystemet, med mulighed for RAID og dynamisk disk-udskiftning på kørende system og meget mere - kan forbinde til Plex via. et plugin, der installeres i et grafisk webinterface, der minder om localhost:631 (CUPS)
Der er selvfølgelig masser af muligheder - endda Raspberry Pi mediaserver og meget meget mere. En stor verden af Open source for dine fødder.
20-05-2010
Dette bash er en menu, der blot skal kopieres til mappen der indeholder medie filer du ønsker at konvertere til MP4 med FFmpeg. Du får valgene mellem med og uden recode uden at gøre yderligere.
Beklager lidt Disclaimer, men jeg kan ikke fordrage licens-trippere ...
#!/bin/bash
# Disclaimer:
# This script is published under the Copyweird NFL license (No Freaking License) version 0.0 or newer.
# By using this script, you acknowledges you are obligated to obey NFL and thereby committing to the terms of NFL.
# Any usage of this script is your responsibility and yours alone. No one but you, as the user of this script, can be held responsible for any damage this script might cause unconsciously or deliberately.
# Copyweird infringement and complaints about the conditions, will be met with the optional legal requirement that you flush your head in the lavatory bowl.
# This script use 'FFmpeg' to convert media files and has absolutely nothing to do with the NFL license. FFmpeg is licensed under GNU Lesser General Public License (LGPL) version 2.1 or later. However, FFmpeg incorporates several optional parts and optimizations that are covered by the GNU General Public License (GPL) version 2 or later.
# IMPORTANT. This script need to be copied to the folder containing the media files you wish to convert.
# Define variables
PURPLE='\033[35;1m'
RED='\033[0;41;37m' # White font - red background
RED1='\033[31;1m'
RED2='\033[31;5;1m' # flashing red font (ubuntu 18.04 only)
RED3='\033[31m'
STD='\033[0;0;39m'
YEL='\033[33;1m'
WFBG='\033[40;37;1m' # bold font - black background, using 256 color background sequence
BFBG='\033[104;30m' # dark blue font - light blue background
GREEN='\033[32;1m'
CYAN='\033[36;1m'
PROGRAM_1="ffmpeg" # System name
PROG_1="FFmpeg" # User friendly name
# Check for preconditions
if ! [ -x "$(command -v $PROGRAM_1 )" ]; then
echo -e $RED"$PROG_1 is not installed but needed to convert."$STD
echo
echo -e $YEL"This script is created for Debian-Ubuntu and derivats only"$STD
echo -e $GREEN"On such ${PROG_1} will be automatically installed if you continue ..."$STD
echo -e $RED1"On all other Linux, you'll need to install ${PROG_1}according to the respective Packet Managers"$STD
sudo apt-get update && sudo apt-get install $PROGRAM_1
else
echo
echo -e ${GREEN}"$PROG_1 is installed."$STD
echo
fi
# Let the terminal read the path to the directory (Linux only)
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# Function
PAUSE(){
read -p " Press [Enter] key to continue..." fackEnterKey
}
# call item 1
one(){
echo "one() called"
PAUSE
}
# call item 2
two(){
echo "two() called"
PAUSE
}
# function to display menu
show_menus() {
clear
echo
echo -e " ${WFBG} "${STD}
echo -e " ${WFBG} C O N V E R T 2 M P 4 "${STD}
echo -e " ${WFBG} ${CYAN} "${STD}
echo -e " ${WFBG} ${CYAN} 1. No recode (Fast) "${STD}
echo -e " ${WFBG} ${CYAN} 2. Recode media files (Slow) "${STD}
echo -e " ${WFBG} ${RED2} "${STD} && sleep 1
echo -e " ${WFBG} ${RED2} q. Quit menu "${STD}
echo -e " ${WFBG} ${RED2} "${STD}
echo -e ${STD}
}
# read input from the keyboard and take an action
read_options(){
echo -e ${RED1}" IMPORTANT${YEL} This scipt need to be copied to the folder who"${STD}
echo -e ${YEL}" contain the media files you wish to convert to MP4."${STD}
echo -e ${RED1}" If you haven't done that, please Quit and correct ..."${STD}
echo
local choice
tput setaf 2
tput bold
read -p " Select option and press Enter [1 - q] " choice
tput sgr0
case $choice in
1) # No recode
echo -e ${YEL}" You have selected the fast option with no recode."${STD}
echo -e ${PURPLE}" A folder ${GREEN}converted-no-recode${PURPLE} will be created within this folder containing the converted files"${STD}
# Wait for Enter to be pressed.
PAUSE
# Start converting to mp4
# Please, add more formats below if needed
mkdir -p "converted-no-recode"
for f in *.mkv;do ffmpeg -i "$f" -c copy -strict -2 "converted-no-recode/${f%mkv}mp4";done
for f in *.webm;do ffmpeg -i "$f" -c copy -strict -2 "converted-no-recode/${f%webm}mp4";done
for f in *.ts;do ffmpeg -i "$f" -c copy -strict -2 "converted-no-recode/${f%ts}mp4";done
for f in *.mp4;do ffmpeg -i "$f" -c copy -strict -2 "converted-no-recode/${f%mp4}mp4";done ;;
2) # With recode
echo -e ${YEL}" You have selected the slow option with recode."
echo -e ${YEL}" It might take hours with very large files."${STD}
echo -e ${PURPLE}" A folder ${GREEN}converted-recoded${PURPLE} will be created within this folder containing the converted files"${STD}
# Wait for Enter to be pressed.
PAUSE
# Start converting to mp4
# Please, add more formats below if needed
mkdir -p "converted-recoded"
for f in *.mkv;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted-recoded/${f%mkv}mp4";done
for f in *.webm;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted-recoded/${f%webm}mp4";done
for f in *.ts;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted-recoded/${f%mkv}ts";done
for f in *.mp4;do ffmpeg -i "$f" -c:v copy -c:a aac -b:a 256k "converted-recoded/${f%mp4}mp4";done ;;
q) exit 0;;
*) echo -e "${RED} Please select a valid menu item...${STD}" && sleep 2
esac
}
# Trap CTRL+C, CTRL+Z and quit singles - Note: Not in usage
trap '' SIGINT SIGQUIT SIGTSTP
# Infinite menu loop
while true
do
show_menus
read_options
done