FFmpeg + SDL 编程基础

本文提取自:雷霄骅(leixiaohua1020)的专栏 "视音频技术笔记"


FFmpeg编程

基础概念和工具:

封装格式( MP4, RMVB, TS, FLV, AVI)
视频编码数据( H.264, MPEG2, VC-1)
音频编码数据( AAC, MP3, AC-3)
视频像素数据( YUV420P, RGB)
音频采样数据( PCM)

信息查看工具
综合信息查看
MediaInfo
二进制信息查看
UltraEdit
单项详细分析
封装格式: Elecard Format Analyzer
视频编码数据: Elecard Stream Eye
视频像素数据: YUV Player
音频采样数据: Adobe Audition

下载地址

访问FFmpeg官网(http://ffmpeg.org)→选择Download→选择Windows Package→进入Zeranoe FFmpeg网站。
注意不要直接从FFmpeg官网下载源代码。
版本说明
Zeranoe网站中的FFmpeg分为3个版本:
Static:只包含3个体积很大的exe。
Shared:除了3个体积较小的exe之外,还包含了dll 动态库文件。
Dev:只包含了开发用的头文件(*.h)和导入库文件(*.lib)。
PS: 命令行使用的时候下载Static或者Shared版本就可以了

包含头文件

– 如果是C语言中使用 FFmpeg,则直接使用下面代码
#include "libavcodec/avcodec.h"
– 如果是C++语言中使用 FFmpeg,则使用下面代码
#define __STDC_CONSTANT_MACROS
extern "C"
{
#include "libavcodec/avcodec.h "
}

FFmpeg库

FFmpeg一共包含8个库:
▫ avcodec:编解码(最重要的库)。
▫ avformat:封装格式处理。
▫ avfilter:  滤镜特效处理。
▫ avdevice:各种设备的输入输出。
▫ avutil :  工具库(大部分库都需要这个库的支持)。
▫ postproc:后加工。
▫ swresample: 音频采样数据格式转换。
▫ swscale: 视频像素数据格式转换


解码流程图:

FFmpeg解码函数简介

av_register_all () :注册所有组件。
avformat_open_input() :打开输入视频文件。
avformat_find_stream_info():获取视频文件信息。
avcodec_find_decoder() :查找解码器。
avcodec_open2() :打开解码器。
av_read_frame() :从输入文件读取一帧压缩数据。
avcodec_decode_video2() :解码一帧压缩数据。
avcodec_close() :关闭解码器。
avformat_close_input() :关闭输入视频文件。


FFmpeg解码的数据结构图示

FFmpeg数据结构简介

AVFormatContext
封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。
AVInputFormat
每种封装格式(例如FLV, MKV, MP4, AVI )对应一个该结构体。
AVStream
视频文件中每个视频(音频)流对应一个该结构体。
AVCodecContext
编码器上下文结构体,保存了视频(音频)编解码相关信息。
AVCodec
每种视频(音频)编解码器(例如H.264解码器) 对应一个该结构体。
AVPacket
存储一帧压缩编码数据。
AVFrame
存储一帧解码后像素(采样)数据。

 

FFmpeg数据结构分析

AVFormatContext
iformat:输入视频的AVInputFormat
nb_streams :输入视频的AVStream 个数
streams :输入视频的AVStream [] 数组
duration :输入视频的时长(以微秒为单位)
bit_rate :输入视频的码率
AVInputFormat
name:封装格式名称
long_name:封装格式的长名称
extensions:封装格式的扩展名
id:封装格式ID
一些封装格式处理的接口函数

AVStream
id:序号
codec:该流对应的AVCodecContext
time_base:该流的时基
r_frame_rate: 该流的帧率
AVCodecContext
codec:编解码器的AVCodec
width, height:图像的宽高(只针对视频)
pix_fmt:像素格式(只针对视频)
sample_rate:采样率(只针对音频)
channels:声道数(只针对音频)
sample_fmt:采样格式(只针对音频)
AVCodec
name:编解码器名称
long_name:编解码器长名称
type:编解码器类型
id:编解码器ID
一些编解码的接口函数

AVPacket
pts:显示时间戳
dts :解码时间戳
data :压缩编码数据
size :压缩编码数据大小

stream_index :所属的AVStream
AVFrame
data:解码后的图像像素数据(音频采样数据)。
linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音
频帧的大小。
width, height:图像的宽高(只针对视频)。
key_frame:是否为关键帧(只针对视频) 。
pict_type:帧类型(只针对视频) 。例如I , P, B。


SDL视频显示

SDL:封装了复杂的视音频底层交互工作,简化了视音频处理的难度。

特点:跨平台,开源、

结构
SDL结构如下所示。可以看出它实际上还是调用了 DirectX等底层的API 完成了和硬件的交互

 

配置开发文件

打开属性面板
解决方案资源管理器->右键单击项目->属性
头文件配置
配置属性->C/C++->常规->附加包含目录,输入“include”(刚才拷贝文件的目录)
导入库配置
配置属性->链接器->常规->附加库目录,输入“lib” (刚才拷贝文件的目录)
配置属性->链接器->输入->附加依赖项,输入“SDL2.lib;SDL2main.lib”(导入库的文件名)
动态库不用配置


SDL视频显示函数简介

SDL_Init() :初始化SDL系统
SDL_CreateWindow() :创建窗口SDL_Window
SDL_CreateRenderer() :创建渲染器SDL_Renderer
SDL_CreateTexture() :创建纹理SDL_Texture
SDL_UpdateTexture() 设置纹理的数据
SDL_RenderCopy() :将纹理的数据拷贝给渲染器
SDL_RenderPresent() :显示
SDL_Delay() :工具函数,用于延时。
SDL_Quit() :退出SDL系统

 

SDL视频显示的数据结构

SDL数据结构简介
SDL_Window
代表了一个“窗口”
SDL_Renderer
代表了一个“渲染器”
SDL_Texture
代表了一个“纹理”
SDL_Rect
一个简单的矩形结构

 

基本的DOS命令

最关键命令
打开指定文件夹命令 cd {文件路径}
切换到上一级文件夹 cd ..
切换到当前目录下名为xxx的文件夹 cdxxx
改变当前盘符命令 c:
其他命令
查看目录内容命令 dir
创建目录命令 md
文件复制命令 copy
删除文件命令 del
清除屏幕命令 cls
Windows系统提供的额外命令
例如ping, ipconfig等等

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值