美文网首页技术
FFmpeg命令行使用

FFmpeg命令行使用

作者: iOS开发之FFmpeg | 来源:发表于2021-04-03 09:50 被阅读0次

FFmpeg的命令非常多,经常看着会云里雾里的,个人认为没必要去硬背,只要打开Terminal,输入ffmpeg -help命令,这条命令会告述你FFmpeg支持的大部分常用命令以及使用方式。查看这些输出的信息,基本上就会使用很多常用的命令了。
你会发现执行ffmpeg -help会输出一大坨,那都是些啥玩意呢,不着急,咱们一步一步来慢慢品尝。

ffmpeg version 4.1.4 ...

第一个就是输出我们安装的FFmpeg的版本号

configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1.4_1 
--enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr

--prefix 是指FFmpeg的安装路径
--enable 是你安装的FFmpeg支持的三方库 这里可以看出支持libx264libx265的编码,以及支持videotoolboxvideotoolbox是Mac、iOS上的一个系统自带硬编解码库,FFmpeg也给予了支持,非常的给力。

 libavutil      //工具库
 libavcodec    //编解码库
 libavformat    //解协议、解封装库
 libavdevice    //设备库
 libavfilter   //滤镜库
 libavresample  
 libswscale    
 libswresample 
 libpostproc  

这是输出FFmpeg里面包含的库,这些都是独立的,是可以单独拎出来使用的,你如果只要编解码,那你就只要在项目中导入libavcodec即可

 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

这是告诉我们命令行使用格式
[options]这个是全局参数
[infile options] 这个是输入文件的参数
infile 这个是输入文件的路径
[outfile options] 这个是输出文件的参数
outfile 这个是输出文件的路径
细心的你肯定发现infileoutfile的后面有个...,这是在告诉我们输入、输出文件可以分别有一个或者多个。
比如执行ffmpeg -i test.h264 -i test.aac -c copy test.mp4
这条命令会把一个h264文件和一个aac的音频文件合并并输出一个mp4格式的文件,这其中就有两个输入文件、一个输出文件。

Getting help:
    -h      -- print basic options
    -h long -- print more options
    -h full -- print all options (including all format and codec specific options, very long)
    -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf
    See man ffmpeg for detailed description of the options.

这些是详细的帮助信息
-h long 打印更多的选项参数。
-h full 打印所有的选项参数,包括所有针对于formatcodec的选项,信息特别的长。
man ffmpeg: 查看FFmpeg的帮助手册。
-h type=name 打印指定名称的decoder/encoder/demuxer/muxer/filter的所有选项信息。
比如你要查询scale滤镜的使用方式,我们就执行ffmpeg -h filter=scale
输出如下:

scale AVOptions:
  w                 <string>     ..FV..... Output video width
  width             <string>     ..FV..... Output video width
  h                 <string>     ..FV..... Output video height
  height            <string>     ..FV..... Output video height
  flags             <string>     ..FV..... Flags to pass to libswscale (default "bilinear")
  interl            <boolean>    ..FV..... set interlacing (default false)
  in_color_matrix   <string>     ..FV..... set input YCbCr type (default "auto")
  out_color_matrix  <string>     ..FV..... set output YCbCr type
  in_range          <int>        ..FV..... set input color range (from 0 to 2) (default auto)
...

这就告诉我们scale滤镜有wh等参数,我们就这样使用scale滤镜,
ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2h=ih/2" output.mp4
其中iw代表输入视频的宽,ih代表输入视频的高,这条命令就把输入的视频缩小一倍,这里你可能会有疑问,我都不记得那些滤镜的名字,就无法使用这个去查了,哈哈不要急,还记得上面的帮助命令吗,ffmpeg -filters可以输出所有的滤镜名字了,如果你觉的输出太多,你不好找的话,你只要记得这个滤镜大概是叫什么名字、包含什么字母,你就借助grep指令去输出里面搜索关键字,这样就只会输出你关心的滤镜名了,如ffmpeg -filters | grep over

Print help / information / capabilities:
-L                  //show license
-h topic           // show help
-? topic            //show help
-help topic         //show help
--help topic        //show help
-version            //显示版本号
-buildconf         //显示编译配置,如上面所说的 --enable-libx264 --enable-libx265 --enable-videotoolbox  这种你所编译的ffmpeg所支持的三方库功能
-formats            //显示支持的所有格式
-muxers             //显示复用器
-demuxers          //显示可用的解复用器
-devices            //显示支持的设备 
-codecs             //显示可用的编解码器
-decoders         //显示可用的解码器
-encoders        //显示可用的编码器
-bsfs               //显示可用的字节流滤镜
-protocols          //显示支持的协议 http rtmp ftp hls等等
-filters           //显示支持的滤镜
-pix_fmts         //显示支持的像素格式 yuv420p yuv422p yuv444p
-layouts            //显示支持的音频声道布局,最常见的就是mono单声道,stereo立体双声道
-sample_fmts        //显示可用的音频采样格式
-colors             //显示支持的color名称 比如Red是#ff0000表示红色,当你需要使用时就只要输入Red,而不用输入#ff0000
-sources device     //显示输入设备的源列表
-sinks device      //显示列表的输出设备
-hwaccels           //显示HW加速方法

以上是帮助命令,如果你忘记了某个编译器、像素格式或者滤镜的名字,你就可以用这些命令去查看。

-loglevel loglevel  //设置日志级别
-v loglevel         //这是-loglevel的缩写
-report             generate a report
-max_alloc bytes    set maximum size of a single allocated block
-y                  //强制覆盖输出文件
-n                  never overwrite output files
-ignore_unknown     Ignore unknown stream types
-filter_threads     number of non-complex filter threads
-filter_complex_threads  number of threads for -filter_complex
-stats              print progress report during encoding
-max_error_rate maximum error rate  ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.
-bits_per_raw_sample number  set the number of bits per raw sample
-vol volume         change audio volume (256=normal)

以上就是全局参数

-f fmt              //文件格式 这个可以根据 ffmpeg -formats查看所支持的所有格式
-c codec         //编解码器 copy表示不进行编解码,直接复制
-codec codec        //同-c
-pre preset        //预设参数 
-map_metadata outfile[,metadata]:infile[,metadata]  set metadata information of outfile from infile
-t duration        //时间
-to time_stop     //截止实践
-fs limit_size      set the limit file size in bytes
-ss time_off        //开始时间
-sseof time_off     set the start time offset relative to EOF
-seek_timestamp     enable/disable seeking by timestamp with -ss
-timestamp time     set the recording timestamp ('now' to set the current time)
-metadata string=string  add metadata
-program title=string:st=number...  add program with specified streams
-target type        specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apad               audio pad
-frames number      set the number of frames to output
-filter filter_graph  //滤镜
-filter_script filename  //从文件中读取滤镜的描述filtergraph
-reinit_filter      reinit filtergraph on input parameter changes
-discard            discard
-disposition        disposition

以上是音视频的公共参数

-vframes number     // set the number of video frames to output
-r rate             // set frame rate (Hz value, fraction or abbreviation)
-s size             // 大小 格式是WxH
-aspect aspect      set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number  set the number of bits per raw sample
-vn                //忽略视频流
-vcodec codec       force video codec ('copy' to copy stream)
-timecode hh:mm:ss[:;.]ff  set initial TimeCode value.
-pass n             select the pass number (1 to 3)
-vf filter_graph    set video filters
-ab bitrate         audio bitrate (please use -b:a)
-b bitrate          video bitrate (please use -b:v)
-dn                 disable data

以上是视频处理相关参数

-aframes number     set the number of audio frames to output
-aq quality         set audio quality (codec-specific)
-ar rate            set audio sampling rate (in Hz)
-ac channels        set number of audio channels
-an                 disable audio
-acodec codec       force audio codec ('copy' to copy stream)
-vol volume         change audio volume (256=normal)
-af filter_graph    set audio filters

以上是音频处理相关

-s size             set frame size (WxH or abbreviation)
-sn                 disable subtitle
-scodec codec       force subtitle codec ('copy' to copy stream)
-stag fourcc/tag    force subtitle tag/fourcc
-fix_sub_duration   fix subtitles duration
-canvas_size size   set canvas size (WxH or abbreviation)
-spre preset        set the subtitle options to the indicated preset

以上字幕处理相关参数

以上就是ffmpeg -help的输出说明了,下面咱们来看看常用的命令。

mp4格式转换为flv
ffmpeg -i input.mp4 output.flv
从视频中提取yuv420格式的视频流
ffmpeg -i input.mp4 -pix_fmt yuv420p output.h264
从视频中提取音频流
ffmpeg -i input.mp4 output.aac
视频转图片
ffmpeg -i input.mp4 -r 10 image%02d.png

-r 10表示1秒视频会生成10张图片

视频中提取yuv原始数据
ffmpeg -i input.mp4 -pix_fmt yuv444p output.yuv
视频中提取pcm原始数据
ffmpeg -i input.mp4 -c:a  pcm_f32le -ar 44100 -ac 2 -f f32le output.pcm
根据yuv与pcm数据生成视频
ffmpeg -pix_fmt yuv420p -s 320x240 -i input.yuv -ar 44100 -ac 2 -f f32le input.pcm -pix_fmt yuv422p output.flv
根据图片生成视频
ffmpeg -i image%03d.png -pix_fmt yuv420p -c:v libx264 output.avi
裁剪视频,从第3秒开始,裁剪5秒
ffmpeg -i input.mp4 -ss 3 -t 5 output.mp4
视频缩放
ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2:h=ih/2"  output.mp4
视频叠加
ffmpeg -i main.mp4 -i overlay.mp4 -filter_complex "overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10" outpu.mp4
录制摄像头
ffmpeg -f avfoundation -r 30  -s 640x480 -i '1'  -pix_fmt yuv420p -f flv output.flv
录制摄像头+录音
ffmpeg -f avfoundation -r 30  -s 640x480 -i '1:0'  -pix_fmt yuv420p -f flv output.flv
录制摄像头+录音+屏幕并推送到rtmp服务器
ffmpeg -thread_queue_size 128 -y -f avfoundation -r 30 -i '1:0' -f avfoundation -r 30 -s 640x480 -i 0 -filter_complex 'overlay=100:100' -pix_fmt yuv420p -f flv rtmp://localhost:1935/app/room

-f avfoundation指定采用avfoundation采集数据使用
-i 1:0表示 指定视频设备索引为1,指定录音设备索引为0。
使用ffmpeg -list_devices 1 -f avfoundation -i ''可以打印出设备列表,如下:

[AVFoundation input device @ 0x7fbcba520040] AVFoundation video devices:
[AVFoundation input device @ 0x7fbcba520040] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fbcba520040] [1] Capture screen 0
[AVFoundation input device @ 0x7fbcba520040] AVFoundation audio devices:
[AVFoundation input device @ 0x7fbcba520040] [0] Built-in Microphone

因此上述命令中的-i 1:0表示采用【Capture screen 0】【Built-in Microphone】即采用屏幕和系统自带的麦克风进行采集。

相关文章

  • 使用SDL播放PCM音频数据

    一、使用 ffplay 命令行程序播放 首先使用 ffmpeg 命令行程序抽出 pcm 数据: 使用 ffplay...

  • nodejs+ffmpeg

    Mac或linux环境下使用ffmpeg工具+ffmpeg库 本地下载ffmpeg命令行程序 安装node ffm...

  • FFmpeg 命令行程序简介

    FFmpeg 提供了三个主要的命令行应用程序,在 bin 目录中: 1、ffmpeg 命令使用简介 ffmpeg ...

  • 在mac os下使用FFmpeg

    1、在mac os下使用ffmpeg比较简单,可以直接使用命令行来操作。首先安装ffmpeg,这里默认系统已经安装...

  • FFMPEG命令行收集

    平时使用FFmpeg的时候可以通过命令行使用各种功能。但是很多命令行,我们容易忘记,通过本文章记录日常常用的命令行...

  • FFmpeg解码MP4文件为YUV文件

    前言 前面我学了编译FFmpeg的Android库,写了一个命令行使用FFmpeg的Android Demo,C文...

  • FFMpeg与mPaaS小程序模块冲突

    mPaaS项目集成小程序模块,同时集成了FFMpeg的视频压缩功能, ffmpeg使用了fftools命令行操作方...

  • ffmpeg从MP4中提取H264裸流(新旧API对比)

    问题 在分离mpe中的H264码流的时候,如果使用ffmpeg在命令行操作非常简单,ffmpeg -i video...

  • FFmpeg 硬件加速介绍

    目录 参考 硬件加速简介 FFmpeg 硬件加速各环境支持情况 FFmpeg命令行工具使用硬件加速 1. 参考 [...

  • ffmpeg 滤镜及其效果

    相关 ffmpeg代码中使用滤镜命令行使用滤镜 滤镜及其效果 原素材: luma_radius, lrluma_p...

网友评论

    本文标题:FFmpeg命令行使用

    本文链接:https://www.haomeiwen.com/subject/nknckltx.html