zoukankan      html  css  js  c++  java
  • FFmpeg命令详解

    FFmpeg命令分类

    • 基本信息查询命令
    • 录制命令
    • 分解、复用命令
    • 处理原始数据命令
    • 各种滤镜命令
    • 裁剪与合并命令
    • 图片、视频互转命令
    • 直播相关命令

    FFmpeg处理音视频流程

    • 编码的数据包传送给解码器(除非为数据流选择了流拷贝)
    • 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过滤波进一步处理
    • 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包
    • 最后,这些传递给复用器,将编码的数据包写入输出文件

    FFmpeg可以使用下面的参数进行基本信息查询

    -version		显示版本
    -formats		显示可用的格式(包括设备)
    -demuxers		显示可用的demuxers
    -muxers			显示可用的muxers
    -devices		显示可用的设备
    -codecs			显示libavcodec已知的所有编解码器
    -decoders		显示可用的解码器
    -encoders		显示所有可用的编码器
    -bsfs			显示可用的比特流filter
    -protocols		显示可用的协议
    -filters		显示可用的libavfilter过滤器
    -pix_fmts		显示可用的像素格式
    -sample_fmts            显示可用的采样格式
    -layouts		显示channel名称和标准channel布局
    -colors			显示识别的颜色名称
    

    FFmpeg 的基本命令格式

    ffmpeg [global_options] {[input_file_options] -i input_url} ...
                             {[output_file_options] output_url} ...
    
    • ffmpeg 通过 -i 选项读取输任意数量的输入“文件”
      • 可以是常规文件,管道,网络流,抓取设备等,并写入任意数量的输出“文件”。
      • 原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。
      • 流的数量和/或类型是由容器格式来限制。
      • 选择从哪个输入进入到哪个输出将自动完成或使用 -map 选项。
    • 要引用选项中的输入文件,您必须使用它们的索引(从0开始)。
      • 例如:第一个输入文件是0,第二个输入文件是1,等等。
    • 类似地,文件内的流被它们的索引引用。
      • 例如:2:3是指第三个输入文件中的第四个流。

    主要参数:

    -f fmt(输入/输出)	
        强制输入或输出文件格式。 
        格式通常是自动检测输入文件,并从输出文件的文件扩展名中猜测出来
        所以在大多数情况下这个选项是不需要的。
    -i url(输入)	
        输入文件的网址
    -y(全局参数)
        覆盖输出文件而不询问。
    -n(全局参数)
        不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出。
    -c [:stream_specifier] codec(输入/输出,每个流)
        选择一个编码器(当在输出文件之前使用)或解码器(当在输入文件之前使用时)用于一个或多个流。
        codec 是解码器/编码器的名称或 copy(仅输出)以指示该流不被重新编码。
        如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
    -codec [:stream_specifier]编解码器(输入/输出,每个流)	
        同 -c
    -t duration(输入/输出)
        当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。
        当用作输出选项时(在输出url之前),在持续时间到达持续时间之后停止输出。
    -ss位置(输入/输出)
        当用作输入选项时(在-i之前),在这个输入文件中寻找位置。 
        请注意,在大多数格式中,不可能精确搜索,因此ffmpeg将在位置之前寻找最近的搜索点。 
        当转码和-accurate_seek被启用时(默认),搜索点和位置之间的这个额外的分段将被解码和丢弃。 
        当进行流式复制或使用-noaccurate_seek时,它将被保留。
        当用作输出选项(在输出url之前)时,解码但丢弃输入,直到时间戳到达位置。
    -frames [:stream_specifier] framecount(output,per-stream)
        停止在帧计数帧之后写入流。
    -filter [:stream_specifier] filtergraph(output,per-stream)
        创建由filtergraph指定的过滤器图,并使用它来过滤流。
        filtergraph是应用于流的filtergraph的描述,并且必须具有相同类型的流的单个输入和单个输出。
        在过滤器图形中,输入与标签中的标签相关联,标签中的输出与标签相关联。
        有关filtergraph语法的更多信息,请参阅ffmpeg-filters手册。
    

    视频参数:

    -vframes num(输出)	
        设置要输出的视频帧的数量。
        对于-frames:v,这是一个过时的别名,您应该使用它。
    -r [:stream_specifier] fps(输入/输出,每个流)
        设置帧率(Hz值,分数或缩写)。
        作为输入选项,忽略存储在文件中的任何时间戳,根据速率生成新的时间戳。
        这与用于-framerate选项不同(它在FFmpeg的旧版本中使用的是相同的)。
        如果有疑问,请使用-framerate而不是输入选项-r。
        作为输出选项,复制或丢弃输入帧以实现恒定输出帧频fps。
    -s [:stream_specifier]大小(输入/输出,每个流)
        设置窗口大小。
        作为输入选项,这是video_size专用选项的快捷方式,由某些分帧器识别,其帧尺寸未被存储在文件中。
        作为输出选项,这会将缩放视频过滤器插入到相应过滤器图形的末尾。
        请直接使用比例过滤器将其插入到开头或其他地方。格式是'wxh'(默认 - 与源相同)。
    -aspect [:stream_specifier] 宽高比(输出,每个流)
        设置方面指定的视频显示宽高比。
        aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。
        例如“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。
        如果与-vcodec副本一起使用,则会影响存储在容器级别的宽高比,
        但不会影响存储在编码帧中的宽高比(如果存在)。
    -vn(输出)
        禁用视频录制。
    -vcodec编解码器(输出)
        设置视频编解码器。
        这是-codec:v的别名。
    -vf filtergraph(输出)
        创建由filtergraph指定的过滤器图,并使用它来过滤流。
    

    音频参数:

    -aframes(输出)
        设置要输出的音频帧的数量。
        这是-frames:a的一个过时的别名。
    -ar [:stream_specifier] freq(输入/输出,每个流)
        设置音频采样频率。
        对于输出流,它默认设置为相应输入流的频率。
        对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。
    -ac [:stream_specifier]通道(输入/输出,每个流)
        设置音频通道的数量。
        对于输出流,它默认设置为输入音频通道的数量。
        对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。
    -an(输出)
        禁用录音。
    -acodec编解码器(输入/输出)
        设置音频编解码器。
        这是-codec的别名:a。
    -sample_fmt [:stream_specifier] sample_fmt(输出,每个流)
        设置音频采样格式。
        使用-sample_fmts获取支持的样本格式列表。
        -af filtergraph(输出)	
        创建由filtergraph指定的过滤器图,并使用它来过滤流。
    

    FFmpeg实例

    1、列出ffmpeg支持的所有格式

    ffmpeg -formats
    

    2、剪切一段媒体文件, 可以是音频或者视频文件

    ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
    
    • 表示将文件input.mp4从第50s开始剪切20s的时间,
    • 输出到文件output.mp4中,
    • 其中 -ss指定偏移时间( time Offset) ,
    • -t指定的时长( duration)

    3、如果在手机中录制了一个时间比较长的视频无法分享到微信中,那么可以使用ffmpeg将该视频文件切割为多个文件

    ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4
    

    4、使一个视频中的音频静音, 即只保留视频

    ffmpeg -i input.mp4 -an -vcodec copy output.mp4
    

    5、从MP4文件中抽取视频流导出为裸H264数据

    ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
    
    • 视频数据使用mp4toannexb这个bitstream filter来转换为原始的H264数据,

    6、使用AAC音频数据和H264的视频生成MP4文件

    ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
    

    7、对音频文件的编码格式做转换

    ffmpeg -i input.wav -acodec libfdk_aac output.aac
    

    8、从WAV音频文件中导出PCM裸数据

    ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
    
    • 这样就可以导出用16个bit来表示一个sample的PCM数据了,
    • 并且每个sample的字节排列顺序都是小尾端表示的格式,
    • 声道数和采样率使用的都是原始WAV文件的声道数和采样率的PCM数据。

    9、重新编码视频文件, 复制音频流, 同时封装到MP4格式的文件中

    ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
    

    10、将一个MP4格式的视频转换成为gif格式的动图

    ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
    
    • 上述代码按照分辨比例不动宽度改为100( 使用VideoFilter的scaleFilter) ,
    • 帧率改为10(-r),只处理前5秒钟(-t)的视频,生成gif

    11、将一个视频的画面部分生成图片

    • 比如要分析一个视频里面的每一帧都是什么内容的时候, 可能就需要用到这个命令了
    ffmpeg -i output.mp4 -r 0.25 frames_%04d.png
    

    12、使用一组图片可以组成一个gif

    • 如果你连拍了一组照片, 就可以用下面这行命令生成一个gif
    ffmpeg -i frames_%04d.png -r 5 output.gif
    

    13、使用音量效果器,可以改变一个音频媒体文件中的音量

    ffmpeg -i input.wav -af ‘volume=0.5’ output.wav
    
    • 上述命令是将input.wav中的声音减小一半, 输出到output.wav文件中,
    • 可以直接播放来听, 或者放到一些音频编辑软件中直接观看波形幅度的效果

    14、淡入效果器的使用

    ffmpeg -i input.wav -filter_complex afade=t=in:ss=0:d=5 output.wav
    
    • 上述命令可以将input.wav文件中的前5s做一个淡入效果, 输出到output.wav中,
    • 可以将处理之前和处理之后的文件拖到Audacity音频编辑软件中查看波形图

    15、淡出效果器的使用

    ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
    
    • 上述命令可以将input.wav文件从200s开始, 做5s的淡出效果, 并放到output.wav文件中

    16、将两路声音进行合并, 比如要给一段声音加上背景音乐

    ffmpeg -i vocal.wav -i accompany.wav -filter_complex amix=inputs=2:duration=shortest output.wav
    
    • 上述命令是将vocal.wav和accompany.wav两个文件进行mix,
    • 按照时间长度较短的音频文件的时间长度作为最终输出的output.wav的时间长度。

    16、对声音进行变速但不变调效果器的使用

    ffmpeg -i vocal.wav -filter_complex atempo=0.5 output.wav
    
    • 上述命令是将vocal.wav按照0.5倍的速度进行处理生成output.wav,
    • 时间长度将会变为输入的2倍。 但是音高是不变的, 这就是大家常说的变速不变调

    17、为视频增加水印效果

    ffmpeg -i input.mp4 -i changba_icon.png -filter_complex 
        '[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
    
    • 上述命令包含了几个内置参数,
    • main_w代表主视频宽度,
    • overlay_w代表水印宽度,
    • main_h代表主视频高度,
    • overlay_h代表水印高度

    18、视频提亮效果器的使用

    ffmpeg -i input.flv -c:v libx264 -b:v 800k  -c:a libfdk_aac -vf eq=brightness=0.25
            -f mp4 output.mp4
    
    • 提亮参数是brightness,取值范围是从-1.0到1.0,默认值是0

    19、为视频增加对比度效果

    ffmpeg -i input.flv -c:v libx264 -b:v 800k  -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
    
    • 对比度参数是contrast, 取值范围是从-2.0到2.0, 默认值是1.0

    20、视频旋转效果器的使用

    ffmpeg -i input.mp4 -vf "transpose=1" -b:v 600k output.mp4
    

    21、视频裁剪效果器的使用

    ffmpeg -i input.mp4 -an -vf "crop=240:480:120:0" -vcodec libx264 -b:v 600k output.mp4
    

    22、将一张RGBA格式表示的数据转换为JPEG格式的图片

    ffmpeg -f rawvideo -pix_fmt rgba -s 480*480 -i texture.rgb 
        -f image2 -vcodec mjpeg output.jpg
    

    23、将一个YUV格式表示的数据转换为JPEG格式的图片

    ffmpeg -f rawvideo -pix_fmt yuv420p -s 480*480 -i texture.yuv 
        -f image2 -vcodec mjpeg output.jpg
    

    24、将一段视频推送到流媒体服务器上

    ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
    
    • 上述代码中, rtmp: //xxx代表流媒体服务器的地址,
    • 加上-re参数代表将实际媒体文件的播放速度作为推流速度进行推送

    25、将流媒体服务器上的流dump到本地

    ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
    
    • 上述代码中, http://xxx/xxx.flv 代表一个可以访问的视频网络地址,
    • 可按照复制视频流格式和音频流格式的方式, 将文件下载到本地的output.flv媒体文件中

    26、将两个音频文件以两路流的形式封装到一个文件中,

    • 比如在K歌的应用场景中, 原伴唱实时切换的场景下,
    • 可以使用一个文件包含两路流, 一路是伴奏流, 另外一路是原唱流
    ffmpeg -i 131.mp3 -i 134.mp3 -map 0:a -c:a:0 libfdk_aac -b:a:0 96k -map 1:a -c:a:1
            libfdk_aac -b:a:1 64k -vn -f mp4 output.m4a
    
  • 相关阅读:
    代码注释技术
    疑难杂症错误解决方法大全
    MD5 加密
    ADO.NET DataReader和DataAdapter的区别
    HTTP协议详解
    web开发常用样式
    Stream 和 byte[] 之间的转换
    Sql 函数大全 (更新中...由难到简
    Web C# 导出Excel 方法总结
    VC++ MFC 如何实现在编辑框中输出具有换行功能的文段 01
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/12857624.html
Copyright © 2011-2022 走看看