美文网首页
FFmpeg初探

FFmpeg初探

作者: MrRuo | 来源:发表于2020-03-01 13:19 被阅读0次

    FFmpeg是一款强大的音视频处理的开源软件,既可以使用FFmpeg提供的Api对音视频进行处理,也可以使用它提供的工具来编辑音视频文件。

    一、音视频处理基本流程

    1、 输入文件,解封装拿到编码数据。

    平时所看到的音视频文件,mp3、flv等,本身是一个容器。在这个容器中,存放着音视频数据。可以把这个容器 当作一个盒子。物品只有打包在盒子中,才能够方面运输。如果要对音视频做处理,只能先打开这个盒子(容器),拿到里面的编码数据。

    2、 编码数据经过解码器解码之后产生未压缩的帧。

    解封装之后的数据,是经过编码的数据,比较常见的视频编码有H264、H265。不同的编码格式,具有不同的压缩率。就像新型的H265编码,可以让视频文件在不损失画质的情况下,大大压缩文件体积。

    通过解码器解码产生未压缩的帧数据,高度还原的原始数据。真正的原始数据是摄像头麦克风的采集数据。这里的数据和原始数据还是有差异的。

    3、通过过滤对帧数据处理,完成音视频的编辑。
    4、将帧数据通过编码器进行编码。
    5、编码数据再封装成播放器可以认识的容器。

    二、Mac系统上安装FFmpeg

    // 下载FFmpeg
    git clone https://git.ffmpeg.org/ffmpeg.git
    
    // 进入ffmpeg目录
    cd ffmpeg
    
    // 执行配置命令
    ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-libfdk-aac  --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-videotoolbox --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=clang --host-cflags= --host-ldflags= 
    
    // 执行安装
    sudo make && sudo make install
    
    // 环境变量配置
    vi ~/.bash_profile 
    
    // .bash_profile最后一行添加
    export PATH=$PATH:/usr/local/ffmpeg/bin
    
    // 环境变量配置文件生效
    source ~/.bash_profile 
    

    如果在配置的时候出现错误,可能是缺少某些重要以来,根据报错提示,依次安装即可。

    安装命令必须添加sudo权限,否则报错该用户没有操作目录的权限。

    如果在/usr/local/ffmpeg/bin文件夹中没有ffplay,表示ffplay没有安装成功,可能是没有安装SDL2库导致的,brew install ffplay之后,重新执行配置、安装命令即可。

    接下来,就可以使用ffmpeg命令编辑音视频文件了。

    三、FFmpeg常用命令

    1. 基本信息查询命令
    // 显示版本
    ffmpeg -version
    
    // 显示可用的格式
    ffmpeg -formats
    
    // 显示可用的解封装
    ffmpeg -demuxers
    
    // 显示可用的封装
    ffmpeg -muxers
    
    // 显示可用的设备
    ffmpeg -devices
    
    // 显示所有的编解码器
    ffmpeg -codecs
    
    // 显示所有的解码器
    ffmpeg -decoders
    
    // 显示所有的编码器
    ffmpeg -encoders
    
    // 显示所有的比特流filter
    ffmpeg -bsfs
    
    // 显示可用的协议
    ffmpeg -protocols
    
    // 显示可用的滤镜
    ffmpeg -filters
    
    // 显示可用的像素格式
    ffmpeg -pix_fmts
    
    // 显示可用的采样格式
    ffmpeg -sample_fmts
    
    // 显示可用的channel
    ffmpeg -layouts
    
    // 显示识别的颜色名称
    ffmpeg -colors
    
    2、音视频处理命令

    音视频的处理命令,都是按照以下基本格式。

    ffmpeg [global options] [input options] -i [input url] [output options] [output url]
    

    全局参数:

    参数 说明
    -y 输出文件已存在,不再询问,覆盖输出文件
    -n 输出文件已存在,不再询问,直接退出程序

    输入/输出通用参数

    参数 说明
    -f format,规定输入输出的文件格式。文件格式通常是从数据文件的数据和输出文件的后缀推断出来,所以大多数情况下不需要这个参数
    -c:[v|a] 等同于-[v|a]codec。选择一个编码器或者解码器,取决于在输入还是输出参数。视频编解码器为-c:v,音频编解码器为-c:a
    -t 时长,单位s。输入参数中,限制文件输入时间。输出参数中,到达时间之后停止输出。如果输入参数中-t参数为3,输出参数中-t为5。输出的文件总时长为3s。
    -ss 起始时间,格式hh:mm:ss。输入参数中,文件输入起始位置。输出参数中,解码但丢弃输入,直到到达指定位置
    -r 帧率,Hz值分数或缩写,视频参数。输入参数中,忽略存储在文件中的任何时间戳,根据速率生成新的时间戳。输出参数中,复制或丢弃输入帧,以实现恒定输出帧频fps
    -s 视频尺寸
    -ar 音频采样率,音频参数
    -ac 音频通道的数量

    输出通用参数

    参数 说明
    -vf 视频过滤器
    -af 音频过滤器
    -aspect 视频宽高比,w:h或者宽高比1.777
    -vn 禁用视频
    -an 禁用音频

    输入通用参数

    参数 说明
    -filter 创建由filgergraph指定的过滤器图,并使用它来过滤流
    -aspect 视频宽高比,w:h或者宽高比1.777。

    录制:

    // 查看都有哪些设备
    ffmpeg -f avfoundation -list_devices true -i ""
    
    // 录屏
    ffmpeg -f avfoundation -i 1 -r 30 output.mp4
    
    // 附带声音录屏
    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 32k output.flv
    
    // 录制视频
    ffmpeg -framerate 30 -f avfoundation -i 0 output.mp4
    
    
    // 附带声音录制视频
    ffmpeg -framerate 30 -f avfoundation -i 0:0 output.mp4
    
    // 录音
    ffmpeg -f avfoundation -i :0 out.wav
    
    • -f 指定使用avfoundation采集数据
    • -i 指定从哪采集数据,从第一个命令中能查看到设备索引。录制音频和视频的时候,冒号前面代表视频索引,后面代表音频索引。
    • -r 指定帧率
    • -crf x264参数,0代表无损压缩。

    分解与复用:

    // 抽取音频流
    ffmpeg -i input.mp4 -c:a copy -vn out.aac
    
    // 抽取视频流
    ffmpeg -i input.mp4 -an -c:v copy out.h264
    
    // 转格式
    ffmpeg -i input.mp4 -c:a copy -c:v copy out.m3u8
    
    // 音视频合并
    ffmpeg -i video.h264 -i sound.aac -c:v copy -c:a copy out.mp4
    

    处理原始数据:

    // 提取YUV数据
    ffmpeg -i input.mp4 -c:v rawvideo -pixel_format yuv420p out.yuv
    
    // YUV转h264
    ffmpeg -f rawvideo -pix_fmt yuv420p -s 1280x720 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264
    
    // 提取PCM数据
    ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
    
    // PCM转WAV
    ffmpeg -f s16le -ar 44100 -ac 2 -c:a pcm_s16le -i out.pcm output.wav
    

    滤镜:

    // 添加水印
    ffmpeg -i input.mp4 -vf "movie=jianshu.png,scale=64*64[watermask];[in][watermask] overlay= 100:20 [out]" out.mp4
    
    // 去水印
    // 先通过ffplay找到需要删除的水印位置
    ffplay -i out.mp4 -vf delogo=x=100:y=20:w=64:h=64:show=1
    // 通过delogo删除水印
    ffmpeg -i out.mp4 -vf delogo=x=100:y=20:w=64:h=64 nowater.mp4
    
    // 视频缩小一倍
    ffmpeg -i input.mp4 -vf scale=iw/2:-1 output.mp4
    
    // 视频裁剪
    ffmpeg -i input.mp4 -vf crop=iw/2:ih/2:0:0 -c:v libx264 -c:a copy output.mp4
    
    // 倍速播放
    ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
    
    // 对称视频
    ffmpeg -i input.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" output.mp4
    
    // 画中画
    ffmpeg -i input.mp4 -i input.mp4 -filter_complex "[1:v]scale=w=120:h=80:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart output.mp4
    
    // 录制画中画
    ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[1:v]scale=w=320:h=180:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-100:y=H-h-100[out]" -map "[out]" output.mp4
    
    // 音视频裁剪
    ffmpeg -i input.mp4 -ss 00:00:10 -t 10 output.mp4
    
    // 合并
    // 创建一个包含视频列表的text文件
    // input.txt
    input.mp4
    input.mp4
    
    // 执行裁剪命令
    ffmpeg -f concat -i input.txt -c:v copy -c:a copy output.mp4
    
    // 视频转图片
    ffmpeg -i input.mp4 -r 1 -f image2 image/%3d.jpg
    
    // 视频转gif
    ffmpeg -i input.mp4 -ss 00:00:05 -t 5 output.gif
    
    // 图片转视频
    ffmpeg -f image2 -i images/image-%3d.jpg output.mp4
    

    直播相关:

    // 推流
    ffmpeg -re -i input.mp4 -c copy -f flv rtmp://xxx
    
    // 拉流保存
    ffmpeg -i rtmp://xxx -c copy output.mp4
    
    // 转流
    ffmpeg -i rtmp://xxx -c copy -f flv rtmp://yyy
    
    // 实时推送
    ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280*720 -c:v libx264 -f flv rtmp://xxx
    
    

    相关文章

      网友评论

          本文标题:FFmpeg初探

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