没有合适的资源?快使用搜索试试~ 我知道了~
FFmpeg简单了解
资源推荐
资源详情
资源评论
一、了解 FFmpeg
1.1 什么是 FFmpeg
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机
程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。它
包含了非常先进的音频/视频编解码库 libavcodec,为了保证高可移植性和编解码质量,
libavcodec 里很多 code 都是从头开发的。
FFmpeg 在 Linux 平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括
Windows、Mac OS X 等。这个项目最早由 Fabrice Bellard 发起,2004 年至 2015 年间由 Michael
Niedermayer 主要负责维护。许多 FFmpeg 的开发人员都来自 MPlayer 项目,而且当前 FFmpeg
也是放在 MPlayer 项目组的服务器上。项目的名称来自 MPEG 视频编码标准,前面的"FF"代
表"Fast Forward"。FFmpeg 编码库可以使用 GPU 加速。
1.2 FFmpeg 的功能
1.2.1 视频采集功能
FFmpeg 视频采集功能非常强大,不仅可以采集视频采集卡或 USB 摄像头的图像,还可
以进行屏幕录制,同时还支持以 RTP 方式将视频流传送给支持 RTSP 的流媒体服务器,支持
直播应用。
1.2.2 视频格式转换功能
FFmpeg 视频转换功能。视频格式转换,比如可以将多种视频格式转换为 flv 格式,可不
是视频信号转换 。
FFmpeg 可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod 等),例如可以
将摄录下的视频 avi 等转成视频网站所采用的 flv 格式。
1.2.3 视频截图功能
对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓
gif 文件;因为抓出的 gif 文件大而播放不流畅。
1.2.4 给视频加水印功能
使用 FFmpeg 视频添加水印(watermark)。
1.3 项目组成
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机
程序。它包括了领先的音/视频编码库 libavcodec 等。
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上
下文结构和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用 ffmpeg 库解析和解码,通过 SDL 显示;
1.4 FFmpeg 下载
https://ffmpeg.org/download.html#releases
根据需求选择版本,免费开源。
二、学习笔记
2.1 视频文件解码流程
2.2 封装与编码格式
2.3 ffmpeg 视频解码 (解码为 YUV)
2.3.1 方案流程图
注释:
1、av_register_all():注册所有组件。
2、avformat_open_input():打开输入视频文件。
3、avformat_find_stream_info():获取视频文件信息
4、avcodec_find_decoder():查找解码器。
5、avcodec_open2():打开解码器。
6、av_read_frame():从输入文件读取一帧压缩数据。
7、avcodec_decode_video2():解码一帧压缩数据。
8、avcodec_close():关闭解码器。
9、avformat_close_input():关闭输入视频文件。
2.3.2 视频解码程序
/**
* FFMPEG 视频解码流程
* 1、av_register_all():注册所有组件。
* 2、avformat_open_input():打开输入视频文件。
* 3、avformat_find_stream_info():获取视频文件信息
* 4、avcodec_find_decoder():查找解码器。
* 5、avcodec_open2():打开解码器。
* 6、av_read_frame():从输入文件读取一帧压缩数据。
* 7、avcodec_decode_video2():解码一帧压缩数据。
* 8、avcodec_close():关闭解码器。
* 9、avformat_close_input():关闭输入视频文件。
*/
#include "stdafx.h"
#include <stdio.h>
#define __STDC_CONSTANT_MACROS
#ifdef _WIN32
//Windows
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
};
#else
//Linux...
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#ifdef __cplusplus
};
#endif
#endif
int main()
{
//文件格式上下文
AVFormatContext *pFormatCtx; // 封装格式上下文结构体,也是统领全局的结构体,保存了视
频文件封装 格式相关信息。
int i = 0, videoindex;
AVCodecContext *pCodecCtx; // 编码器上下文结构体,保存了视频(音频)编解码相关信息。
AVCodec *pCodec; // AVCodec 是存储编解码器信息的结构体。
AVFrame *pFrame, *pFrameYUV; // AVFrame 是包含码流参数较多的结构体
unsigned char *out_buffer;
AVPacket *packet; // AVPacket 是存储压缩编码数据相关信息的结构体
int y_size;
int ret, got_picture;
// struct SwsContext 结构体位于 libswscale 类库中, 该类库主要用于处理图片像素数据, 可以完成
图片像素格式的转换, 图片的拉伸等工作.
struct SwsContext *img_convert_ctx;
char filepath[] = "input.mkv";
FILE *fp_yuv = fopen("output.yuv", "wb+");
av_register_all(); // 注册所有组件
avformat_network_init(); // 对网络库进行全局初始化。
pFormatCtx = avformat_alloc_context(); // 初始化 AVFormatContext 结构体指针。使用
avformat_free_context()释放内存。
if (avformat_open_input(&pFormatCtx, filepath, NULL, NULL) != 0) // 打开输入流并读取
header。必须使用 avformat_close_input()接口关闭。
{
printf("Couldn't open input stream.\n");
return -1;
}
//读取一部分视音频数据并且获得一些相关的信息
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) // 读取媒体文件的包以获取流信息
{
printf("Couldn't find stream information.\n");
return -1;
}
剩余42页未读,继续阅读
资源评论
PJ...
- 粉丝: 333
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功