Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 减少OSMF流上的FPS-MPEG-2报头问题_Actionscript 3_Video_Timestamp_Frame Rate_Mpeg2 Ts - Fatal编程技术网

Actionscript 3 减少OSMF流上的FPS-MPEG-2报头问题

Actionscript 3 减少OSMF流上的FPS-MPEG-2报头问题,actionscript-3,video,timestamp,frame-rate,mpeg2-ts,Actionscript 3,Video,Timestamp,Frame Rate,Mpeg2 Ts,我一直在到处找,找不到解决办法。我有一个25 FPS的视频,我在OSMF上播放,但OSMF坚持以29-31 FPS播放。这导致视频播放速度比实时快约15%。如果在VLC中打开同一个视频并并排播放,结果会非常明显 当我尝试进行实时流时,问题就出现了。它将消耗缓冲区并赶上实时,然后流崩溃,因为没有新的视频等待 我试图跟踪代码以找出帧实际输出到屏幕的位置,但我在SWC文件中遇到了死胡同。我也尝试过在线搜索,但我找不到任何关于限制FPS的信息——每个人都对增加FPS感兴趣 我宁愿以每秒15帧的速度播放,

我一直在到处找,找不到解决办法。我有一个25 FPS的视频,我在OSMF上播放,但OSMF坚持以29-31 FPS播放。这导致视频播放速度比实时快约15%。如果在VLC中打开同一个视频并并排播放,结果会非常明显

当我尝试进行实时流时,问题就出现了。它将消耗缓冲区并赶上实时,然后流崩溃,因为没有新的视频等待

我试图跟踪代码以找出帧实际输出到屏幕的位置,但我在SWC文件中遇到了死胡同。我也尝试过在线搜索,但我找不到任何关于限制FPS的信息——每个人都对增加FPS感兴趣

我宁愿以每秒15帧的速度播放,每秒减少10帧,也不愿赶上实时并惨遭崩溃

编辑-在花了整个周末的时间关注这个问题之后,我取得了一些令人难以置信的进展。首先也是最重要的是,限制OSMF中FPS的唯一方法是发送一个自定义FLV头,并适当设置时间戳(
1000/FPS
每个帧之间的差异)

意识到这一点,我可以通过基于内部计数器手动设置时间戳来暂时解决这个问题。每次处理一帧时,设置
timestamp=last\u timestamp+40。问题是,我不知道视频是否总是每秒25帧。有一天,我可能会有30 FPS甚至60 FPS的视频流。为了使它更加健壮,我决定解码MPEG-2报头(读取PTS值)并将其转换为FLV报头

现在问题来了……这个视频文件(理论上是25fps)在QuickTime中播放得非常完美。因此,我知道头是好的,因为一个拥有数十亿美元的昂贵软件正确地计算了帧速率。但是当我从报头()读取PTS并除以90(将90Khz时钟转换为毫秒时间戳)时,每个时间戳间隔为33或34毫秒,即我得到的29~31 FPS


那么,当我知道视频是25 FPS(间隔40毫秒)时,为什么PTS会给我间隔33-34毫秒的时间戳呢?更重要的是,QuickTime如何读取MPEG-2报头,以便正确播放所有内容?

您需要手动设置FPS

在Flash Professional中,可以在“文档属性”中更改帧速率

在Flash Builder中,可以使用元数据设置帧速率,如和所述

因此


[SWF(frameRate='15')]

首先,回答我最初的问题:

降低OSMF中的FPS 您必须创建自己的文件处理程序实现,该文件处理程序解析视频头并修改时间戳。没有办法告诉OSMF以“慢动作”或“快进”播放。有关创建自己的文件处理程序的示例,请查看
FLVParser
类。请注意,有单独的类用于解析视频和音频标记。必须在每个标题中更新标题,以确保视频和音频同步播放

当文件被传递到视频解析器时,每个时间戳都被认为是相对于第一个时间戳的。因此,如果第一个时间戳是1234,那么它将被设置为“时间零点”,并且所有未来的时间戳都将与此相关这很重要。如果跳过一个视频标记,并且发送的第一个时间戳来自视频的后面,它将使用错误的“时间零点”值,并且无法正确同步

这让我们想到

我的问题 首先,M3U8中的持续时间与时间戳差异之和不匹配。从第一个时间戳开始并将其标记为“时间零点”,然后查看最后一个时间戳并从中减去时间零点,得到的时间跨度不等于TS文件的预期持续时间

事实证明,当VLC或QuickTime遇到这种情况时(PTS值的总和不等于视频的持续时间),它们会动态生成新的头文件。取持续时间除以帧数,这是PTS值之间的新偏移量

这是我的第一个问题。一旦解决了这个问题,我不再是每10秒获得一秒,而是每2分钟获得一秒。事实证明,我加载下一个TS文件有点太早(关闭一个错误),这导致我从每个TS丢弃一个数据包。这导致每10秒丢失一帧

附加信息 在这之后不久,我遇到了FPS的另一个问题,我找到了解决方案。如果有人觉得OSMF播放视频速度太快,我建议您将代码改为
bufferTimeMax

当bufferTimeMax>0且bufferLength>=bufferTimeMax时,音频播放速度会更快,直到bufferLength达到bufferTime。如果直播流仅为视频,则视频播放速度会更快,直到bufferLength达到bufferTime

根据播放延迟的程度(bufferLength和bufferTime之间的差异),Flash Player将追赶率控制在1.5%和6.25%之间。如果流包含音频,则可通过频域下采样实现更快的播放,从而将音频失真降至最低


6.25%=0.975秒/15(每10~20秒增加一秒)

Flash Professional允许您控制文档的FPS。你的IDE是什么?我在Flash Builder中工作。我会看看它有什么样的选项。我在下面的Flash Builder中发布了如何做。不幸的是,这并没有解决我的问题。虽然这可能会将实际flash插件的显示速度限制在15 FPS,但当我打开频闪媒体播放器视频信息覆盖时,视频仍以大约29~32 FPS的速度呈现。这是一个SWF。它从外部源加载视频文件。我使用OSMF来流媒体。我在Chrome的Pepper Flash播放器Adobe Flash Player中也得到了同样的结果(每秒29~32帧)