FFmpeg в Linux

Опубликовано admin - вс, 03/26/2023 - 13:00

В Linux программа FFmpeg, являющаяся бесплатным консольным мультимедийным фреймворком, позволяет конвертировать, записывать, транслировать аудио и видео.

Примеры использования FFmpeg в Linux

Содержание

Синтаксис

ffmpeg [глобальные_параметры] {[параметры_входного_файла] -i входной_файл}... {[параметры_выходного_файла] выходной_файл}...

Установка FFmpeg в Linux

Установка в Ubuntu:

$ sudo apt install ffmpeg

Установка в Arch Linux:

$ yay -S ffmpeg

Поддерживаемые форматы

Для получения списка форматов, поддерживаемых FFmpeg, выполняем запуск программы с параметром -formats:

oleg@mobile:~:$ ffmpeg -formats
...
File formats:
 D. = Demuxing supported
 .E = Muxing supported
 --
 D  3dostr          3DO STR
  E 3g2             3GP2 (3GPP2 file format)
  E 3gp             3GP (3GPP file format)
 D  4xm             4X Technologies
  E a64             a64 - video for Commodore 64
 D  aa              Audible AA format files
 D  aac             raw ADTS AAC (Advanced Audio Coding)
 D  aax             CRI AAX
 DE ac3             raw AC-3
...
 DE wav             WAV / WAVE (Waveform Audio)
 D  wavarc          Waveform Archiver
 D  wc3movie        Wing Commander III movie
  E webm            WebM
  E webm_chunk      WebM Chunk Muxer
 DE webm_dash_manifest WebM DASH Manifest
  E webp            WebP
 D  webp_pipe       piped webp sequence
 DE webvtt          WebVTT subtitle
 DE wsaud           Westwood Studios audio
 D  wsd             Wideband Single-bit Data (WSD)
 D  wsvqa           Westwood Studios VQA
 DE wtv             Windows Television (WTV)
 DE wv              raw WavPack
 D  wve             Psion 3 audio
 D  x11grab         X11 screen capture, using XCB
 D  xa              Maxis XA
 D  xbin            eXtended BINary text (XBIN)
 D  xbm_pipe        piped xbm sequence
 D  xmd             Konami XMD
 D  xmv             Microsoft XMV
 D  xpm_pipe        piped xpm sequence
  E xv              XV (XVideo) output device
 D  xvag            Sony PS3 XVAG
 D  xwd_pipe        piped xwd sequence
 D  xwma            Microsoft xWMA
 D  yop             Psygnosis YOP
 DE yuv4mpegpipe    YUV4MPEG pipe
oleg@mobile:~:$

Здесь приведён лишь фрагмент списка поддерживаемых форматов, так как весь список огромен.

Использование FFmpeg в Linux

Информация о файле

Для получения сведений о медиафайле, запустим:

oleg@mobile:~:$ ffmpeg -i bulgarian_05.flv 
ffmpeg version n6.0 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.1 (GCC) 20230201
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-opencl --enable-opengl --enable-shared --enable-version3 --enable-vulkan
  libavutil      58.  2.100 / 58.  2.100
  libavcodec     60.  3.100 / 60.  3.100
  libavformat    60.  3.100 / 60.  3.100
  libavdevice    60.  1.100 / 60.  1.100
  libavfilter     9.  3.100 /  9.  3.100
  libswscale      7.  1.100 /  7.  1.100
  libswresample   4. 10.100 /  4. 10.100
  libpostproc    57.  1.100 / 57.  1.100
Input #0, flv, from 'bulgarian_05.flv':
  Metadata:
    starttime       : 0
    totalduration   : 398
    totaldatarate   : 181
    bytelength      : 8990890
    canseekontime   : true
    sourcedata      : B4A7D0B65MM1395514468407002
    purl            : 
    pmsg            : 
    httphostheader  : r17---sn-nv47en7d.googlevideo.com
  Duration: 00:06:37.60, start: 0.000000, bitrate: 180 kb/s
  Stream #0:0: Video: flv1, yuv420p, 320x240, 111 kb/s, 25 fps, 25 tbr, 1k tbn
  Stream #0:1: Audio: mp3, 22050 Hz, stereo, fltp, 65 kb/s
At least one output file must be specified
oleg@mobile:~:$ 

В приведённом выводе FFmpeg отобразил информацию о медиафайле вместе с подробностями, такими как версия, сведения о конфигурации, уведомление об авторских правах, параметры сборки и библиотеки и т. п.

Для получения вывода без всех подробностей используется флаг -hide_banner:

oleg@mobile:~:$ ffmpeg -i bulgarian_05.flv -hide_banner
Input #0, flv, from 'bulgarian_05.flv':
  Metadata:
    starttime       : 0
    totalduration   : 398
    totaldatarate   : 181
    bytelength      : 8990890
    canseekontime   : true
    sourcedata      : B4A7D0B65MM1395514468407002
    purl            : 
    pmsg            : 
    httphostheader  : r17---sn-nv47en7d.googlevideo.com
  Duration: 00:06:37.60, start: 0.000000, bitrate: 180 kb/s
  Stream #0:0: Video: flv1, yuv420p, 320x240, 111 kb/s, 25 fps, 25 tbr, 1k tbn
  Stream #0:1: Audio: mp3, 22050 Hz, stereo, fltp, 65 kb/s
At least one output file must be specified
oleg@mobile:~:$ 

Конвертирование видеофайла в иной формат

Поскольку FFmpeg является многофункциональным и мощным конвертером аудио и видео, то он способен конвертировать медиафайлы практически в любые форматы. Можем, например, преобразовать файл .flv в .mp4:

oleg@mobile:~:$ ffmpeg -i bulgarian_05.flv bulgarian_05.mp4
ffmpeg version n6.0 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.1 (GCC) 20230201
...
Input #0, flv, from 'bulgarian_05.flv':
  Metadata:
    starttime       : 0
    totalduration   : 398
    totaldatarate   : 181
    bytelength      : 8990890
    canseekontime   : true
    sourcedata      : B4A7D0B65MM1395514468407002
    purl            : 
    pmsg            : 
    httphostheader  : r17---sn-nv47en7d.googlevideo.com
  Duration: 00:06:37.60, start: 0.000000, bitrate: 180 kb/s
  Stream #0:0: Video: flv1, yuv420p, 320x240, 111 kb/s, 25 fps, 25 tbr, 1k tbn
  Stream #0:1: Audio: mp3, 22050 Hz, stereo, fltp, 65 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (flv1 (flv) -> h264 (libx264))
  Stream #0:1 -> #0:1 (mp3 (mp3float) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 0x55df7bf56080] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x55df7bf56080] profile High, level 1.3, 4:2:0, 8-bit
[libx264 @ 0x55df7bf56080] 264 - core 164 r3095 baee400 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'bulgarian_05.mp4':
  Metadata:
    starttime       : 0
    totalduration   : 398
    totaldatarate   : 181
    bytelength      : 8990890
    canseekontime   : true
    sourcedata      : B4A7D0B65MM1395514468407002
    purl            : 
    pmsg            : 
    httphostheader  : r17---sn-nv47en7d.googlevideo.com
    encoder         : Lavf60.3.100
  Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(progressive), 320x240, q=2-31, 25 fps, 12800 tbn
    Metadata:
      encoder         : Lavc60.3.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
  Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc60.3.100 aac
frame= 9941 fps=235 q=-1.0 Lsize=    7497kB time=00:06:37.75 bitrate= 154.4kbits/s speed= 9.4x     
video:1785kB audio:5412kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.176303%
[libx264 @ 0x55df7bf56080] frame I:44    Avg QP:12.09  size:  6636
[libx264 @ 0x55df7bf56080] frame P:2943  Avg QP:14.08  size:   387
[libx264 @ 0x55df7bf56080] frame B:6954  Avg QP:13.80  size:    57
[libx264 @ 0x55df7bf56080] consecutive B-frames:  5.7%  2.2%  2.3% 89.8%
[libx264 @ 0x55df7bf56080] mb I  I16..4: 56.5% 25.1% 18.4%
[libx264 @ 0x55df7bf56080] mb P  I16..4:  0.5%  1.1%  0.4%  P16..4:  5.8%  1.0%  0.8%  0.0%  0.0%    skip:90.2%
[libx264 @ 0x55df7bf56080] mb B  I16..4:  0.1%  0.1%  0.1%  B16..8:  3.4%  0.1%  0.1%  direct: 0.1%  skip:96.1%  L0:59.9% L1:38.2% BI: 1.9%
[libx264 @ 0x55df7bf56080] 8x8 transform intra:40.4% inter:59.6%
[libx264 @ 0x55df7bf56080] coded y,uvDC,uvAC intra: 28.9% 43.2% 33.5% inter: 0.9% 1.3% 0.7%
[libx264 @ 0x55df7bf56080] i16 v,h,dc,p: 70% 11% 16%  2%
[libx264 @ 0x55df7bf56080] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 14% 56%  2%  2%  2%  2%  2%  2%
[libx264 @ 0x55df7bf56080] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 20% 25%  5%  6%  5%  6%  5%  6%
[libx264 @ 0x55df7bf56080] i8c dc,h,v,p: 67% 13% 13%  7%
[libx264 @ 0x55df7bf56080] Weighted P-Frames: Y:7.2% UV:1.2%
[libx264 @ 0x55df7bf56080] ref P L0: 81.5%  5.2%  9.6%  3.3%  0.4%
[libx264 @ 0x55df7bf56080] ref B L0: 60.5% 38.2%  1.3%
[libx264 @ 0x55df7bf56080] ref B L1: 97.7%  2.3%
[libx264 @ 0x55df7bf56080] kb/s:36.76
[aac @ 0x55df7bf57840] Qavg: 64915.191
oleg@mobile:~:$ 

Конвертирование видеофайла в аудиофайл

Для преобразования видеофайла в аудиофайл нужно лишь указать выходной формат (.mp3, .ogg или иной), опция -vn отключит запись видео:

oleg@mobile:~:$ ffmpeg -i bulgarian_05.mp4 -vn bulgarian_05.mp3
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bulgarian_05.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.3.100
  Duration: 00:06:37.77, start: 0.000000, bitrate: 154 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 320x240, 36 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.3.100 libx264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 111 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:1 -> #0:0 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, mp3, to 'bulgarian_05.mp3':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    TSSE            : Lavf60.3.100
  Stream #0:0(und): Audio: mp3, 22050 Hz, stereo, fltp (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.3.100 libmp3lame
size=    3109kB time=00:06:37.79 bitrate=  64.0kbits/s speed=80.2x       
video:0kB audio:3108kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.010336%
oleg@mobile:~:$ 

Извлечение изображений из видеофайла

FFmpeg позволяет с лёгкостью извлекать изображения из видеофайла:

oleg@mobile:~:$ ffmpeg -i bulgarian_05.mp4 -r 1 -f image2 image-%2d.png    
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bulgarian_05.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.3.100
  Duration: 00:06:37.77, start: 0.000000, bitrate: 154 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 320x240, 36 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.3.100 libx264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 111 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> png (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'image-%2d.png':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.3.100
  Stream #0:0(und): Video: png, rgb24(pc, gbr/unknown/unknown, progressive), 320x240, q=2-31, 200 kb/s, 1 fps, 1 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.3.100 png
frame=  399 fps= 86 q=-0.0 Lsize=N/A time=00:06:38.00 bitrate=N/A dup=0 drop=9542 speed=85.8x      
video:15747kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
oleg@mobile:~:$ 

Здесь:

-r-
Устанавливает частоту кадров (значение по умолчанию равно 25)
-f-
Указывает выходной формат (формат изображения в данном случае)
image-%2d.png
Указывает желаемое название извлечённых изображений

Заключение

Здесь были приведены простейшие примеры использования в Linux фреймворка FFmpeg. Возможности программы весьма велики и изучив работу с ней вы не будете разочарованы.

Поделиться с друзьями