如何使用FFmpeg命令处理音视频

参考文档:

https://blog.csdn.net/m0_60259116/article/details/123899211

https://learnku.com/articles/64371

https://www.jianshu.com/p/c1b0cb30d09b

Fmpeg 是领先的多媒体框架,是一个强大的处理音视频的开源库,能够解码、编码、转码、混流、流媒体分离、滤镜和播放几乎所有格式的音视频内容。它既可以使用 API 对音视频进行处理,也可以使用 FFmpeg 命令编辑音视频文件。

包含用于音频、视频和字幕流的多个解码器和编码器,以及多个位流过滤器。

安装

ubuntu20.04安装: apt-get install -y ffmpeg

版本:

ffmpeg -version
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100

FFmpeg 目录及其作用

libavutil: 是一个包含用于简化编程的函数工具库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。

libavcodec: 是一个包含用于音频/视频编解码器的库。

libavformat: 是一个包含多媒体容器格式的合成器和分离器的库。

libavdevice: 是一个包含输入和输出设备的库,用于抓取和渲染许多常见的多媒体输入/输出软件框架,包括 Video4Linux、Video4Linux2、VfW 和 ALSA。

libavfilter: 是一个包含媒体过滤器的库。

libswscale: 是一个执行高度优化的图像缩放和色彩空间/像素格式转换操作的库。

libswresample: 是一个执行高度优化的音频重采样、rematrixing 和样本格式转换操作的库。

FFmpeg 工具及其作用

ffmpeg: ffmpeg 是一个命令行工具,用于在命令行实现 FFmpeg 具有的功能。

ffplay: ffplay 是一个使用 FFmpeg 库和 SDL 库的非常简单和便携的媒体播放器。它主要用作各种 FFmpeg API 的测试平台。

ffprobe: ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。

经过了解了 FFmpeg 的目录及其工具,下面文章着重介绍下在日常生活中,我们怎么使用 FFmpeg 命令行处理音视频文件。

查看参数

-hide_banner

默认执行ffmpeg命令都会输出上面的version信息,例如:

ffmpeg -devices  

ffmpeg -devices 
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Devices:
 D. = Demuxing supported
 .E = Muxing supported
 --
 DE alsa            ALSA audio output
  E caca            caca (color ASCII art) output device
 DE fbdev           Linux framebuffer
 D  iec61883        libiec61883 (new DV1394) A/V input device
 D  jack            JACK Audio Connection Kit
 D  kmsgrab         KMS screen capture
 D  lavfi           Libavfilter virtual input device
 D  libcdio  
 D  libdc1394       dc1394 v.2 A/V grab
 D  openal          OpenAL audio capture device
  E opengl          OpenGL output
 DE oss             OSS (Open Sound System) playback
 DE pulse           Pulse audio output
  E sdl,sdl2        SDL2 output device
 DE sndio           sndio audio playback
 DE video4linux2,v4l2 Video4Linux2 output device
 D  x11grab         X11 screen capture, using XCB
  E xv              XV (XVideo) output device

添加-hide_banner不输出编译信息。

ffmpeg -devices -hide_banner

ffmpeg -devices -hide_banner
Devices:
 D. = Demuxing supported
 .E = Muxing supported
 --
 DE alsa            ALSA audio output
  E caca            caca (color ASCII art) output device
 DE fbdev           Linux framebuffer
 D  iec61883        libiec61883 (new DV1394) A/V input device
 D  jack            JACK Audio Connection Kit
 D  kmsgrab         KMS screen capture
 D  lavfi           Libavfilter virtual input device
 D  libcdio  
 D  libdc1394       dc1394 v.2 A/V grab
 D  openal          OpenAL audio capture device
  E opengl          OpenGL output
 DE oss             OSS (Open Sound System) playback
 DE pulse           Pulse audio output
  E sdl,sdl2        SDL2 output device
 DE sndio           sndio audio playback
 DE video4linux2,v4l2 Video4Linux2 output device
 D  x11grab         X11 screen capture, using XCB
  E xv              XV (XVideo) output device

FFmpeg 采集设备

参考文档: https://www.jianshu.com/p/c1b0cb30d09b

列出设备

ffmpeg -devices -hide_banner

输出:

Devices:
 D. = Demuxing supported
 .E = Muxing supported
 --
 DE alsa            ALSA audio output
  E caca            caca (color ASCII art) output device
 DE fbdev           Linux framebuffer
 D  iec61883        libiec61883 (new DV1394) A/V input device
 D  jack            JACK Audio Connection Kit
 D  kmsgrab         KMS screen capture
 D  lavfi           Libavfilter virtual input device
 D  libcdio  
 D  libdc1394       dc1394 v.2 A/V grab
 D  openal          OpenAL audio capture device
  E opengl          OpenGL output
 DE oss             OSS (Open Sound System) playback
 DE pulse           Pulse audio output
  E sdl,sdl2        SDL2 output device
 DE sndio           sndio audio playback
 DE video4linux2,v4l2 Video4Linux2 output device
 D  x11grab         X11 screen capture, using XCB
  E xv              XV (XVideo) output device

说明:

  • Demuxing supported D代表解复用器
  • Muxing supported E表示复用器
  • 输入设备:fbdev、lavfi、oss、video4linux2、v4l2
  • 输出设备:fbdev、oss、video4linux2、v4l2

采集设备fbdev参数

命令:

ffmpeg -h demuxer=fbdev -hide_banner

输出:

Demuxer fbdev [Linux framebuffer]:
fbdev indev AVOptions:
  -framerate         <video_rate> .D.......  (default "25")

说明:

  • framerate:采集时视频图像的刷新帧率,默认值为25

示例: 获得FrameBuffer设备图像

通过获得FrameBuffer设备图像数据进行编码然后推流或录制:

ffmpeg -hide_banner -framerate 30 -f fbdev -i /dev/fb0 output.mp4

命令行执行后,Linux系统会获取终端中的图像,而不是桌面图像。

输出:

[fbdev @ 0x557123906740] w:1366 h:768 bpp:32 pixfmt:bgra fps:30/1 bit_rate:1007124480
[fbdev @ 0x557123906740] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, fbdev, from '/dev/fb0':
  Duration: N/A, start: 1685612473.213631, bitrate: 1007124 kb/s
    Stream #0:0: Video: rawvideo (BGRA / 0x41524742), bgra, 1366x768, 1007124 kb/s, 30 fps, 1000k tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[swscaler @ 0x557123915300] Warning: data is not aligned! This can lead to a speed loss
[libx264 @ 0x55712390bb80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x55712390bb80] profile High 4:4:4 Predictive, level 3.2, 4:4:4 8-bit
[libx264 @ 0x55712390bb80] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6 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 'output.mp4':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv444p, 1366x768, q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.54.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=  290 fps= 29 q=-1.0 Lsize=      63kB time=00:00:09.56 bitrate=  53.7kbits/s dup=18 drop=0 speed=0.971x  
video:58kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 7.188200%
[libx264 @ 0x55712390bb80] frame I:2     Avg QP: 9.26  size: 21250
[libx264 @ 0x55712390bb80] frame P:73    Avg QP:23.37  size:    73
[libx264 @ 0x55712390bb80] frame B:215   Avg QP:32.33  size:    53
[libx264 @ 0x55712390bb80] consecutive B-frames:  1.0%  0.0%  1.0% 97.9%
[libx264 @ 0x55712390bb80] mb I  I16..4: 94.2%  0.0%  5.8%
[libx264 @ 0x55712390bb80] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.1%  0.0%  0.0%  0.0%  0.0%    skip:99.9%
[libx264 @ 0x55712390bb80] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.2%  0.0%  0.0%  direct: 0.0%  skip:99.8%  L0:58.8% L1:41.2% BI: 0.0%
[libx264 @ 0x55712390bb80] coded y,u,v intra: 4.7% 0.0% 0.0% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x55712390bb80] i16 v,h,dc,p: 98%  1%  2%  0%
[libx264 @ 0x55712390bb80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 22% 19%  2%  7%  2%  8%  1%  6%
[libx264 @ 0x55712390bb80] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x55712390bb80] ref P L0: 98.4%  1.6%
[libx264 @ 0x55712390bb80] ref B L0: 57.2% 42.6%  0.2%
[libx264 @ 0x55712390bb80] ref B L1: 99.3%  0.7%
[libx264 @ 0x55712390bb80] kb/s:48.97
Exiting normally, received signal 2.

采集设备v4l2参数

命令:

ffmpeg -h demuxer=fbdev -hide_banner

输出:

ffmpeg -h demuxer=v4l2 -hide_banner
Demuxer video4linux2,v4l2 [Video4Linux2 device grab]:
V4L2 indev AVOptions:
  -standard          <string>     .D....... set TV standard, used only by analog frame grabber
  -channel           <int>        .D....... set TV channel, used only by frame grabber (from -1 to INT_MAX) (default -1)
  -video_size        <image_size> .D....... set frame size
  -pixel_format      <string>     .D....... set preferred pixel format
  -input_format      <string>     .D....... set preferred pixel format (for raw video) or codec name
  -framerate         <string>     .D....... set frame rate
  -list_formats      <int>        .D....... list available formats and exit (from 0 to INT_MAX) (default 0)
     all                          .D....... show all available formats
     raw                          .D....... show only non-compressed formats
     compressed                   .D....... show only compressed formats
  -list_standards    <int>        .D....... list supported standards and exit (from 0 to 1) (default 0)
     all                          .D....... show all supported standards
  -timestamps        <int>        .D....... set type of timestamps for grabbed frames (from 0 to 2) (default default)
     default                      .D....... use timestamps from the kernel
     abs                          .D....... use absolute timestamps (wall clock)
     mono2abs                     .D....... force conversion from monotonic to absolute timestamps
  -ts                <int>        .D....... set type of timestamps for grabbed frames (from 0 to 2) (default default)
     default                      .D....... use timestamps from the kernel
     abs                          .D....... use absolute timestamps (wall clock)
     mono2abs                     .D....... force conversion from monotonic to absolute timestamps
  -use_libv4l2       <boolean>    .D....... use libv4l2 (v4l-utils) conversion functions (default false)

说明:

  • standard:设置TV标准,仅用于模拟器分析帧时使用
  • channel:设置TV通道,仅用于模拟器分析帧时使用
  • video_size:设置采集视频帧大小
  • pixel_format:设置采集视频的分辨率
  • input_format:设置采集视频的分辨率
  • framerate:设置采集视频的帧率
  • list_formats:列举输入视频信号的信息
  • list_standards:列举标准信息(与standard配合使用)
  • timestamps:设置时间戳类型
  • ts:设置模拟器分析帧时使用的时间戳
  • use_libv4l2:使用第三方库libv4l2选项

使用FFmpeg采集Linux下的v4l2设备时,主要用来采集摄像头,而摄像头通常支持多种像素格式,有些还支持直接输出已经编码好的H.264数据。

摄像头

如,输出输入设备的format信息:

ffmpeg -hide_banner -f v4l2 -list_formats all -i /dev/video0 

输出:

ffmpeg -hide_banner -f v4l2 -list_formats all -i /dev/video0
[video4linux2,v4l2 @ 0x55fe5da416c0] Raw       :     yuyv422 :           YUYV 4:2:2 : 640x480 320x240 160x120
/dev/video0: Immediate exit requested

将摄像头采集为视频文件:

ffmpeg -hide_banner -s 640x480 -i /dev/video0 output.avi

采集设备x11grab参数

命令:

ffmpeg -h demuxer=x11grab

输出:

ffmpeg -h demuxer=x11grab -hide_banner
Demuxer x11grab [X11 screen capture, using XCB]:
xcbgrab indev AVOptions:
  -x                 <int>        .D....... Initial x coordinate. (from 0 to INT_MAX) (default 0)
  -y                 <int>        .D....... Initial y coordinate. (from 0 to INT_MAX) (default 0)
  -grab_x            <int>        .D....... Initial x coordinate. (from 0 to INT_MAX) (default 0)
  -grab_y            <int>        .D....... Initial y coordinate. (from 0 to INT_MAX) (default 0)
  -video_size        <string>     .D....... A string describing frame size, such as 640x480 or hd720. (default "vga")
  -framerate         <string>     .D.......  (default "ntsc")
  -draw_mouse        <int>        .D....... Draw the mouse pointer. (from 0 to 1) (default 1)
  -follow_mouse      <int>        .D....... Move the grabbing region when the mouse pointer reaches within specified amount of pixels to the edge of region. (from -1 to INT_MAX) (default 0)
     centered                     .D....... Keep the mouse pointer at the center of grabbing region when following.
  -show_region       <int>        .D....... Show the grabbing region. (from 0 to 1) (default 0)
  -region_border     <int>        .D....... Set the region border thickness. (from 1 to 128) (default 3)

说明:

  • draw_mouse:支持绘制鼠标光标
  • follw_mouse:跟踪鼠标轨迹数据
  • framerate:输入采集的视频帧率
  • show_region:获得输入桌面的指定区域
  • region_border:当show_region为1时,设置输入指定区域的边框的粗细程度
  • video_size:输入采集视频的分辨率

FFmpeg通过x11grab录制屏幕时,输入设备的设备名规则如下:

[主机名]:显示编号id.屏幕编号id[ + 起始 x 轴 , 起始 y 轴 ] 例如: :0.0

其中,主机名起始x轴与起始y轴 均为可选参数。

录屏

桌面录制

ffmpeg -f x11grab -framerate 25 -video_size 1366x768 -i :0.0 out.mp4
  • 设置输入帧率为25,图像分辨率为1366x768,采集的设备为“0.0”,输出文件为out.mp4。

桌面录制指定起始位置

ffmpeg -f x11grab -framerate 25 -video_size 352x288 -i :0.0+300,200 out.mp4
  • 通过参数:0.0+300,200 指定x坐标为200,y坐标为200,实现指定区域的录制。

桌面录制带鼠标记录的视频

ffmpeg -f x11grab -video_size 1366x768 -follow_mouse 1 -i :0.0 out.mp4
  • 通过-follow_mouse 参数指定视频录制中带鼠标。

FFmpeg 处理音视频功能说明

FFmpeg 命令根据功能的区分,大致可以分为:录制命令,音视频的合成和分离,音视频的切割与合并,图片、视频互相转换等几个大的模块。下面我们介绍下如何使用 FFmpeg 命令行处理音视频实现以上的几个功能。

本文以 Ubuntu 操作系统为例,通过简单的命令 sudo apt-get install ffmpeg 来安装。

也可以在 Windows,MacOS,其他 Linux 操作系统安装 FFmpeg 后执行一下命令。

Mac(-f avfoundation) 上才有的功能

Print the list of AVFoundation supported devices and exit:

ffmpeg -f avfoundation -list_devices true -i ""

录屏

ffmpeg -f avfoundation -i 1 -r 30 out.yuv

说明:

  • f 指定使用 avfoundation 采集数据。
  • -i 指定从哪儿采集数据,它是一个文件索引号。在我的电脑上,1 代表桌面(可以通过上面的命令查询设备索引号)。
  • -r 指定帧率。按 ffmpeg 官方文档说-r 与-framerate 作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r 用于限制输出。

录屏+声音

ffmpeg -f avfoundation -i 1:0 -r 29.97 -c:v libx264 \
-crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 48k out.flv

说明:

  • -i 1:0 冒号前面的 “1” 代表的屏幕索引号。冒号后面的"0"代表的声音索相号。
  • -c:v 与参数 -vcodec 一样,表示视频编码器。c 是 codec 的缩写,v 是 video 的缩写。
  • -crf 是 x264 的参数。 0 表式无损压缩。
  • -c:a 与参数 -acodec 一样,表示音频编码器。
  • -profile 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。
  • -b:a 指定音频码率。 b 是 bitrate 的缩写, a 是 audio 的缩与。

录视频

ffmpeg -framerate 30 -f avfoundation -i 0 out.mp4

说明:

  • -framerate 限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
  • -f 指定使用 avfoundation 采集数据。
  • -i 指定视频设备的索引号。

视频+音频

ffmpeg -framerate 30 -f avfoundation -i 0:0 out.mp4

录音

ffmpeg -f avfoundation -i :0 out.wav

录制音频裸数据

ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm

音视频操作

抽取音频流

ffmpeg -i input.mp4 -acodec copy -vn out.aac

说明:

  • acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
  • vn: v 代表视频,n 代表 no 也就是无视频的意思。

抽取音频,转换为MP3格式

ffmpeg -i input.mp4 -acodec libmp3lame  out.mp3

抽取视频流

ffmpeg -i input.mp4 -vcodec copy -an out.h264

说明:

  • vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
  • an: a 代表视频,n 代表 no 也就是无音频的意思。

视频转格式

ffmpeg -i video_test.mp4 -vcodec copy -acodec copy out_convert.flv

上面的命令表式的音频、视频都直接 copy,只是将 mp4 的封装格式转成了 flv。

去除视频声音

ffmpeg -i video_auido.mp4 -vcodec copy -an video.mp4 

视频压缩

  1. 压缩的文件更大更清晰,一般情况下不用

    ffmpeg -i test_ffmpeg.mp4
    
  2. 减小视频码率,压缩的更模糊

    ffmpeg -i out.MP4 -b:v 500k 512k_out.mp4
    

音视频合并

ffmpeg -i input.mp4 -i out.aac -vcodec copy -acodec copy out.mp4

提取 YUV 数据

ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv
播放
ffplay -s wxh out.yuv

说明:

  • -c:v rawvideo 指定将视频转成原始数据
  • -pixel_format yuv420p 指定转换格式为 yuv420p

视频 YUV 转 H264

ffmpeg -f rawvideo -pix_fmt yuv420p -s 640x480 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

提取音频 PCM 数据

ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
播放
ffplay -ar 44100 -ac 2 -f s16le -i out.pcm

PCM 转 WAV

ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i input.raw output.wav

添加水印

图片水印

ffmpeg -i input.mp4  -vf "movie=logo.png,scale=128:72[watermask];[in][watermask] overlay=96:54 [out]" water_img.mp4

# 报错 The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it. 
# 添加 -strict -2
ffmpeg -i input.mp4  -vf "movie=logo.png,scale=128:72[watermask];[in][watermask] overlay=96:54 [out]" -strict -2 water_img.mp4

文字水印

ffmpeg -i input.mp4 -vf "drawtext=fontfile=FZBaoHTJW_Xi.TTF: text='WL':x=128:y=72:fontsize=24:fontcolor=red:shadowy=2" water_text.mp4

ffmpeg -i input.mp4 -vf "drawtext=fontfile=FZBaoHTJW_Xi.TTF: text='WL':x=128:y=72:fontsize=24:fontcolor=red:shadowy=2" -strict -2 water_text.mp4

视频缩放

fmpeg -i input.mp4 -vf scale=iw/2:-1 scale.mp4

ffmpeg -i input.mp4 -vf scale=iw/2:-1 -strict -2 scale.mp4

说明:

  • -vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。-1 表示高度随宽度一起变化。

降低视频的分辨率且转换视频格式

ffmpeg -i input.avi -vf scale=640:360 out.mp4

视频裁剪

ffmpeg -i VR.mov  -vf crop=in_w-300:in_h-200 \
-c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4

crop 格式:crop=out_w:out_h:x:y

  • out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。
  • out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。
  • x : X 坐标
  • y : Y 坐标

如果 x 和 y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。

视频左右(上下)翻转

ffmpeg  -i input.mp4 \
-filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" \
duicheng.mp4

ffmpeg  -i input.mp4 \
-strict -2 \
-filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" \
duicheng.mp4

说明:

  • hflip 水平翻转
  • 如果要修改为垂直翻转可以用 vflip

旋转视频

ffmpeg -i input.mp4 -vf "transpose=2" output-rotate.mp4

ffmpeg -i input.mp4 -vf "transpose=2" \
-strict -2 \
output-rotate.mp4

说明:

  • transpose=0:垂直翻转(默认)
  • transpose=1: 顺时针旋转 90 度
  • transpose=2: 逆时针旋转 90 度
  • transpose=3: 垂直翻转

裁剪片段

ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out_cut.mp4

ffmpeg -i input.mp4 -ss 00:00:00 -t 10 -strict -2 out_cut.mp4

说明:

  • -ss:使用此参数设置剪辑的开始时间,精确到秒
  • -to:允许您指定剪辑的结束时间
  • -c:使用此参数设置剪辑的编解码器
  • -t:使用此参数设置剪辑的持续时间

音视频合并

首先创建一个 videolist.txt 文件,文件内容如下:file 'test1.mp4'\nfile 'test2.mp4'

然后执行下面的命令:

echo -e "file 'input.mp4'\nfile 'out.mp4" > videolist.txt
ffmpeg -f concat -i videolist.txt -c copy output.mp4

HLS 切片

ffmpeg -i input.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls  out.m3u8

说明:

  • -strict -2 指明音频使有 AAC
  • -f hls 转成 m3u8 格式

视频转 JPEG

ffmpeg -i video_test.mp4 -r 1 -f image2 image-%3d.jpeg

图片格式转换

ffmpeg -i input.bmp out.jpg
ffmpeg -i input.bmp out.png

视频按帧截图

主要用于用户手动截图或上传视频生成缩略图

此处:-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,-vframes 设置转换多少桢(frame)的视频,示例命令是获取第一秒第一帧的截图。

注:生成的截图最好使用 jpg 格式,占用空间较小,如果需要使用其他格式,根据业务需求自行设置即可。

ffmpeg -ss 00:00:01 -y -i video_test.mp4 -vframes 1 snap.jpg

视频转 GIF

ffmpeg -i video_test.mp4 -r 1 -f image2 image-%3d.jpeg

图片转视频

ffmpeg -f image2 -i image-%3d.jpeg out_img_video.mp4

视频添加字幕 srt

ffmpeg -i video_test.mp4 -vf subtitles=subtitle.srt out_subtitle.mp4

视频添加音乐+字幕

ffmpeg -i video_test.mp4 -i audio_bg.mp3 -vf subtitles=all_mp3_srt.srt out_mp3_subtitle.mp4