美文网首页
ffmpeg入门(一)

ffmpeg入门(一)

作者: 匠人plus | 来源:发表于2023-01-19 19:37 被阅读0次

    介绍

    FFmpeg是一套可以用来记录、转换数字音频、视频
    ,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
    项目地址:https://github.com/FFmpeg/FFmpeg
    本文以windows平台为例,介绍ffmpeg的用法

    基础知识

    封装格式

    MPEG-4、AVI、FLV

    编码格式

    视频部分:h264、wmv、xvid、mjpeg(摄像头出来的每一帧都是mjpeg,缺点在于只有I帧、没有B帧、P帧)
    音频部分:acc、MP3、ape、flac

    视频解码

    软件解码:即通过软件让CPU来对视频进行解码处理,缺点耗电发热,优点兼容强
    硬件解码:是将原来全部交由CPU(显卡上的一个核心处理芯片,处理计算机中与图形计算有关的工作)来处理的视频数据的部分交由GPU来做,优点不需要太好的CPU,发热低,缺点起步较晚,无法与软解相提并论,兼容性不强.硬解码都是固定帧率.比如只能60帧.

    音频解码

    将音频码流(aac、ape等)解码成pcm

    像素格式

    压缩编码中一般使用的是RGB24,YUV420 , YUV420P, YUV422P, YUV444P等格式数据,最常见的是YUV420P.
    RGB格式
    BMP文件存储的就是RGB格式像素数据
    yuv格式
    y表示明亮度,而u(Cb 蓝色色差值)和v(Cr 红色色差值)则表示色度值.它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,由于UV色度不是很明显看出,所以除了YUV4:4:4外,又诞生了YUV4:2:2,YUV4:2:0格式.从而占用极少的存储数据.

    windows安装环境

    官网地址:http://ffmpeg.org/
    下载地址:http://ffmpeg.org/download.html#build-windows
    然后选择Windows builds by BtbN

    image.png
    将压缩包解压,bin目录配置到环境变量
    使用 ffmpeg –version 命令验证是否配置成功。
    image.png

    bin目录下程序介绍:
    ffmpeg:音视频编码器
    ffplay:媒体播放器
    ffprobe:多媒体流分析器

    常用命令

    基本信息
    ffmpeg -h
    高级信息
    ffmpeg -h long
    所有信息
    ffmpeg -h full

    音视频处理流程

    input file->demuxer->decoder->encoder->muxer->output file

    命令分类查询

    -version 显示版本
    -buildconf 显示编译配置
    -formats 显示可用格式(muxers+demuxers)
    -muxers 显示可用复用器
    -demuxers 显示可用解复用器
    -codecs 显示可用编解码器
    -decoders 显示可用解码器
    -encoders 显示可用编码器
    -bsfs 显示可用比特流filter
    -protocols 显示可用的协议
    -filters 显示可用的过滤器
    -protocols 显示可用的协议
    -pix_fmts 显示可用的像素格式
    -sample_fmts 显示可用的音频采样率格式
    -layouts 显示标准声道名称
    -colors 显示可用的颜色名称

    例子: ffmpeg -formats | findstr mp4 image.png 例子:ffmpeg -h muxer=flv image.png

    ffplay

    ffplay xx.mp4

    q,esc退出
    f全屏
    p暂停
    a切换音频流
    v切换视频流
    s逐帧播放

    image.png

    主要命令

    -x width 强制显示宽度
    -y height 强制显示高度
    -video_size size 帧尺寸(W✖H)
    -pixel_format format 设置像素格式
    -fs 以全屏模式启动
    -an 禁用音频
    -vn 禁用视频
    -sn 禁用字幕
    -ss pos 根据设置的秒进行定位拖动,
    -t duration 设置播放音频视频长度

    -bytes 按字节进行拖动
    -nodisp 关闭图形化窗口
    -noborder 无边框窗口
    -volume vol 设置起始音量(0-100)
    -f fmt 强制使用设置格式进行解析,如-f s16le
    -window_title title 设置窗口标题
    -loop number 设置循环次数
    -showmode mode 设置显示模式,0视频,1音频波形,2音频频谱
    -vf filtergraph 设置视频滤镜
    -af filtergraph 设置音频滤镜

    -stats 打印多个回放统计
    -fast 非标准化规范的多媒体兼容优化
    -genpts 生成pts
    -sync type 同步类型设为audio、video、external,默认audio为主时钟
    -ast audio_stream_specifier 指定音频流索引
    -vst video_stream_specifier 指定视频流索引
    -sst video_stream_specifier 指定字幕频流索引
    -autoexit 视频播放完毕后退出

    -autorotate 根据文件元数据自动旋转视频,0或1,默认为1
    -codec:media_special codec_name 强制使用设置的多媒体解码器
    -acodec codec_name 强制使用设置的音频解码器进行音频解码
    -vcodec codec_name 强制使用设置的视频解码器进行视频解码
    -scodec codec_name 强制使用设置的字幕解码器进行字幕解码
    -framedrop 如果视频不同则丢弃视频帧
    -infbuf 不限制缓冲区大小

    本地视频音频的播放

    ffplay "xx.mp4" -x 1000 -y 1000 -codec:v h264
    ffplay -window_title "test_player" -ss 2 -t 10 autoexit test.mp4
    ffplay -vcodec h264 test.mp4

    网络视频音频的播放,该链接来自哔哩哔哩,如果过期,请自己获取

    ffplay https://cn-jssz-cm-02-06.bilivideo.com/live-bvc/218285/live_1075665023_5926656/index.m3u8?expires=1674140102&len=0&oi=0x24098a0c2437a830b47b4d4d647419d8&pt=web&qn=0&trid=1007175e969b9e3e4740b457e14038cf73e9&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=7e4a74782b342b164e04404151aff5f4&sk=c9c6154426932efa80d25af02e87a3bd&flvsk=cb8c67302e63d895abdca1323981a94a&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-jssz-cm-02-06&chash=1&sche=ban&bvchls=1&score=4&pp=rtmp&machinezone=jd&source=onetier&trace=8&site=f2ac0f860650761cb3f98dc190ac148e&order=1

    image.png

    播放yuv数据

    ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv

    播放rgb数据

    ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb

    播放pcm数据

    ffplay -ar 48000 -ac 2 f32le 48000_2_f32le.pem
    -ar set audio sampling rate
    -ac set number of audio channels

    视频旋转

    ffplay -i test.mp4 -vf transpose=1

    视频反转

    ffplay test.mp4 -vf hflip

    视频旋转和反转

    ffplay test.mp4 -vf hflip,transpose=1

    音频变速播放

    ffplay -i test.mp4 -af atempo=2

    视频变速播放

    ffplay -i test.mp4 -vf setpts=PTS/2

    音视频变速播放

    ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2

    参数说明
    -i 设置输入流
    -f 设置输出格式
    -ss 开始时间
    -t 时间长度

    音频参数
    -aframes 设置输出的音频帧数
    -b:a 音频码率
    -ar 设定采样率
    -ac 设定声音的channel数
    -acodec 设置音频解码器
    -an 不处理音频
    -af 音频过滤器

    视频参数
    -vframes 设置要输出的视频帧数
    -b设定视频码率
    -b:v 视频码率
    -r 设定帧速率
    -s 设定画面的宽高
    -vn 不处理视频
    -aspect aspect 设置横纵比,4:3,1.333
    -vcodec 设定视频解码器
    -vf 视频过滤器

    ffmpeg

    提取音视频

    ffmpeg -i test.mp4 -acodec copy -vn test.aac
    ffmpeg -i test.mp4 -acodec copy -an test.h264


    image.png

    提取像素数据

    提取yuv
    ffmpeg -i test.mp4 -t 3 -pixel_format yuv420p test_yuv420p.yuv
    提取rgb
    ffmpeg -i test.mp4 -t 3 -pixel_format rgb24 test_rgb24.rgb
    rgb与yuv转换
    ffmpeg -s 320x240 -pix_fmt yuv420p -i test_yuv420p.yuv -pix_fmt rgb24 test_rgb24_convert.rgb


    image.png

    提取pcm数据

    ffmpeg -i test.mp4 -ar 48000 -ac 2 -f s16le test_48000_2_s16e.pcm
    ffmpeg -i test.mp4 -ar 48000 -ac 2 -sample_fmt s16 test_fmt_s16.wav
    ffmpeg -i test.mp4 -ar 48000 -ac 2 -codec:a pcm_s16le test_fmt_s16le.wav


    image.png

    保持编码格式
    ffmpeg test.mp4 -vcodec copy -acodec copy test_copy.ts
    改变编码格式
    ffmpeg test.mp4 -vcodec libx265 -acodec libmp3lame test_h265_mp3.mkv
    修改帧率
    ffmpeg -i test.mp4 -r 15 test_out_r15.mkv
    修改视频码率
    ffmpeg -i test.mp4 -b:v 400k test_out_bv400k.mkv
    修改视频分辨率
    ffmpeg -i test.mp4 -s 480x320 test_out_480x320.mp4
    修改音频码率
    ffmpeg -i test.mp4 -b:a 192k test_out_ba192.mp4
    修改音频采样率
    ffmpeg -i test.mp4 -ar 44100 test_out_ar44100.mkv

    视频裁剪与合并

    找三个视频分辨截取10秒

    ffmpeg -i demo1.mp4 -ss 00:00:05 -t 10 -codec copy demo1_merge1.mp4
    ffmpeg -i demo2.mp4 -ss 00:00:05 -t 10 -codec copy demo2_merge1.mp4

    ffmpeg -i demo3.mp4 -ss 00:00:05 -t 10 -codec copy demo3_merge1.mp4

    将截取的三个视频转成ts格式

    ffmpeg -i demo1_merge1.mp4 -codec copy -vbsf h264_mp4toannexb demo1_1.ts
    ffmpeg -i demo2_merge1.mp4 -codec copy -vbsf h264_mp4toannexb demo2_1.ts
    ffmpeg -i demo3_merge1.mp4 -codec copy -vbsf h264_mp4toannexb demo3_1.ts

    转成flv格式

    ffmpeg -i demo1_merge1.mp4 -codec copy demo1_1.flv
    ffmpeg -i demo2_merge1.mp4 -codec copy demo2_1.flv
    ffmpeg -i demo3_merge1.mp4 -codec copy demo3_1.flv

    以MP4格式拼接

    ffmpeg -i "concat:demo1_merge1.mp4|demo2_merge1.mp4|demo3_merge1.mp4" -codec copy demo_out_mp4.mp4
    因为mp4格式整体有一层容器,而不像ts这类格式可以直接拼接,所以回报错Found duplicated MOOV Atom. Skipped,使用以下命令可解决问题,创建demomp4list.txt文件,写入如下内容
    file 'demo1_merge1.mp4'
    file 'demo2_merge1.mp4'
    file 'demo3_merge1.mp4'
    ffmpeg -f concat -i demomp4list.txt -codec copy demo_list_out_mp4.mp4

    以ts格式拼接

    ffmpeg -i "concat:demo1_1.ts|demo2_1.ts|demo3_1.ts" -codec copy demo_out_ts.mp4
    ffmpeg -f concat -i demotslist.txt -codec copy demo_list_out_ts.mp4

    以flv格式拼接

    ffmpeg -i "concat:demo1_1.flv|demo2_1.flv|demo3_1.flv" -codec copy demo_out_flv.mp4
    ffmpeg -f concat -i demoflvlist.txt -codec copy demo_list_out_flv.mp4

    注意:视频编码格式需要通知,音频编码格式也需要统一,音频参数(采样率和声道)也需要统一

    图片和视频转换

    截取一张图片

    ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x480 test_pic1.jpg
    -i 输入
    -y 覆盖
    -f 格式

    视频转图片

    ffmpeg -i test.mp4 -t 5 -s 640x480 -r 15 test_frame%03d.jpg
    图片转视频
    ffmpeg -f image2 -i test_frame%03d.jpg -r 25 test_img_video.mp4


    image.png
    视频生成gif

    ffmpeg -i test.mp4 -t 5 -r 25 test_img_gif.gif
    gif转视频
    ffmpeg -f gif -i test_img_gif.gif test_gif.mp4

    录制视频

    需安装软件screen capture recorder

    源码地址:https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases

    image.png
    因github下载较慢,可以选择以下地址:
    http://sourceforge.net/projects/screencapturer/
    查看可用设备列表

    ffmpeg -list_devices true -f dshow -i dummy


    image.png
    录制视频

    ffmpeg -f dshow -i video="screen-capture-recorder" record_video.mp4
    注意:screen capture recorder程序的自带的ffmpeg和之前配置到环境变量的ffmpeg版本不一致,直接录制会出错,建议在Screen Capturer Recorder\configuration_setup_utility\vendor\ffmpeg\bin目录下执行录制命令
    使用摄像头设备录制
    ffmpeg -f dshow -i video="XiaoMi USB 2.0 Webcam" record_video.mp4

    录制声音

    ffmpeg -f dshow -i audio="麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" record_audio.aac
    录制视频和声音

    ffmpeg -f dshow -i video="XiaoMi USB 2.0 Webcam" -f dshow -i audio="麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" -y record_out.mp4

    查看视频录制的可选参数

    ffmpeg -f dshow -list_options true -i video="XiaoMi USB 2.0 Webcam"
    指定参数录制
    ffmpeg -f dshow -i audio="麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" -f dshow -i video="XiaoMi USB 2.0 Webcam" -vcodec h264_qsv -b:v 3M -r 15 -y record_out2.mp4

    直播

    直播拉流
    ffplay https://cn-jssz-cm-02-34.bilivideo.com/live-bvc/614605/live_563132373_9127159/index.m3u8?expires=1674213493&len=0&oi=0x24098a0c2437a830f00481b822e575&pt=web&qn=0&trid=10073e458b2968f443b6a2c1d1080ea389f2&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=a8b5c0c3a704b8a9e05f984582d107a2&sk=112b71c9500ea6163d6789593d561f59&flvsk=20767cae16248d0a0dd594520859aac5&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-jssz-cm-02-34&chash=1&sche=ban&bvchls=1&score=6&pp=rtmp&machinezone=jd&source=onetier&trace=8&site=efbbb1495de5db1444960c216098a600&order=1
    ffmpeg -i "https://cn-jssz-cm-02-34.bilivideo.com/live-bvc/614605/live_563132373_9127159/index.m3u8?expires=1674213493&len=0&oi=0x24098a0c2437a830f00481b822e575&pt=web&qn=0&trid=10073e458b2968f443b6a2c1d1080ea389f2&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=a8b5c0c3a704b8a9e05f984582d107a2&sk=112b71c9500ea6163d6789593d561f59&flvsk=20767cae16248d0a0dd594520859aac5&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-jssz-cm-02-34&chash=1&sche=ban&bvchls=1&score=6&pp=rtmp&machinezone=jd&source=onetier&trace=8&site=efbbb1495de5db1444960c216098a600&order=1" bilibili1.flv
    直播推流
    ffmpeg -re -i out.mp4 -c copy rtmp://server/live/streamName
    本地部署推流服务器请参考:https://www.jianshu.com/p/16741e363a77

    过滤器

    视频裁剪

    ffmpeg -i test_pic1.jpg -vf crop=iw/3:ih:0:0 crop.jpg

    文字水印

    ffplay -i demo1.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerief.ttf:fontcolor=green:text='hello world':x=20:y=20:alpha=0.5:box=1:boxcolor=yellow"


    image.png

    跑马灯等效果请自行查阅文档

    图片水印

    ffplay -i demo1.mp4 -vf "movie="logo.webp[watermark];[in][watermark]overlay=x=10:y=10"
    使用ffmpeg可以生成带水印的新视频

    画中画

    ffplay -i demo2.mp4 -vf "movie=demo1.mp4,scale=320x240[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"


    image.png
    多宫格

    ffmpeg -i demo1.mp4 -i demo2.mp4 -i demo3.mp4
    -filter_complex "nullsrc=size=640x480[base];
    [0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];
    [1:v] setpts=PTS-STARTPTS,scale=320x240[upperright];
    [2:v] setpts=PTS-STARTPTS,scale=640x240[lower];
    [base][upperleft] overlay=shortest=1[tmp1];
    [tmp1][upperright]overlay=shortest=1:x=320[tmp2];
    [tmp2][lower]overlay=shortest=1:y=320;" dem0_grid.mp4
    去掉换行符为这样:
    ffmpeg -i demo1.mp4 -i demo2.mp4 -i demo3.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS,scale=640x240[lower];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lower]overlay=shortest=1:y=320" demo_grid.mp4


    image.png

    相关文章

      网友评论

          本文标题:ffmpeg入门(一)

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