博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FFmpeg + SDL 编程基础
阅读量:4298 次
发布时间:2019-05-27

本文共 3374 字,大约阅读时间需要 11 分钟。

本文提取自:

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等等

 

转载地址:http://ienws.baihongyu.com/

你可能感兴趣的文章
25 iOS App Performance Tips & Tricks
查看>>
那些好用的iOS开发工具
查看>>
iOS最佳实践
查看>>
使用CFStringTransform将汉字转换为拼音
查看>>
更轻量的 View Controllers
查看>>
Chisel-LLDB命令插件,让调试更Easy
查看>>
时间格式化hh:mm:ss和HH:mm:ss区别
查看>>
When to use Delegation, Notification, or Observation in iOS
查看>>
Objective-C Autorelease Pool 的实现原理
查看>>
编程语言大牛王垠:编程的智慧,带你少走弯路
查看>>
ios指令集以及基于指令集的app包压缩策略
查看>>
iOS开发者的福利 — — iOS9+Xcode7免越狱免证书直接调试
查看>>
3、JavaWeb学习之基础篇—JSP
查看>>
4、JavaWeb学习之基础篇—Session
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>