本文提取自:雷霄骅(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等等