标签:
为编码帧开辟存储空间
设置帧的一些参数
liveVFrame = av_frame_alloc(); if (!liveVFrame) { return -1; } liveVFrame->format = liveVideoCodecCtx->pix_fmt; liveVFrame->width = liveVideoCodecCtx->width; liveVFrame->height = liveVideoCodecCtx->height; ret = av_image_alloc(liveVFrame->data, liveVFrame->linesize, liveVFrame->width, liveVFrame->height, liveVideoCodecCtx->pix_fmt, 32);
在编码前:ret = avcodec_encode_video2(liveVideoCodecCtx, &pkt, liveVFrame, &got_output);
需要填充 liveVFrame->data[0],liveVFrame->data[1],liveVFrame->data[2]; 然后进行编码。
------------------------------------------------------------------------------------------------------------------------------------
FFMPEG打开媒体的的过程开始于avformat_open_input 输入输出结构体AVIOContext的初始化;
输入数据的协议(例如RTMP,或者file)的识别
(通过一套评分机制):1判断文件名的后缀 2读取文件头的数据进行比对;
使用获得最高分的文件协议对应的URLProtocol,通过函数指针的方式,与FFMPEG连接(非专业用词);
剩下的就是调用该URLProtocol的函数进行open,read等操作了
--------------
一共初始化了3个AVFormatContext,其中2个用于输入,1个用于输出。
3个AVFormatContext初始化之后,
通过avcodec_copy_context()函数可以将输入视频/音频的参数拷贝至输出视频/音频的AVCodecContext结构体。
然后分别调用视频输入流和音频输入流的av_read_frame(),
从视频输入流中取出视频的AVPacket,
音频输入流中取出音频的AVPacket,
分别将取出的AVPacket写入到输出文件中即可。
其间用到了一个不太常见的函数av_compare_ts(),是比较时间戳用的。
通过该函数可以决定该写入视频还是音频。
简单介绍一下流程中各个重要函数的意义:
avformat_open_input():打开输入文件。
avcodec_copy_context():赋值AVCodecContext的参数。
avformat_alloc_output_context2():初始化输出文件。
avio_open():打开输出文件。
avformat_write_header():写入文件头。
av_compare_ts():比较时间戳,决定写入视频还是写入音频。
这个函数相对要少见一些。
av_read_frame():从输入文件读取一个AVPacket。
av_interleaved_write_frame():写入一个AVPacket到输出文件。
av_write_trailer():写入文件尾。
--------------------------------------------
以上转自雷神:http://blog.csdn.net/leixiaohua1020/article/details/39802913
标签:
原文地址:http://www.cnblogs.com/wainiwann/p/5608038.html