您的位置:首页 > 其它

avi_read_packet重要的三个部分

2013-12-17 16:43 155 查看
static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
{
//1.如果是非交织AVI,用最近时间点来决定读取视频还是音频数据
if(avi->non_interleaved)
{
//遍历所有媒体流,按照已经播放的流数据,计算下一个最近的时间点
for(i=0; i<s->nb_streams; i++)
{
AVStream *st = s->streams[i];
AVIStream *ast = st->priv_data;
int64_t ts= ast->frame_offset;

if(ast->sample_size)
ts /= ast->sample_size;
ts= av_rescale(ts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);

//取最小的时间点对应的时间,流指针,流索引作为要读取的最佳(读取)流参数
if(ts < best_ts && st->nb_index_entries){
best_ts= ts;
best_st= st;
best_stream_index= i;
}
}

i= av_index_search_timestamp(best_st, best_ts, AVSEEK_FLAG_ANY);
//如果找到最佳流索引,定位媒体数据
url_fseek(s->pb, pos + 8, SEEK_SET);
}

resync:
//2.如果找到最佳流索引,读取媒体数据
if(avi->stream_index >= 0){
err= av_get_packet(pb, pkt, size);
return size;
}

//3.交织avi 时顺序读取文件,媒体数据
memset(d, -1, sizeof(int)*8);
for(i=sync=url_ftell(pb); !url_feof(pb); i++) {

//parse ##dc/##wb
if(n < s->nb_streams){
AVStream *st;
AVIStream *ast;
st = s->streams
;
ast = st->priv_data;

//首先要找到流标记,比如00db,00dc,01wb

//找到相应的流索引后,保存相关参数,跳转到实质性读媒体程序
goto resync;
}
}

return AVERROR_EOF;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: