我正在开发一个应用程序,它需要将视频从一台计算机(称为视频计算机)传输到另一台计算机(用户计算机)。流模型使得视频文件字节从视频计算机发送到用户计算机"因为它是"并在用户端完成解码。
用户端接收的字节存储在System.IO.FileStream
对象中。 fileStream
对象的长度(以字节为单位)在缓冲开始时设置(因为可以在开始时发送有关视频文件的元数据)。
当缓冲开始时,System.Windows.Controls.MediaElement
对象的源被设置为filestream
对象。
如果用户不想寻找视频并且缓冲率保持高于播放速率,则一切顺利。但是,人们不能靠运气。我需要一种机制来检查缓冲视频的持续时间是否小于当前播放时间......这样视频必须暂停(这可能发生在用户在很远的时候寻找视频,或者缓冲速率很慢的情况下)。然后应采取纠正措施,只有在缓冲了最小持续时间后才能开始播放。
因此,我需要一种机制,以秒为单位确定缓冲持续时间(即,以秒为单位查找缓冲区指针的位置)给定缓冲区指针在缓冲时间线上的位置(以字节为单位)或确定已经播放(或通过)的字节数在播放指针后面给出当前播放指针的位置,以秒为单位"。
在任何时刻,都知道以下数量:
可以暂停/播放mediaElement
或以秒为单位寻找位置。
任何帮助将不胜感激。
[请注意,不能说bufferPositionInSeconds
= bufferPositionInBits / videoBitRate,因为实际上大多数视频的比特率都是可变的,并且因为文件中存在元数据。]
答案 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秒的校准分辨率......由你来决定。