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

时间:2013-11-10 17:05:16

标签: c# .net wpf video-streaming mediaelement

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

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

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

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

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

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

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

可以暂停/播放mediaElement或以秒为单位寻找位置。

任何帮助将不胜感激。

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

1 个答案:

答案 0 :(得分:1)

我有一个解决方案..

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

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

在服务方面,即需要传输视频的计算机。
我将在本地使用媒体元素播放视频,每隔5秒我就会在表格中添加一条记录条目,其中包含:
{缓冲区指针的位置,以字节为单位|播放指针的位置,以秒为单位}

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

计算校准表的示例可能如下所示:
* video1.mpg
字节|秒
150 5
350 10
800 15
900 20

:等等......

923544 445
1000000 450
1048500 455

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

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

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

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