Εχετε ένα βίντεο από τις διακοπές σας σε ένα format π.χ. Matroska και θέλετε να το μετατρέψετε σε ένα άλλο format, π.χ. MP4; Θέλετε μήπως να προσθέσετε υπότιτλους από κάποιο srt αρχείο; Η' να αλλάξετε μέγεθος στο βίντεο; Ολα αυτά γίνονται με το ffmpeg, ένα ανοικτού κώδικα πρόγραμμα που υπάρχει στα αποθετήρια των περισσότερων διανομών Linux.
Η εγκατάσταση του ffmpeg στο Ubuntu γίνεται με την εντολή:
sudo apt install ffmpeg
Για άλλες διανομές, όπως το Debian ή το Fedora, πιθανότατα πρέπει πρώτα να έχετε ενεργοποιήσει το κατάλληλο αποθετήριο. Π.χ. για στο Fedora χρειάζεστε να ενεργοποιήσετε το αποθετήριο RPMFusion.
To βασικό που πρέπει να θυμάστε ότι τα αρχεία πολυμέσων καθορίζονται από container format (π.χ Matroska, MP4, κλπ) όπου μέσα εκεί υπάρχουν "streams" από βίντεο και ήχο. Και κάθε stream ειναι κωδικοποιημένο με κάποιο codec, π.χ. H.264 για βίντεο, και mp3 ή aac για το stream ήχου.
Για να δείτε πληροφορίες για ένα αρχείο πολυμέσων το ffmpeg προσφέρει την εντολή ffprobe. Παράδειγμα:
$ ffprobe linuxinsider-Fedora-28-installation.mp4 ffprobe version 2.8.14-0ubuntu0.16.04.1 Copyright (c) 2007-2018 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609 configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'linuxinsider-Fedora-28-installation.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: mp42mp41isomiso2 creation_time : 2018-08-10 14:36:28 encoder : x264 Duration: 00:06:56.65, start: 0.000000, bitrate: 224 kb/s Stream #0:0(eng): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 1440x900 [SAR 1:1 DAR 8:5], 188 kb/s, 15 fps, 15 tbr, 1500 tbn, 30 tbc (default) Metadata: creation_time : 2018-08-10 14:36:28 handler_name : VideoHandler Stream #0:1(eng): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, mono, s16p, 31 kb/s (default) Metadata: creation_time : 2018-08-10 14:36:28 handler_name : SoundHandler
Παραδείγματα χρήσης του FFMPEG
Αλλαγή container: Μετατροπή MKV σε MP4
Η διαδικασία είναι πολύ απλή, γιατί πρακτικά "αντιγράφουμε" το βίντεο και το audio χωρίς transcoding. Με άλλα λόγια, απλά αλλάζουμε "container" format:
ffmpeg -i IN.mkv -c:v copy -c:a copy OUT.mp4
ή πιο "μαζεμένα"
ffmpeg -i ΙΝ.mkv -c:av copy OUT.mp4
Μετατροπή σε WebM
Οι παράμετροι c:v και c:a δεν είναι καν αναγκαίοι σε ορισμένες περιπτώσεις:
ffmpeg -i IN.mp4 OUT.webm
Φυσικά μπορούμε να κάνουμε το ανάποδο, διευκρινίζοντας τι θα γίνει με τα streams:
ffmpeg -i IN.webm -c:av copy OUT.mkv
Θα μπορούσατε κι εδώ να μην βάλετε το -c:av copy, οπότε το ffmpeg θα έφτιαχνε ένα matroska αρχείο με τα ίδια codecs που είχε το mp4.
Σημείωση: Για να δείτε ποια codecs υποστηρίζει το ffmpeg σας δίνετε την εντολή:
ffmpeg -codecs
Αλλαγή κωδικοποίησης μόνο σε ένα stream
Αν π.χ. θέλετε να αλλάξετε κωδικοποίηση στο stream του ήχου, τότε θα κάνατε κάτι σαν κι αυτό:
ffmpeg -i IN.webm -c:v copy -c:a flac OUT.mkv
Transcoding σε H.264 & AC3 / AAC
Αν όμως θέλουμε να κάνουμε πλήρες transcode, π.χ. να μετατρέψουμε το stream του βίντεο σε H.264 και το stream του ήχου σε AC3, χρησιμοποιούμε την εντολή:
ffmpeg -i IN.MKV -c:v libx264 -c:a ac3 OUT.mp4
Για μέγιστη συμβατότητα, προτιμήστε το codec ηχου MPEG-4 AAC, οπότε η παραπάνω εντολή γίνεται:
ffmpeg -i IN.MKV -c:v libx264 -c:a aac OUT.mp4
Σημείωση: αν θέλετε να γράψετε ήχο σε aac, μπορεί να πρέπει χρησιμοποιήσετε την παράμετρο -strict -2 όπως:
ffmpeg -i IN.ΜKV-c:v libx264 -c:a aac -strict -2 OUT.mp4
Transcoding με preset και crf
Ολα καλά μέχρι εδώ, αλλά υπάρχουν διάφορες ρυθμίσεις με τις οποίες μπορούμε να παίξουμε. Οι δύο πιο βασικές επιλογές το preset και το crf. Όσο πιο μικρό είναι το CRF τόσο "καλύτερη" ποιότητα έχει το βίντεο και τόσο μεγαλύτερο ειναι το μέγεθός του. Η εξορισμού ρύθμιση (αν δεν το αλλάξετε δηλαδή) είναι το crf=24. Οπότε βάζοντας π.χ. crf=27 περιμένουμε το βίντεο να είναι μικρότερο σε μέγεθος (με λίγο χειρότερη ποιότητα):
ffmpeg -i IN.MKV -c:v libx264 -c:a ac3 -preset fast -crf 27 OUT.mp4
Για αυξημένη συμβατότητα με παλιούς players, μπορούμε να προσθέσουμε την επιλογή profile:v baseline και -level 3.0
ffmpeg -i IN.MKV -c:v libx264 -preset fast -crf 27 -c:a ac3 -profile:v baseline -level 3.0 OUT.mp4
Αλλαγή bitrate στο βίντεο
Χρήσιμη είναι και η παράμετρος -b που αλλάζει το bitrate του βίντεο. Παράδειγμα, για να αντιγράψετε τον ήχο αλλά να μετατρέψετε το βίντεο σε VP9 codec με σταθερό bitrate 1ΜΒ το δευτερόλεπτο για να προκύψει ένα Matroska αρχείο:
ffmpeg -i IN.mkv -c:a copy -c:v vp9 -b:v 1M OUT.mkv
Αλλαγή framerate στο βίντεο
Μια άλλη χρήσιμη παράμετρος ειναι -r που ορίζει το ρυθμό των καρέ (framerate). Παράδειγμα, για να αντιγράψετε τον ήχο αλλά να μετατρέψετε το βίντεο σε H.264 codec με σταθερό framerate 30fps και να προκύψει ένα Matroska αρχείο:
ffmpeg -i IN.mkv -c:a copy -c:v x264 -r 30 OUT.mkv
Προσοχή: η αλλαγή bitrate και framerate γίνεται συνήθως για να "μειώσουμε" την ποιότητα του αρχικού βίντεο ώστε να προκύψει ένα μικρότερο αρχείο.
Το αντίθετο δεν λειτουργεί. Δηλαδή μην περιμένετε πως σε ένα αρχικό βίντεο χαμηλής ποιότητας/bitrate μπορείτε να το κάνετε transcode με το ffmpeg σε υψηλότερο bitrate/framerate και να πάρετε ένα "καλύτερο" βίντεο γιατί πολύ απλά αυτό δεν γίνεται.
Υποτιτλισμός βίντεο με ffmpeg
Αν έχετε ένα αρχείο .srt με τους υπότιτλους του βίντεο σας, τότε το transcoding του βίντεο ώστε να παραχθεί ένα νέο βίνεο με ενσωματωμένους υπότιτλους γίνεται με την παράμετρο -vf subtitles=arxeio.srt, π.χ.:
ffmpeg -i IN.mp4 -vf subtitles=greek.srt -strict -2 OUT.mp4
Transcoding με preset και crf και αλλαγή ανάλυσης
Αν θέλετε να παίξετε με την ανάλυση του βίντεο σας, υπάρχει το φίλτρο scale. Με την παρακάτω εντολή μετατρέπουμε το βίντεο σε 720p
ffmpeg -i IN.mp4 -vf scale=-1:720 -c:v libx264-c:a ac3 OUT.mp4
Ενας άλλος τρόπος να αλλάξετε διαστάσεις του βίντεο είναι με την παράμετρο -s που δέχεται προκαθορισμένα μεγέθη. Π.χ. για 720p, δίνετε hd720:
ffmpeg -i ΙΝ.mkv -c:a copy -s hd720 OUT.mp4
Εναλλακτικά, η παράμετρος δέχεται και αναλύσεις τύπου "Πλάτος x Υψος" σε pixels:
ffmpeg -i input.mkv -c:a copy -s 1280x720 output.mkv
Τριμάρισμα ή περικοπή βίντεο με το ffmpeg
Για να κόψετε ένα κομμάτι από ένα σημείο του βίντεο σας, μπορείτε να πειραματιστείτε με τις παραμέτρους -ss και -t. Η πρώτη ορίζει από ποιο σημείο (σε ΩΩ:ΛΛ:ΔΔ) του αρχικού βίντεο θα ξεκινήσει η επεξεργασία ενώ η -t ορίζει πόσα δευτερόλεπτα θα "κοπούν". Στο παράδειγμα, ξεκινάμε από το σημείο 00:01:00 και κόβουμε 10 secs:
ffmpeg -i ΙΝ.mkv -c:av copy -ss 00:01:00 -t 10 OUT.mp4
Transcoding πολλαπλών αρχείων
Αν έχετε πολλά αρχεία multimedia σε ένα φάκελο, με το ffmpeg και μια for loop του Bash τα μετατρέπετε σε ό,τι θέλετε. Για παράδειγμα, δείτε το παρακάτω onliner. Στο παράδειγμα αυτό, του λέμε να κανει map και copy το video stream, να κάνει map το audio stream αλλά με transcode σε AAC και τέλος να κάνει copy το 4 stream από το source file (όπου πχ. μπορεί να είναι υπότιτλοι στα ελληνικά). Απλά αλλάξτε το *.mkv στην κατάληξη που έχουν τα αρχεία σας και το "-test.mkv" σε ότι suffix και extesion/format θέλετε να έχουν τα transcoded αρχεία.
for i in `ls *.mkv`; do ffmpeg -i $i -map 0:v -map 0:a -map 0:4 -c:v copy -c:a aac $i-test.mkv; done
Δείτε περισσότερα:
- Συνδεθείτε ή εγγραφείτε για να σχολιάσετε