美文网首页
FFmpeg学习笔记(一)

FFmpeg学习笔记(一)

作者: Hunter琼 | 来源:发表于2021-02-03 16:46 被阅读0次

    前段时间做了个关于视频播放器的需求,播放器的要求比较简答,实现一些基本的播放器功能,任务急,任务重!选择了很多项目,比如ijk,金山云等,这些项目都是基于ffmpeg,早些年就听说这个音视频领域的扛把子;通过这次需求,学习了一下ffmpeg的一些基本应用和基本文件操作;目的是通过ffmpeg进行基础二次开发,抛弃一些视频处理App,通过命令行可以对音视频进行简单的操作,比如视频,采集,裁剪,格式转换等.

    音视频的录制:

    1 在录制之前先查询下支持哪些设备

    ffmpeg -f avfoundation -list_devices true -i ""
    在mac下通过``AVFoundation```采集,支持的设备有:

    image.png

    2 录屏/录音

    ffmpeg -f avfoundation -i 1 -r 30 out.yuv
    ffmpeg -f avfoundation -i :0 out.wav
    ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm
    1: Captrue screen 电脑屏幕
    0: 麦克风
    -r:指定帧率
    yuv:视频原始格式
    pcm:音频原始格式

    Duration: N/A, start: 20204.190667, bitrate: N/A
       Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1440x900, 1000k tbr, 1000k tbn, 1000k tbc
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))
    Press [q] to stop, [?] for help
    Output #0, rawvideo, to 'out.yuv':
     Metadata:
       encoder         : Lavf58.45.100
       Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1440x900, q=2-31, 622080 kb/s, 30 fps, 30 tbn, 30 tbc
       Metadata:
         encoder         : Lavc58.91.100 rawvideo
    

    3 录视频

    录制摄像头视频

     ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i 0: -r 30 out.yuv
    

    video_size:1280x720 640x480 320x240
    framerate:限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。

    4 抽取视频音频流

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

    5 抽取视频视频流

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

    6 封装格式转换

    比如 mp4格式转换成flv格式
    ffmpeg -i water.mp4 -vcodec copy -acodec copy out.flv

    7 视频合并

    将音频流文件和视频流文件合并

    cj-yh-mac-n:video mac$ ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.flv

    8 提取原始数据

    8.1 提取YUV(节省带宽,压缩比好)

    ffmpeg -i out.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv

    图片来源于西瓜视频截图,若侵权,请联系删除
    YUV采样有如下三方式:
    YUV 4:4:4采样,每一个Y对应一组UV分量,不常用,耗内存严重,耗带宽,和RGB差不多,压缩比不够
    YUV 4:2:2采样,每两个Y共用一组UV分量,采样一个像素点都会采样其Y分量,而UV是左右间隔采样

    YUV 4:2:0采样(历史遗留实质是4:1:1),每四个Y共用一组UV分量。每个像素都会采样Y分量,而U,V分量会间隔采样, 这种方式目前主流方式.如下图:

    图片来源于西瓜视频截图,若侵权,请联系删除.png

    YO Y1 Y5 Y6 U0 V5
    Y2 Y3 Y7 Y8 U7 V2

    rawvideo:指定将视频转成原始数据

    8.2 提取pcm

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

    -ac:2 双声道
    -ar 44100 音频采样率 48k 32k 16k 44.1k
    S16e:数据存储方式:有符号的16位数字表示

    9 滤镜

    9.1 添加水印

    ffmeg -i water.mp4 -vf "movie=logo.gif,scale=100:50[watermask];[in][watermask] overlay=40:50 [out]" out.mp4

    movie 指定logo位置。scale 指定 logo h w大小。Overlay x和y 指定 logo 摆放的位置。
    上面命令 水印图为gif格式时无法循环播放;实现循环播放,如何做呢???

    9.2 删除水印

    ffplay -i water.mp4 -vf delogo=x=30:y=10:w=64:h=48:show=1

    Logo area is outside of the frame 需要先找到水印的具体位置,才可以删除,生成新的视频。

    ffmpeg -i water.mp4 -vf delogo=x=806:y=20:w=70:h=80 output.mp4

    9.3 视频压缩一半

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

    -1代表高度随宽度改变。

    9.4 视频剪切

    从中心点剪切

    ffmpeg -i out.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 320x180 scale.mp4

    in_w-200/in_h-200: 宽度/高度减去200
    -c:v 视频编码器。

    从某个位置剪切

    ffmpeg -i out.mp4 -vf crop=100:100:20:20 -c:v libx264 -c:a copy -video_size 320x180 scale.mp4

    out_w: 输出的宽度 100。
    out_h: 输出的高度 100。
    x:20
    y:20

    9.5 倍速播放

    ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" scale.mp4

    2倍播放 丢帧一半。

    10 视频的裁剪

    ffmpeg -i out.mp4 -ss 00:00:01 -t 15 scale.mp4
    从视频的1秒开始,裁剪15s。

    11 视频hls切片

    ffmpeg -i water.mp4 -c:v libx264 -strict -2 -f hls out.m3u8

    如果指定aac编码器
    ffmpeg -i water.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8

    运行结果:Unknown encoder 'libfdk_aac'
    需要重新下载ffmpeg并 添加一些库 麻烦啊!!! 参考 https://www.jianshu.com/p/d1ed7b860f1b

    12 把裁剪的片段合并成一个视频

    首先创建一个test.txt文件,文件内容格式:file '片段视频文件'

    image.png

    然后执行命令:ffmpeg -f concat -i test.txt -c copy water.mp4

    13 视频转化成图片

    13.1 转化成一张普通的图片

    ffmpeg -i ModernTalking.mp4 -r 1 -f image2 MT-%3d.png

    -r:帧率 1秒一张图

    13.2 转化成gif

    fmpeg -i ModernTalking.mp4 -ss 00:00:00 -t 10 MT_GIF.gif

    -t:n 截取时长为ns的片段进行转化成gif n越大 gif大小越大 效果越好,下面是n=4截取的gif效果,视频资源来源于西瓜视频。


    MT_GIF.gif

    14 将一组图片合转成视频

    ffmpeg -f image2 -i MT-%3d.png newshiping.mp4

    命令行背下来 ...


    23763e82c7ecfce25b3217999399e775.jpeg

    未完待续!!!

    相关文章

      网友评论

          本文标题:FFmpeg学习笔记(一)

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