原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4395622
我有一个mpeg-2格式的视频文件(纯es流的视频),NTSC制式,我数出来的视频帧一共为31358帧,折合时间为1046秒。
但我用播放器播放的时候,播放器表示这段素材是1307秒,我也明确知道这段素材是1307秒。数出来的帧数怎么和实际长度不一致呢?
帧数/帧率 != 播放时间 ???
ps:数的帧数绝对没问题。播放的实际时间也对的。但计算的时间和实际时间不能吻合,而且相差太远了
---------------------------------------------------------------
你要看是设定的帧率还是实际帧率。
"帧数/帧率 == 播放时间"中的帧率应该是实际帧率
实际中设定帧率经常不等于实际的帧率。
这样就是出现了你的那种情况罗!
楼主可以在GraphEdit中播放这个文件,在Render Filter就能看到它的实际帧率了!
---------------------------------------------------------------
根据repeat_first_field 和top_field_first两个字段,有些frame可不是只播放一次的。具体算法要参考一下iso 13818-2了。
----------------------------------------------------------------
ablewindy(我是【风子】我怕谁) ( )
实际帧率我是从码流里的sequcence分析得到的
下面是它的部分序列数据
00 00 01 B3 2D 01 E0 34 12 11 23 82 ... ...
注意第8个字节为0x34,相应的帧率表示为 0100(2进制),根据13818-2,可以得到为29.97帧/秒
Bill1212(Bill) ( )
对于重复播出的情况我也考虑了,但查看他的扩展序列中的progressive_sequence字段均为0,所以也不符合重复输出重构帧的条件。
------------------------------------------------------------
不过我有个想法,但没得到证实。
这个m2v文件是我重dvd碟片上的vob文件里分离得到。考虑dvd的播放应该是以电影的方式播放,电影的帧率为24帧/秒,如果按照这个帧率来计算,与实际情况很符合。
to:ablewindy(我是【风子】我怕谁) ( )
用GraphEdit播放,从render里可以看到帧率是24帧,但很奇怪,明明码流里写的是29.97,为什么播放以24帧的速度来呢?
-------------------------------------------------
问题解决。查看标准后,发现确实有重复播出的情况。
现总结如下
在视频序列扩展里有progressive_sequence,
当progressive_sequence=1,表示后面的视频为逐行的帧图
progressive_sequence=0,表示后面的视频可以为场图,也可为帧图,帧图可以为逐行或隔行
在每图象扩展里有3个字段与图象的显示时间有关系。
分别为top_field_first
repeat_first_field
progressive_frame
这里讲的帧包含2场,比如以25帧/秒的速率播放,实际上为50场/秒
if (progressive_sequence==1)
{
输出帧的2场为逐行
//重构帧的输出次数=top_field_first+repeat_first_field+1,最大重复输出次数为3
}
else
{
if (progressive_frame==1)
{
输出帧的2场为逐行
if (repeat_first_field=1)
{
输出3场,其中有一场为重复输出
}
else
{
输出2场
}
}
else
{
输出帧的2场为隔行
}
}
对于从dvd里得到的视频序列,码流里明确表示播放帧率为29.97,但实际播放的帧率为24帧,因为码流中有重复播出的情况。
我的m2v素材就是从dvd上分离得到,一共在码流中数到帧数为31358,但如果算上重复输出那么应该为39155,实际的播放时间就是39155/29.97=1306.5秒,和实际很符合。
(Bill1212) |