缓冲时播放视频:将缓冲的字节与缓冲的持续时间相关联

Ctr*_*ete 7 .net c# wpf mediaelement video-streaming

我正在开发一个应用程序,它需要将视频从一台计算机(称为视频计算机)传输到另一台计算机(用户计算机).流模型使得视频文件字节"从原样"从视频计算机发送到用户计算机,并且在用户端完成解码.

在用户端接收的字节存储在System.IO.FileStream对象中.fileStream对象的长度(以字节为单位)在缓冲开始时设置(因为可以在开始时发送有关视频文件的元数据).

当缓冲开始时,System.Windows.Controls.MediaElement对象的源被设置为filestream对象.

如果用户不希望寻找视频并且缓冲率保持高于播放速率,则一切顺利.但是,人们不能靠运气.我需要一种机制来检查缓冲视频的持续时间是否小于当前播放时间......这样视频必须暂停(这可能发生在用户在很远的时候寻找视频,或者缓冲速率很慢的情况下).然后应采取纠正措施,并且只有在缓冲了最小持续时间后才开始播放.

因此,我需要一种机制来"确定缓冲持续时间以秒为单位(即以秒为单位查找缓冲区指针的位置)"给定缓冲区指针在缓冲时间线上的位置(以字节为单位)或确定已播放(或在播放指针后面传递)的字节数给定当前以秒为单位播放指针位置".

在任何时刻,已知以下数量:

  • 缓冲区指针的位置以字节为单位
  • 播放指针的位置,以秒为单位
  • 视频的持续时间
  • 视频长度,以字节为单位

可以mediaElement在几秒钟内暂停/播放或搜索到某个位置.

任何帮助将不胜感激.

[注意,不能说bufferPositionInSeconds= bufferPositionInBits/videoBitRate,因为实际上大多数视频的比特率都是可变的,并且因为文件中存在元数据.

G.Y*_*G.Y 1

我有一个解决方案给你..

您只需为要传输的每个视频构建一个校准表即可。

这个想法相当简单,假设我有一个名为 video1.mpg 的视频文件。
假设视频文件的长度(以字节为单位)正好是 1mb(1048576 字节)。

在服务端,这是需要传输视频的计算机。
我将在本地使用媒体元素来播放视频,每 5 秒我将向表中添加一个记录条目,其中包含:
{缓冲区指针的位置以字节为单位| 播放指针的位置(以秒为单位)}

完成后,我会将表保存在简单的文本文件、二进制文件或 XML 中 - 无论什么让您感觉良好。
(每个视频只需执行一次此过程!)

计算校准表的示例如下所示:
*video1.mpg
bytes | 秒
150 5
350 10
800 15
900 20
:
: 等等.....
:
923544 445
1000000 450
1048500 455

基于该表,您可以构建任何允许将视频中的秒解释为文件中的字节以提供服务的机制。

在您的具体问题中 - 您想知道是否有足够的缓冲来开始播放视频..
可以通过在开始发送视频之前将该表文件发送到客户端来完成,以便客户端知道是否开始播放 - 或者以其他方式完成如果至少接下来的 15 秒已经缓冲的话。

或者另一种选择是将表保留在服务端,当服务器识别出它提供了 X 字节时,他可以使用另一个 tcp 通道来通知客户端播放电影 Z 秒。

唯一仍然仲裁的是您需要决定多少时间(或通过校准表累积的字节转换为时间)足以让玩家开始玩。哦..当然,如果您想要 5 秒或 30 秒的校准分辨率..由您决定。