FFmpeg的使用

FFmpeg库介绍

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,其开放源码 中以模块化的方式进行构建,因此我们可以根据情况自行选择不同的模块进行集成使用。前面的"FF"代 表"Fast Forward"。

FFmpeg主要包含一下几个模块:

1、avformat:用于各种音视频封装格式的生成和解析
2、avcodec:用于各种类型声音/图像编解码
3、avfilter:滤镜特效处理,如水印
4、avutil:一些公共的工具函数
5、postproc:后期效果处理
6、swresample:原始音频格式转码
7、swscale:图像格式转换、缩放等,如rgb888 转换 yuv420

FFmpeg解码函数简介:

1、av_register_all() 注册所有文件格式和编解码库
2、avformat_network_init() 打开网络视频流
3、av_open_input_file() 读取文件头部把信息保存到AVFormatContext结构体
4、av_find_stream_info() 为pFormatCtx->streams填充上正确的信息
5、CODEC_TYPE_VIDEO 通过判断得到视频流类型
6、avcodec_find_decoder() 查找解码器
7、avcodec_open() 打开编解码器
8、avcodec_alloc_frame() 分配空间保存帧数据
9、av_read_frame() 不断从流中提取帧数据
10、avcodec_decode_video() 解码视频流
11、avcodec_close() 关闭解码器
12、avformat_close_input_file() 关闭输入文件

FFmpeg解码的流程图如下所示:

在这里插入图片描述

FFmpeg数据结构详解

AVFormatContext

媒体文件的构成和基本信息上下文,也是统领全局的结构体,保存了视频文件封装格式相关信息,其主要变量有:

struct AVInputFormat *iformat:输入数据的封装格式

AVIOContext *pb:输入数据缓存

unsigned int nb_streams:音视频流个数(输入视频的AVStream个数)

AVStream **streams:音视频个数(输入视频的AVStream[]数组)

char filename[1024]:文件名

int64_t duration:时长(单位:us)(输入视频的时长)

int bit_rate:比特率(输入视频的码率)

AVDictionary *metadata:元数据

AVInputFormat

每种封装格式(例如FLV、MKV、MP4、AVI)对应一个该结构体

long_name:封装格式的长名称

extensions:封闭格式的扩展名

id:封装格式ID

… 一些封装格式处理的接口函数

AVCodecContext

编解码信息上下文的数据结构,保存了视频(音频)编解码相关信息

codec:编解码器的AVCodec

width, height:图像的宽高(只针对视频)

pix_fmt:像素格式(只针对视频)

sample_rate:采样率(只针对音频)

channels:声道数(只针对音频)

sample_fmt:采样格式(只针对音频)

AVStream

媒体流(存储视频/音频流信息的结构体),视频文件中每个视频(音频)流对应一个该结构体,其主要变量:

AVCodecContext *codec:视频/音频流的AVCodecContext

AVRational time_base:时间基准,真正的时间 = PTS*time_base

int64_t duration:该视频/音频流时间长度

AVDictionary *metadata:元数据信息

AVRational avg_frame_rate:帧率

AVPacket attached_pic:附加图片

AVCodec

每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体

name:编解码器名称

long_name:编解码器长名称

type:编解码器类型

… 一些编解码的接口函数

AVPacket

解码前的数据结构体,存储一帧压缩编码数据

uint8_t *data:压缩编码数据,一个AVPacket的data通常对应一个NAL

int size:data的大小

int64_t pts:显示时间戳

int64_t dts:解码时间戳

int stream_index:标识该AVPacket所属的视频/音频流

AVFrame

解码后的数据结构体,存储一帧解码后像素(采样)数据

data:解码后的图像像素数据(音频采样数据)

linesize:对视频来说是图像中一行像素的大小,对音频来说是整个音频帧的大小

width, height:图像的宽高(只针对视频)

key_frame:是否为关键帧(只针对视频)

pict_type:帧类型(只针对视频),例如I、P、B

FFmpeg工具使用

在开发在开发播放器播放之前可以借助FFmpeg对需要播放的媒体文件进行查看。在官网下载FFmpeg工具,解压并将bin目录配置到环境变量path。FFmpeg程序套件中主要存在以下三个程序:

在这里插入图片描述

缩放:ffmpeg -i test.mp4 -s 100x100 output.mp4

转码:ffmpeg -i test.mp4 test.avi

给视频添加文字水印:

ffmpeg -i test.mp4 -vf "drawtext=fontfile=simsunb.ttf:text='sunchaoyang':x=100:y=10:fontsize=24:fontcolor=red:shadowy=2" drawtext.mp4

给视频添加图片水印:

ffmpeg -i test.mp4 -vf "movie=git_ffmpeg.jpg[watermark];[in][watermark] overlay=x=700:y=main_h-overlay_h-400[out]" drawjpg.mp4 其中git_ffmpeg.jpg就是要添加的图片路径

跑马灯:

ffmpeg -i test.mp4 -vf "drawtext=text='sunchaoyang':expansion=normal:fontfile=foo.ttf:y=h/2:x=(mod(5*n\,w+tw)-tw):fontcolor=red:fontsize=40:shadowx=2:shadowy=2" drawpmdtext.mp4

播放:ffplay -i test.mp4

查看:ffprobe -i test.mp4

播放:ffplay -i test.mp4

查看:ffprobe -i test.mp4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值