首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

[SOS] av_read_frame的有关问题

2012-02-21 
[SOS] av_read_frame的问题!哈,又要麻烦大家了,我现在用av_read_frame循环遍历了一个媒体文件,得到该文件

[SOS] av_read_frame的问题!
哈,又要麻烦大家了,我现在用av_read_frame循环遍历了一个媒体文件,得到该文件的总帧数,但是,我只想得到视频的帧数,不要音频帧,我怎么判断av_read_frame读到的是视频帧还是音频帧?

[解决办法]
楼主好执着呢,干嘛非要得到总帧数?你这种求法速度太慢了,一个大文件几分钟也算不完。时长有时长的求法,不是有duration吗?再说了,各种文件格式都不一样,有的文件没有时长或者代码没有写,你也求不出来啊,有时候要自己改ffmpeg代码的。帧率和时长都不是播放文件所必需的东西,要先考虑一下性能代价再说。

// get duration
switch(nFileFormat)
{
case FILE_FORMAT_MPEG:
case FILE_FORMAT_TS:
case FILE_FORMAT_NUT:
{
INT64 pos = pFile->GetLength() - 2*1024*1024;
if(pos < 0) pos = 0;
av_seek_frame(m_pContext, -1, pos, AVSEEK_FLAG_BYTE);

AVStream *stream = m_pContext->streams[m_dwStreamIndex];

AVPacket packet;
while(av_read_frame(m_pContext, &packet) == 0)
{
if(packet.stream_index == m_dwStreamIndex && packet.pts != AV_NOPTS_VALUE)
{
if(nFileFormat == FILE_FORMAT_NUT)
stream->duration = packet.pts;
else
stream->duration = packet.pts - stream->first_dts;
}

av_free_packet(&packet);
}

break;
}
...
...
...
}

...
...
...

if(stream->duration != AV_NOPTS_VALUE)
{
m_i64Duration = stream->duration * 10000000i64;
if(stream->time_base.den > 0 && stream->time_base.num > 0)
{
m_i64Duration = m_i64Duration * stream->time_base.num / stream->time_base.den;
}
}
else
{
m_i64Duration = m_pContext->duration * (10000000i64 / AV_TIME_BASE);
}
[解决办法]
如果是h264没有办法改变的话就有点麻烦了,要是自己生成的,建议不要生成这种文件格式,本来就不是一种标准的文件格式,建议生成时,打包一下AVI或MP4就方便多了,毕竟编码时自己知道多少帧。
这种纯视频文件没有很好的获取长度的方法,h264一般没有码率标记,有的连帧率标记都没有,只能读取文件的一段(如10MB)求一个平均值计算一下。VMR的MP3也是不好求,一般长度是写在MP3第一帧的头,如果没写,好多播放器求出的长度相差也很大。
所以,尽量避免生成这种格式,这种格式一般是用来研发编码调试用的。
[解决办法]
我说的AVI和MP4只是一个容器,是对H264的封装打包以便更好解析,不会对源数据有任何影响,不是转换,不用重编码,速度也很快,摄像机生成文件的时候直接实时打包就行了。
这个要修改摄像机的软件录像模块。
[解决办法]
用mediainfo,这个东西是可以得到文件时长及编码信息的,而且也是开源的
[解决办法]
这个不好说,楼主还是要懂一点文件格式为好,好多问题要具体情况具体分析,不懂文件格式和音视频格式做音视频就是浑水摸鱼,永远不知道自己是不是对的。

热点排行