Ffmpeg整体结构

主要源码
ffplay.c
作用:播放
ffprobe.c
作用:码流分析
ffmpeg.c
作用:转码、推流
七大组件
libavutil
作用:工具类
libavformat
作用:打开写入文件
libavcodec
作用:编解码
fdk-aac voaac_enc x264(三方库)
libswscale
作用:图像尺寸变化
libswresample
作用:音频重采样
libavfilter
作用:滤镜、画中画
libpostproc
作用:后期效果处理
Ffmpeg相关地址
源码下载地址
命令地址
官网
源码地址
ffmpeg-x.x.x/fftools
案例地址
ffmpeg-x.x.x/doc/examples
常用命令
| 基本信息查询命令 | 裁剪与合并命令 |
| 录制命令 | 直播命令 |
| 处理原始数据命令 | 各种滤镜命令 |
录制命令
ffmpeg -f gdigrab -framerate 30 -offset_x 0 -offset_y 0 -video_size 1920*1080 -i desktop out.mpg
参数意义

分解复用命令
将完整的视频文件进行拆分。将拆分的信息作为素材,合成所需要的新视频。
第一步:抽取音频流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
// -i(输入路径) acodec(指定音频编码器) copy(只拷贝,不编码)
//v(代表视频)n(代表no,无视频的意思)
第二步:抽取视频流
ffmpeg -i input.mp4 -vcodec copy -an out.h264
//a(代表音频) vcodec(指定视频编码器)
第三步:合成视频
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out_02.mp4
转码命令
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
处理原始数据命令
获取未经过编码的画面和音频,画面信息一般是yuv,音频信息一般是pcm。
提取yuv数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
//-an(不要音频数据) -c:v rawvideo(指定将视频转成原始数据)
//-pixel_format yuv420p(指定转换格式为yuv420p)
//未经过编码的数据需要用到ffplay播放(ffplay -s 608*368 out.yuv)
提取pcm数据
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
//-ar(指定音频采样率44100即44.1KHz)
//-ac(指定音频声道channel 2为双声道)
//-f(数据存储格式 s:Signed有符号的,16:每一个数值用16位表示,l:little,e:end)
//未经过编码的数据需要用到ffplay播放(ffplay -ar 44100 -ac 2 -f s16le out.pcm)
滤镜命令
原视频 -》 编码数据包 -》 修改的数据帧 -》 编码数据包 -》 原视频
裁剪滤镜
ffmpeg -i input.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a
copy crop.mp4
//-vf(用到视频的滤镜)
//crop(用到crop滤镜)
//in_w-200:in_h-200(裁剪视频之后的宽高)
//-c:v libx264(裁剪后通过h264来编码)
//-c:a copy(音频直接进行copy)
提取pcm数据
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
添加水印
ffmpeg -i test.mp4 -i pic_01.png -i pic_02.png -i pic_03.png -i pic_04.png -filter_complex "overlay=10:60, overlay=x=100:y=60, overlay=x=200:y=60, overlay=x=300:y=60" out_watermark_01.mp4
添加文字
ffmpeg -i out_watermark_01.mp4 -vf "drawtext=fontsize=40:fontfile=lazy.ttf:text='hello world':x=480:y=70:fontcolor=green" out_watermark_02.mp4
查看帮助文档命令
ffmpeg
基本信息
ffmpeg -h
高级信息
ffmpeg -h long
所有信息
ffmpeg -h full
将打印输入文件
ffmpeg -h full > ffmpeg_h_full.log
ffplay
所有信息
ffplay -h
将打印输入文件
ffplay -h full > ffplay_h_full.log
ffprobe
所有信息
ffprobe -h
将打印输入文件
ffprobe -h full > ffprobe_h_full.log
ffmpeg命令父类查询

ffmpeg -encoders | findstr 264
ffmpeg -protocols | more
ffmpeg -protocols | findstr rtmp
ffmpeg -layouts
查看具体父类所支持的参数
ffmpeg -h type=name
比如:
ffmpeg -h muxer=flv
ffmpeg -h filter=atempo(atempo调整音频播放速率)
ffmpeg -h encoder=libx264
ffmpeg音频处理流程
ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 test_1280x720.flv

ffplay播放控制

如:播放视频
ffplay -volume 10 flower.mp4

以宽400高800的大小从第3秒的位置播放视频2秒钟
ffplay -x 400 -y 800 -ss 00:00:03 -t 2 flower.mp4

![]()
按字节定位拖动
ffplay -bytes 2 flower.flv
显示音频频谱
ffplay -showmode 2 flower.mp4

不打印流信息
ffplau -nostats flower.mp4

强制使用h264_qsv解码视频
ffplay -codec:v h264_qsv flower.mp4
强制使用h264_qsv解码视频
ffplay -vcodec h264_qsv flower.mp4
ffplay播放命令


播放yuv数据
ffplay -pixel_format yuv420p -video_size 320x420 -framerate 5 flower_out.yuv
ffplay过滤器

查看旋转参数
ffplay -h filter=transpose
视频旋转
ffplay -i flower.mp4 -vf transpose=1
//transpose范围(0~7)
视频水平翻转
ffplay flower.mp4 -vf hflip
音频变速播放
ffplay -i flower.mp4 -af atempo=2
视频变速播放
ffplay -i flower.mp4 -vf setpts=PTS/1
ffmpeg命令
主要命令

音频参数

查询编码器名称
ffmpeg -encoders | findstr mp3
提取音频数据
ffmpeg -i flower.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out.mp3
//设置192kb/s码率 48k采样率 2通道
//使用libmp3lame解码器来解码200帧数据
视频参数

//查找265可以使用的编码器
ffmpeg -encoders | findstr 265
ffmpeg -i flower.mp4 -vframes 300 -b:v 300k -r 30 -s 480x840 -aspect 10:9 -vcodec libx265 out.h265
ffplay out.h265
提取音视频数据
保留封装格式
ffmpeg -i flower.mp4 -acodec copy -vn audio.mp4
ffmpeg -i flower.mp4 -vcodec copy -an video.mp4
提取视频
保留编码格式:ffmpeg -i flower.mp4 -vcodec copy -an -t 10 video_h264.h264
强制格式:ffmpeg -i flower.mp4 -vcodec libx264 -an video_h264.h264
提取音频
保留编码格式:ffmpeg -i flower.mp4 -acodec copy -vn audio_aac.aac
强制格式:ffmpeg -i flower.mp4 -acodec libmp3lame -vn audio_aac.aac
提取像素格式
提取YUV
//提取3秒数据,分辨率和原视频一致
ffmpeg -i flower.mp4 -t 3 -pix_fmt yuv420p yuv420p_orip.yuv
//提取3秒数据,分辨率转为320x460
ffmpeg -i flower.mp4 -t 3 -pix_fmt yuv420p -s 320x460 yuv420p_320x460.yuv
提取RGB
//提取3秒数据,分辨率转为320x460
ffmpeg -i flower.mp4 -t 3 -pix_fmt rgb24 -s 320x460 rgb24_320x460.rgb
RGB和YUV之间的转换
ffmpeg -s 320x460 -pix_fmt yuv420p -i yuv420p_320x460.yuv -pix_fmt rgb24 rgb24_320x460_2.rgb
ffplay命令播放
播放yuv数据
ffplay -pixel_format yuv420p -video_size 320x460 -framerate 5 yuv420p_320x460.yuv
播放RGB数据
ffplay -pixel_format rgb24 -video_size 320x460 -i rgb24_320x460.rgb
ffplay -pixel_format rgb24 -video_size 320x460 -framerate 5 -i rgb24_320x460.rgb
播放PCM数据
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
-ar 音频采样率
-ac 管道数
提取PCM数据
//查找pcm的封装格式
ffmpeg -muxers | findstr PCM
//使用s16le/s32le/f32le提取pcm数据
ffmpeg -i flower.mp4 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i flower.mp4 -ar 48000 -ac 2 -f s32le 48000_2_s32le.pcm
ffmpeg -i flower.mp4 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
//查sample
ffmpeg -sample_fmts
ffmpeg -i flower.mp4 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
//查pcm编码器
ffmpeg -encoders | findstr pcm
ffmpeg -i flower.mp4 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
播放wav
ffplay out2_s16le.wav
ffmpeg命令转封装
//改变编码格式
ffmpeg -i flower.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
//查看
ffprobe out_h265_mp3.mkv
//转码
ffmpeg -i flower.mp4 -r 15 output.mp4
//修改视频码率(这种方法也会对音视频重新编码)
ffmpeg -i flower.mp4 -b 400k output_b.mkv
//修改视频码率
ffmpeg -i flower.mp4 -b:v 400k output_bv.flv
//修改音频码率(这种方法会重新编码video,不想让video重新编码可以加上-video copy)
ffmpeg -i flower.mp4 -b:a 192k output_ba.mp4
//修改音视频码率
ffmpeg -i flower.mp4 -b:v 400k -b:a 192k output_bva.mp4
//修改视频分辨率
ffmpeg -i flower.mp4 -s 240x560 output_240x560.mp4
//修改音频采样率为44.1k
ffmpeg -i flower.mp4 -ar 44100 output_44100hz.mp4
生成测试文件
//截取10秒
ffmpeg -i summer.mp4 -t 10 -codec copy 1.mp4
ffmpeg -i jelly.mp4 -t 10 -codec copy 2.mp4
ffmpeg -i flower.mp4 -t 10 -codec copy 3.mp4
//将mp4转成ts格式
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
//将mp4转成flv格式
ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv
开始拼接文件
//以MP4格式拼接文件
ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4_01.mp4 (failed)
ffmpeg -f concat -i mp4list.txt -codec copy out_mp4_02.mp4
//以TS格式拼接文件
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts_01.mp4
ffmpeg -f concat -i tslist.txt -codec copy out_ts_02.mp4
//以FLV格式拼接文件
ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv_01.mp4 (failed)
ffmpeg -f concat -i flvlist.txt -codec copy out_flv_02.mp4
mp4list.txt
file '1.mp4'
file '2.mp4'
file '3.mp4'
tslist.txt
file '1.ts'
file '2.ts'
file '3.ts'
flvlist.txt
file '1.flv'
file '2.flv'
file '3.flv'
//修改音频编码
ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4
//实际表现为:第二、三段没有声音,画质变黑白
//修改音频采样率
ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4
//实际表现为:第二、三段没有声音,画质变黑白
//修改视频编码格式
ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out3.mp4
//修改视频分辨率
ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 340x780 -vbsf h264_mp4toannexb 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out4.mp4
filter过滤器

//从左往右裁从坐标(0:0)开始剪1/3的画面
ffmpeg -i input.jpg -vf crop=iw/3:ih:0:0 out.jpg
//查看效果图片
ffplay -i input.jpg -vf crop=iw/3:ih:0:0
//裁剪中间部分
ffmpeg -i input.jpg -vf crop=iw/3:ih:iw/3:0 out_02.jpg
图片和视频转换
//截取一张2秒处的图片
ffmpeg -i flower.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 350x780 flower.jpg
ffmpeg -i flower.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 350x780 flower.bmp
//转换视频为图片(每帧一张图片)
//转5s的图片,一秒钟出15张图片
ffmpeg -i flower.mp4 -t 5 -s 350x780 -r 15 frame%03d.jpg
//图片转视频
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
GIF和视频转换
//从视频中生成GIF图片
//1s1帧
ffmpeg -i flower.mp4 -t 5 -r 1 image1.gif
//1s25帧
ffmpeg -i flower.mp4 -t 5 -r 25 -s 350x780 image2.gif
//将GIF转换为视频
ffmpeg -f gif -i image2.gif image2.mp4
生成画中画

//显示画中画效果,播放完了,停止所有的流
ffplay -i flower.mp4 -vf "movie=summer.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
//缩放子画面分辨率
ffplay -i flower.mp4 -vf "movie=summer.mp4,scale=370x780[sub];[in][sub]overlay=x=20:y=20[out]"
//跑马灯效果
ffplay -i flower.mp4 -vf "movie=summer.mp4[sub];[in][sub]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"
推流命令
ffmpeg -re -i flower.mp4 -vcodec copy -acodec copy -f flv -y rtmp://sendtc3.douyu.com/live/11419066rFFw6LRq?wsSecret=304b320a04cc2ece709902471aa90e22&wsTime=63ddef1d&wsSeek=off&wm=0&tw=0&roirecognition=0&record=flv&origin=tct&txHost=sendtc3.douyu.com
推流:ffmpeg -re -i /mnt/hgfs/linux/vod/35.mp4 -c copy -f flv rtmp://192.168.100.41/live/35
拉流命令
ffplay https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm
ffplay rtmp://192.168.100.41/live/35
2536

被折叠的 条评论
为什么被折叠?



