Πως μετατρέπω βίντεο με το FFMPEG για transcoding, αλλαγή μεγέθους, υποτιτλισμό κλπ

Εχετε ένα βίντεο από τις διακοπές σας σε ένα 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

 

Δείτε περισσότερα:

Τεκμηρίωση FFMPEG

Δώσε αστέρια!

MO: 4.4 (ψήφοι: 8)