ffmpeg 基础知识笔记

1、ffmpeg windows环境安装

  • 1.1 官网下载ffmpef:

    • widows平台就下载对应的版本,下载下来的ffmpeg是一个软件压缩包,解压+文件夹重命名为ffmpeg
    • github链接:https://github.com/BtbN/FFmpeg-Builds/releases]
    • 在提供的 github web上下载对应版本压缩包即可:
  • 1.2 配置环境变量:

    • 进入文件夹ffmpeg,进入bin文件夹,复制文件夹路径
    • 打开windows系统的环境变量,环境变量–>系统变量–>Path–>编辑–>新建–>粘贴–>确定,自动保存
  • 测试ffmpeg是否可用:

    • win+R调出cmd终端
    • 输入ffmpeg -version
      • 正确安装之后的的ffmpeg会显示对应的版本号信息,如果没有显示,检查自己环境变量是否添加成功
  • 文件夹解释说明:

    • bin文件夹存放可执行文件:
      • 1、ffmpeg.exe用于操作+转换+传输多媒体内容
      • 2、ffplayer.exe简介播放器
      • 3、ffprobe.exe媒体参数分析工具
    • doc:存放ff相关的所有文档
  • 工具测试

    • 1、播放视频文件:
      • cmd终端输入:ffplayer video_name.mp4
    • 2、播放音频文件:
      • cmd终端输入:ffplayer audio_name.mp3
    • 3、解析视频、音频文件:
      • cmd终端输入:ffprobe file_name,ffprobe能显示一般软件不能显示的文件全部信息

2、ffmpeg的使用

  • 2.1 文件格式转化:

    • cmd中输入:
    ffmpeg -i input_video_name.mov out_put_video.mp4
    
    • 解释说明:
      • 作用:将mov格式的视频转化为mp4格式
      • -i是input的缩写,后面紧跟着输入文件名
      • 输出文件名放在最后
  • 2.2 媒体的编码方式:

    • 查询ffmpeg支持的编码方式指令:ffmpeg -codecs
    • 主流的视频网站采用(1080P):
      • mp4封装 = H264视频编码 + AAC音频编码(用的最多)
      • WebM封装 = VP8视频编码 + Vorbis音频编码 谷歌、youtube的方案
      • OGG封装 = Theora视频编码 + Vorbis音频编码(完全开源)
    • 音频编码:将in.flac转化为out.mp3
      • cmd终端输入:
      ffmpeg -i in.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
      
        - 说明:	
        - a = audio
        - -acodec:codec编码,也就是对音频进行编码
        -  libmp3lame 使用mp3的编码方式
        - -ar:控制用音频采样率,如果不输入这个,默认使用原音频的采样率,常用的是48kHZ和44.1kHZ
        - -ab 320k:b指定音频的比特率,ffmpeg默认使用的是128k
        - -ac 2:c就是channel,1标志单声道,2使用双声道,默认使用原音频声道数
      
  • 2.3 4k分辨率转1080分辨率

    • cmd输入:
      ffmpeg -i in.webm -s 1920x1080 -pix_fmt yuv420p -vcode libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k out.mp4
      
      • 参数解释说明:
        • -s 用于缩放视频尺寸,后面的参数就是新视频的宽高
        • -pix_fmt = pixel format缩写,用于设置颜色空间的,根据上传网站的要求做出对应选择,常用的颜色空间是yuv420p
          • 常见的有:YUV、NV、RGB…,具体的参数使用命令
          ffmpeg -pix_fmts 查询
          
        • vcodec 用于设置视频流的编码器指令,libx264是h264的软件编码器,ffmpeg还支持硬件编码、多线程、GPU加速等,一般使用libx264,通用稳定。
        • -perset 编码器的预设,调节编码器的预设能够调节编码器的算法精度,精度越高,编码速度越慢,cpu占用率越多,常见的参数有10个:
          • ultrafast superfast veryfast faster fast medium(默认) slow slower veryslow placebo,一般情况下录制视频采用的是veryfast,编码器不会占用太多的资源,缺点是生成的文件体积相对会大一些,这是用存储空间换电脑性能,在压制视频的时候使用的是veryslow,牺牲一点时间获取会参数的精准控制。
        • -profile:v 用来指定编码器的配置,这个配置主要和编码器的压缩比有关,实时通信领域一般采用baseline,流媒体采用的是main,如果制作的是超清视频,就是用high,这是之前大多数视频网站采用的最高配置。
        • -level:v 对编码器配置的具体规范和限制,压缩比和画质,需要针对不同的使用场景在2者之间做出选择,一般情况下1080p的视频就使用4.1
        • -crf:码率控制模式=Constant Rate Factor,恒定速率因子模式,这种码率控制模式要求每一帧的画面都按照要求的视频质量去获取他所需要的比特数,画质均衡但是无法精准的控制码率,无法控制最终生成的文件的大小,适用于对画质有要求,文件大小无关紧要的场景,数字参数范围0-53,这里选用23默认值,数字越小质量越高,0是无损画质,但是一般在18~28之间做选择。
        • -r 30 用来设置视频帧率的
        • -acodec acc这里使用的是acc编码器
        • -b:a 等价于 前面的 -ab,用来控制音频比特率的,常见的视频网站使用的都是128k 192k比特率
  • 2.4 知识点补充——编码方式

    • 画质越好要求的码率越高,文件体积越大,所谓的码率控制就是为每一帧画面分配多少比特数,权衡文件体积与画面质量,ffmpeg一共支持3种码率控制模式,分别是-qp -crf -b
    • -qp Constant Quantizer 恒定量化器模式,利用算法将画质转化为数字,每一帧画面的质量都能通过这个量化参数判断,量化参数是可以手动设置的,一般使用默认,在pq模式下画面被分为0-51
    • 无损压缩的例子(快速编码)
      ffmpeg -i -input.mp4 -vcodec libx264 -preset utrlfast -qp 0 out_put.mkv
      
    • 无损压缩的例子(高压缩比)
      ffmpeg -i input.mp4 -vcodec libx264 -preser veryslow -qp 0 out_put.mkv
      
    • -b bitrate 固定目标码率的模式,指定码率,适用于对码率和体积有限制的情景,有限条件下达到最高画质,使用这种码率控制模式,一般情况下不使用这种码率控制模式,使用-crf,除非是制作一些极小的视频或者文件体积有很严格的控制
    • 以上的3中模式默认使用的是 单边编码 ,在使用crf的时候最好搭配 veryslow预设,这样一来参数控制更精准一些。
    • 默认使用VBR 动态比特率
      ffmpeg -i input -vcodec libx264 -preset veryslow output
      
    • 现在的网络都是使用ABR 平均比特率的方式,如果用户的网络不好,VBR的码率变化太大,很容易造成视频的花屏或者黑屏
      ffmpeg -i input -vcodec libx264 -preset veryslow -b:v 3000k optput
      
    • CBR 恒定比特率,就是在ABR的基础上附加指令,是的码率尽可能的固定在一个数值上,这种方式没有人用
      ...-b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k...
      

3、实践操作:

  • 3.1 从视频中去除音频

    ffmpeg -i in.mp4 -vcodec copy -an v.mp4
    
    • 参数说明:
      • -vcodec copy 保持视频video原编码格式
      • -an 用来静音的,实际上就是将音频剔除
      • 文件的保存格式需要和输入格式一致
    • 3.2 从视频中去除视频画面

      ffmpeg -i in.mp4 -vn -acodec copy a.m4a
      
      • 参数说明
        • -vn 剔除视频的指令
        • -acodec copy 音频按照源文件保存
  • 3.3 如果某视频具有多个音频流,就需要有针对性的提取

    • 先使用ffprob查询视频信息,找到视频有多少个音频流,
    • 常见的是以:
      • Stream #0:2[0X81]:Audio:ac3,48000Hz, 5.1, s16, 384 kb/s
      • Stream #0:3[0X81]:Audio:ac3,48000Hz, 5.1, s16, 384 kb/s
      • Stream #0:4[0X81]:Audio:ac3,48000Hz, 5.1, s16, 384 kb/s
    • 如果需要提取这个Stream #0:3[0X81]:Audio:ac3,48000Hz, 5.1, s16, 384 kb/s音频流
      需要多加上一个指令:-map 0:3  # 指定提取
      
  • 3.3 多个语音+单个视频合并

    ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4  # -c copy 用来维持编码器的,音频与视频是同一个视频合并起来的,不用特意改动,直接复制就好,如果两者不是一样的,需要先查询视频指令,将语音编码器替换成相同的编码器,最后合并
    
  • 3.4 语音截取片段

    ffmpeg -i in.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3
    
    • 参数说明:
      • -ss 开始时间,对应的格式为 时:分:秒
      • -to 截止时间
    ffmpeg -i in.mp3 -ss 00:01:00 -t 10 -acodec copy out.mp3  # 将-to修改为-t,后面指定的就是截取10s,t后的数字就是截取的时长
    
    • 逆向截取:-sseof ,以媒体末尾为起点,结合 -t 指令,可以截取媒体末尾的时间数
  • 3.5 视频截取片段

    ffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -c copy out.mp4
    ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -c copy out.mp4  # 启用关键帧技术,加速操作,但是窃取的视频在播放器中的时间不一点准确
    ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -c copy -copyts out.mp4  # 解决上面问题,-copyts用来保留时间戳,显示的时间就对了
    
  • 3.6 将三个参数一样的视频连接起来

    ffmpeg -i "concat:01.mp4|01.mp4|03.mp4" -c copy out.mp4
    
    • 视频参数不一致也是可以连接的,但是操作起来非常麻烦,推荐使用Avidemux开源软件,剪切合并视频
  • 3.7 视频截图

    # -ss 5:截取第5s的视频画面
    # -vframes 1:当前这1s的第12帧画面
    ffmpeg -i in.mp4 -ss 5 -vframes 12 img.jpg  
    
  • 3.8 视频加水印

    # "overlay=20:20" 图片左上角原点,xy顺序
    # -filter_complex 使用过滤器增加logo
    ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20" out.mp4  
    
  • 3.9 将视频的中间片段截取为gif动图

    # -ss 7.5 -to 8.5 -s 640x320 -r 15
    # 开始时间-结束时间 resize640x320 帧率15
    ffmpeg -i in.mp4 -ss 7.5 -to 8.5 -s 640x320 -r 15 out.gif
    
  • 3.10 屏幕录制

    #  -f 用来格式化的
    # -f gdigrab 强制使用gdigrab的标准,gdigrab是ffmpeg的组件,用来捕获视频设备,不同的操作系统,捕获工具不一样,widows中ffmpef默认使用使用的就是gdigrab,他只能捕获视频不能捕获音频,配音之类的是能后期来做
    # 推荐使用软件:Screen Capture Recorder 和 OBS Studio(开源)
    ffmpeg -f gdigrab -i desktop rec.mp4
    
  • 3.11 录制好的视频推流

    	# -re 按照视频帧率进行推流
    	ffmpeg -re -i rec.mp4 按照网站要求编码 -f flv "你的rtmp地址/你的直播码"
    

你可能感兴趣的:(ffmpeg,ffmpeg)