美文网首页
FFmpeg多媒体格式转换(一)

FFmpeg多媒体格式转换(一)

作者: 子鱼_谋 | 来源:发表于2019-10-17 10:39 被阅读0次

讲解FFmpeg多媒体格式转换之前先讲下我们在格式转换过程中需要用到的API及FFmpeg相关的结构体介绍,通过这篇文章介绍在来学习多媒体格式转换时脑海中就会对整个流程有一个清晰的思路。

API列表介绍
  • avformat_open_input() 打开输入文件并创建封装格式 AVFormatContext

  • avformat_alloc_output_context2()/avformat_free_context() 输出多媒体文件上下文,对应的是avformat_alloc_input_context2() 输入多媒体上下文

  • avformat_new_stream()创建一个新的音视频流

  • avcodec_parameters_copy()拷贝多媒体参数信息,多媒体数据中有很多参数,比如视频帧率,音频采样率等等,因为我们只是转换格式,需要将原来的参数复制到新的多媒体数据中

多媒体文件写入相关的API

  • avio_open() 打开封装格式上下文中的AVIOContext *pb,打开之后才能给往 AVFormatContext中写入数据

  • avformat_write_header(),FFmpeg将它支持的所有多媒体格式头封装成流的api,只需要调用这个函数FFmpeg会通过格式判断来写入相应头多媒体头信息

  • av_write_frame()/av_interleaved_write_frame() 写入多媒体信息,两个函数都可以写入多媒体文件

  • av_write_trailer()写入多媒体尾部信息,与头部信息对应。

相关结构体介绍:
  • struct AVFormatContext:封装格式的上下文,用于存储所有都视频信息,其内部重要变量如下

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

AVIOContext *pb:输入数据的缓存

unsigned int nb_streams:视音频流的个数

AVStream **streams:视音频流

char filename[1024]:文件名

int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)

int bit_rate:比特率(单位bps,转换为kbps需要除以1000)

AVDictionary *metadata:元数据

  • struct AVStream是存储每一个视频/音频流信息的结构体,下面是结构体中的重要变量如下:

int index:标识该视频/音频流

AVCodecContext *codec:指向该视频/音频流的>

AVCodecContext(它们是一一对应的关系)

AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间

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

AVDictionary *metadata:元数据信息

AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)

AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。

  • struct AVIOContext是FFMPEG管理输入输出数据的结构体。AVIOContext中有以下几个变量比较重要:

unsigned char *buffer:缓存开始位置

int buffer_size:缓存大小(默认32768)

unsigned char *buf_ptr:当前指针读取到的位置

unsigned char *buf_end:缓存结束的位置

void *opaque:URLContext结构

  • struct AVPacket是存储压缩编码数据相关信息的结构体,重要的变量有以下几个:

uint8_t *data:压缩编码的数据。

例如对于H.264来说。1个AVPacket的data通常对应一个NAL。

注意:在这里只是对应,而不是一模一样。他们之间有微小的差别:使用FFMPEG类库分离出多媒体文件中的H.264码流

因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。

int size:data的大小

int64_t pts:显示时间戳

int64_t dts:解码时间戳

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

最后附一张FFmpeg关键结构体的关系图:

FFmeag中最关键的结构体之间的关系

参考资料:雷霄骅 FFmpeg结构体介绍

相关文章

  • FFMpeg

    MAC安装brew install ffmpeg Ffmpeg:由命令行组成,用于多媒体格式转换Ffplay:基于...

  • FFmpeg多媒体格式转换(一)

    讲解FFmpeg多媒体格式转换之前先讲下我们在格式转换过程中需要用到的API及FFmpeg相关的结构体介绍,通过这...

  • 005 2019-06-25 FFmpeg分解与复用

    多媒体格式转换 ffmpeg -i out.mp4 -vcodec copy -acodec copy out.f...

  • FFmpeg音视频提取

    下面这张图来自FFmpeg官网 多媒体格式转换 参数说明: -i:被处理的多媒体文件vcodec:视频编解码处理方...

  • iOS 集成FFmpeg环境(一):命令行转换视频格式

    作用:FFmpeg 可以用来转换视频格式,根据FFmpeg实现环境的配置来更改视频的格式。例如:将flv格式转换成...

  • FFmpeg多媒体格式转换(二)

    本章节讲述多媒体格式流程的操作步骤: 1, 创建输入和输出文件的上下文 2, 创建输出流信息,并且将原文件音视频流...

  • FFMPEG

    FFmpeg 官网FFmpeg Githubffmpeg Documentation 功能 视频采集视频格式转换视...

  • Linux Android FFmpeg 编译

    FFmpeg简介 FFMPEG是一套具有非常强大功能的多媒体处理工具,它几乎涵盖了目前所有主流的多媒体数据封装格式...

  • 24_用Qt和FFmpeg实现简单的YUV播放器

    前面文章FFmpeg像素格式转换中我们使用FFmpeg实现了一个像素格式转换工具类,现在我们就可以在Qt中利用QI...

  • FFMpeg for PHP

    FFMpeg for PHP PHP使用FFMpeg来转换视频格式。 本质是使用ffmpeg服务来执行的,而非通过...

网友评论

      本文标题:FFmpeg多媒体格式转换(一)

      本文链接:https://www.haomeiwen.com/subject/nhscdctx.html