FFmpeg
在线视频地址,MP4
https://v-cdn.zjol.com.cn/280443.mp4
https://v-cdn.zjol.com.cn/276982.mp4
https://v-cdn.zjol.com.cn/276984.mp4
https://v-cdn.zjol.com.cn/276985.mp4
# FFmpeg常用命令
- 基本信息查询命令
- 录制命令
- 分解/复用命令
- 处理原始数据命令
- 剪裁和合并命令
- 图片/视频互转命令
- 直播相关命令
- 各种滤镜
# 基本信息查询命令
命令 | 解释 |
---|---|
-version | 显示版本 |
-demuxers | 显示可用的demuxers |
-muxers | 显示可用的muxers |
-devices | 显示可用的设备 |
-codecs | 显示所有编解码器 |
-decoders | 显示可用的解码器 |
-encoders | 显示所有的编码器 |
-bsfs | 显示比特流filter |
-formats | 显示可用的格式 |
-protocols | 显示可用的协议 |
-filters | 显示可用的过滤器 |
-pix_fmts | 显示可用的像素格式 |
-sample_fmts | 显示可用的采样格式 |
-layouts | 显示channel名称 |
-colors | 显示识别的颜色名称 |
# 录制命令
ffmpeg -f avfoundation -list_devices true -i ""
录屏
ffmpeg -f avfoundation -i 1 -r 30 out.yuv录音
ffmpeg -f avfoundation -i :0 out.wav
# 分解/复用命令
- 多媒体格式转换
ffmpeg -i j20.mov -vcodec copy -acodec copy out.mp4
ffmpeg -i j20.mov -an -vcodec copy out.h264
ffmpeg -i j20.mov -an -acodec copy -vn out.aac
# 处理原始数据命令
- ffmpeg提取YUV数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
ffplay -s 1024x1080 out.yuv
- ffmpeg提取PCM数据
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
ffpaly -ar 44100 -ac 2 -f s16le out.pcm
# 剪裁和合并命令
裁剪
ffmpeg -i in.mp4 -ss 00:00:00 -t 10 out.ts合并
ffmpeg -f concat -i input.txt in.mp4
# 图片/视频互转命令
- 视频转图片
ffmpeg -i in.mp4 -r 1 -f image2 ./img/image-%3d.jpeg
-r 每秒钟几张
-f 格式
- 图片转视频
ffmpeg -i ./img/image-%3d.jpeg ./img/out.mp4
# 直播相关命令
- 推流
ffmpeg -re -i in.mp4 -c copy -f flv rtmp://server/live/streamName
re:
- 拉流
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
-c
# 各种滤镜
ffmpeg -i in.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
in_w:输入视频的width
in_h:输入视频的height
crop格式:crop=out_w:out_h❌y
# 常见
命令 | 解释 |
---|---|
-bitexact | 使用标准比特率 |
-vcodec xvid | 使用xvid压缩 |
-s 320x240 | 指定分辨率 |
-r 29.97 | 桢速率 |
-bitexact | 使用标准比特率 |
-bitexact | 使用标准比特率 |
-bitexact | 使用标准比特率 |
-bitexact | 使用标准比特率 |
-bitexact | 使用标准比特率 |
-b <比特率> 指定压缩比特率,似乎ffmpeg是自动VBR的,指定了就大概是平均比特率,比如768,1500这样的
就是原来默认项目中有的
-qscale <数值> 以<数值>质量为基础的VBR,取值0.01-255,约小质量越好
-qmin <数值> 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
-sameq 使用和源同样的质量
声音部分
-acodec aac 设定声音编码
-ac <数值> 设定声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质
的DVDrip就可以用2
-ar <采样率> 设定声音采样率,PSP只认24000
-ab <比特率> 设定声音比特率,前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换
君默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上
-vol <百分比> 设定音量,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍
这样,要得到一个高画质音质低容量的MP4的话,首先画面最好不要用固定比特率,而用VBR参数让程序自己去
判断,而音质参数可以在原来的基础上提升一点,听起来要舒服很多,也不会太大(看情况调整
# FFmpeg基本开发
- FFmpeg代码结构
代码库 | 解释 |
---|---|
libavcodec | 提供了一系列编码器的实现 |
libavformat | 实现了流协议,容器格式及其基本IO访问 |
libavutil | 包括hash器,解码器和各种工具函数 |
libavfilter | 提供各种音视频过滤器 |
libavdevice | 提供访问捕获设备和回放设备的接口 |
libavswresample | 实现了混音和重采样 |
libswscale | 实现了色彩转换和缩放功能 |
- FFmpeg 日志系统
include <libavutil/log.h>
av_log_set_level(AV_LOG_DEBUG)
av_log(NULL,AV_LOG_INFO,"...%s\n",op)
//日志级别
AV_LOG_ERROR
AV_LOG_WARNING
AV_LOG_INFO
2
3
4
5
6
7
8
- 文件删除与重命名
pkg-config --libs libavformat
avpriv_io_delete(); //删除
avpriv_io_move(); //重命名
- 操作目录重要结构体
avio_open_dir();
avio_read_dir();
avio_close_dir();
AVIODirContext:操作目录的上下文
AVIOEntry: 目录项,用于存放文件名字、文件大小等信息
avio_free_directory_entry();
多媒体文件的基本概念
- 多媒体文件其实是个容器
- 在容器里有很多流(Stream/Track)
- 每种流是由不同编码器编码的
- 从流里读出的数据称为包
- 在一个包中包含一个或者多个帧
重要的结构体
- AVFormatContext
- AVStream
- AVPacket
FFmpeg操作流数据的基本步骤
解复用-->获取流--〉读数据包-->释放资源打印音视频信息
- av_register_all()
- avformat_open_input()/avformat_close_input()
- av_dump_format()
抽取音频数据
- av_init_packet()
- av_find_best_stream()
- av_read_frame()
- av_packet_unref()