[TOC]
FFMPEG常用命令
要掌握一些规律
基本信息查询命令
录制命令
分解/复用命令
处理原始数据命令
裁剪与合并命令
图片/视频转换命令
直播相关的命令
各种滤镜命令 可以加logo滤镜,删除滤镜
ffmpeg处理流程,
输入文件 - demuxer - 编码数据包 - decoder - 解码后数据帧-encoder-编码数据包-muxer-输出文件
纲举目张
muxer, demuxer封装,解封装。
bsfs处理bit流
pix_fmts rgb
帧内编码,帧间编码, 有损压缩,无损压缩
formats
录制命令
ffmpeg录制屏幕:
ffmpeg -f avfoundation -i 1-r 30 out.yuv
-f : avfoundation采集数据
-i: 指定从哪里采集数据,它是一个文件索引号 1是屏幕,0是摄像头-r:指定帧率
ffplay out.yuv 来输出
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
通过-f确定用什么来采集数据 可以通过查看ffmpeg -devices可以确定
1
2
3 D avfoundation AVFoundation input device
D lavfi Libavfilter virtual input device
E sdl,sdl2 SDL2 output device-i 确定在哪里采集数据 1是屏幕 ,0是摄像头
-r 指定帧率
out.yuv是输出的文件名ffplay -s 3360x2100 -pix_fmt uyvy422 out.yuv
通过ffplay来进行播放
-s 分辨率 activate frame-step mode
-pix_fmt 显示像素格式
ffmpeg -f avfoundation -list_devices true -i “” 设备索引号通过这个命令查看
查看当前选择的设备支持的类型,是语音呢还是什么
ffmpeg -f avfoundation -i :0 out.wav
:0表示是音频设备
在 : 前的是屏幕设备
ffmpeg -f avfoundation -i 1:0 out.yuv 音频和视频同时录制
分解与复用 : 文件格式转换
输入文件 - 分解 - 编码数据包 - 复用 - 输出文件
ffmpeg - i out.mp4 -vcodec copy -acodec copy out.flv
-i :输入文件
-vcodec :视频编码处理方式
-acodec:音频编码处理方式
ffmpeg -i zhou_v.mp4 -an -vcodec copy out.h264 //直接抽取视频
ffmpeg -i zhou_v.mp4 -acodec -vn out.aac //抽取音频
处理原理数据命令
原始数据:ffmpeg 解码的数据
视频 :yuv 数据
音频:pcm 数据
提取 yuv数据
//原始视频编码 指定像素格式 4:2:0 (常用) 4:4:4 4:2:2
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv // 视频的原始数据
提取pcm 48k 38k 16k 单声道还是多声道 -f抽取音频pcm的数据存储格式 s16le 符号的 16位表示
Ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm // 音频的原始数据
ar 采样率
Ffplay -ar 44100 -ac 2 -f s16le out.pcm
原始数据,就可以操作一些反转,等一些视频处理
Ink 长刀 瘦金体
滤镜命令:视频倍速,等等 所有滤镜处理,都是对解码后的数据帧做处理
视频滤镜命令 -vf 滤镜类型是 原来的宽度-200,原来的高度 -200 crop = in_w-200:in_h-200
Ffmpeg -i in.mov -vf crop = in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
crop格式 : crop = out_w:out_h:x:y
加水印
ffmpeg -i zhou_v.mp4 -vf “drawtext=fontfile=simhei.ttf: text=’技术’:x=10:y=10:fontsize=24:fontcolor=white:shadowy=2” output.mp4
ffmpeg -i input.mp4 -i logo.png -filter_complex ‘overlay=main_w-overlay_w-10:main_h-overlay_h-10’ output.mp4
裁剪和合并命令
//从上面时间点开始裁剪 -t 是裁剪多次时间 以秒为单位
ffmpeg -i in.mp4 -ss 00:00:00 -t 10 out.ts
ffmpeg -f contact -i inputs.txt out.flv
直播流
推流
re和帧率同步
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
拉流
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
m3u8
Njex推流
初级开发
日志怎么进行打,怎么使用
介绍ffmpeg的基本概念
对复用/解复用及流操作的各种实战
Ffmpeg 的代码结构
libavcodec 提供了一些列的解码器
libavformat 实现在流协议,容器格式及io基本访问
libavfilter 提供了各种音视频过滤器
libavdevice 提供访问捕获设备和回访设备的接口
libswresample 实现混音和重采样
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 WARNING LOG_INFO
1 |
|
运行:
clang -g -o ffmpeg_log ffmpeg_log.c -lavutil
ffmpeg日志进行操作
文件的删除与重命名
avpriv_io_delete(“./mytestfile”)
1
2
3
4
5
6
7
8
9
10
int main(int argc,char* argv[]) {
//是个url串,符合url串都可以认的
int ret;
ret = avpriv_io_delete("1.txt");
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "fail \n");
}
}
avpriv_io_move(“11.txt”, “222.txt”)
pkg-config - - libs libavformat 能找到系统的 libavformat 的库的位置
//不是单引号是 ````` 1前面的那个符号
clang -g -o ffmpeg_del ffmpeg_f.c `pkg-config –libs libavformat`
vim学习
命令模式
拷贝、删除、粘贴等、通过i/a等间来进行切换到编辑模式
编辑模式
编辑文字
创建文件:vim filename
保存文件: :w
关闭文件::q
拷贝。粘贴、删除
yy/yw
p
Dd/dw
移动光标 h/j/k/l(这是小写的L)
文件头gg
文件尾G移动到行首 ^
移动到行尾$
按单词移动:向前w 2w 3w
向后 b 2b 3bvim查找与替换:查找关键字: /关键字 命令模式下 n来进行向下查找 N向上查找
查找与替换::%s/关键字/替换字/gc c 就是确定替换吗
//关键字 可以写正则表达式
set number 来进行显示行号
21,24s/关键字/替换字/gc 按照行号来进行替换
分窗口::split/ vsplit 横/竖 用close来关闭
窗口间跳转: ww w(hjkl)
操作目录重要函数
avio_open_dir()
avio_read_dir() 读取文件的信息
avio_close_dir() 释放资源
重要结构体
AVIODirContext 操作目录的上下文 目录的信息存在这里,read的时候
需要传这个 AVIODirContext进入
当关闭的时候也要传,知道关闭那个文件
AVIODirEntry:文件大小,文件信息
实战:简单的ls命令vim C语言环境
多媒体文件的基本概念(一)
- 多媒体文件其实是个容器;可以放音频数据,字幕数据
- 在容器里有很多流(stream/Track);流 和 轨 ; 音频数据和视频数据,这个两条不会交叉
- 每种流式有不同的编码器编码的 ; aac,mp3 h264 h265
- 在一个包中包含着一个或者多个帧。包可能一帧压缩数据,多个包组成流,然后就多个多媒体文件
- 几个重要结构体
- AVFormatContext 多个多媒体文件的桥梁,可以区分哪个多媒体
- AVStream 可以读取流
- AVPacket 多个包,可以通过解码器,解会原来的的数据
- 解复用(打开容器) -> 获取流-> 数据包 (读取流中的数据包,可以存一个或多个压缩帧) -> 释放相关的资源
打印音/视频信息
视频帧数是多少等。
av_register_all()
avformat_open_input()/avformat_close_input 这个会根据文件的格式进行读取
av_dump_format() //可以打印meta信息
SPS/PPS 是干啥的
帧与IDR帧的区别是啥?
Opengles 的知识估计是来不及了
抽取音频数据:
av_init_packet() //初始化
av_find_best_stream() //
av_read_frame/av_packet_unref()
fOpen(dst,”wb”);
特征码
//视频转图片
ffmpeg -i in.flv -r 1 -f image2 image-3%d.jpeg
//图片转视频
ffmpeg -i image-3%d.jpeg out.mp4
start Code
Sps/pps 是干啥的, 普通文件有一个这个就好了,会产生新的 屏幕分辨率一样,
改变分辨率的时候,都要把 sps和pps切换对应的
codec -> extradata , 在编码器的 extradata中获取
In->data + in->size 的是移动