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; }
相关文章推荐
- web前端的三个重要部分
- 确保你的备份恰到好处 Ubuntu桌面版的默认工具:dejá-dup仅被设置为默认备份你的home目录,因此它遗漏一些你在需要将系统恢复到有序的工作状态时的重要部分。让我们试想一下你的系统由以下三个部
- 现在就开始使用AngularJS的三个重要原因
- FFmpeg图解:ff_raw_read_partial_packet
- 从文件中播放视频 VideoCapture_read_avi.py
- A Service Mesh for Kubernetes(第1部分): Service的重要指标
- Hashtable和HashMap类有三个重要的不同之处。
- 原创Couldn't read packet- Connection reset by peer 错误排查思路(推荐)
- 现在就开始使用AngularJS的三个重要原因
- LXC部分重要配置文件及文件夹分析
- GIS正日益融入IT主流 成IT业重要部分
- InputStream的三个read的区别
- C++继承中不能被继承的三个部分
- InputStream的三个read的区别
- 10个重要部分,讲述从程序员到高级系统架构师该如何进阶?
- python中的三个读read(),readline()和readlines()
- cloudstack源码安装重要的三个指导书
- xmpp聊天部分重要代码
- 三个重要的散列演示
- 网管的三个重要服务AAA、NTP和SYSLOG