播放视频时缓冲:将缓冲字节与缓冲持续时间联系起来。

7
我正在开发一个应用程序,需要将一台计算机(称为视频计算机)中的视频流式传输到另一台计算机(用户计算机)。流媒体模型是这样的:来自视频计算机的视频文件字节“原样”发送到用户计算机,解码在用户端完成。
在用户端接收的字节存储在System.IO.FileStream对象中。在缓冲开始时,fileStream对象的长度(以字节为单位)被设置(因为有在一开始发送有关视频文件的元数据的规定)。
当缓冲开始时,System.Windows.Controls.MediaElement对象的源被设置为filestream对象。
如果用户不想寻找视频并且缓冲速率保持高于播放速率,则一切顺利。然而,不能依赖运气。我需要一种机制来检查已缓冲的视频持续时间是否小于当前播放时间... 以便视频必须暂停(当用户在远处的时间寻找视频或者缓冲速率较慢时可能会发生)。然后应采取纠正措施,只有在缓冲了最短持续时间之后,才能开始播放。
因此,我需要一种机制,可以确定给定字节缓冲时间轴上的缓冲指针位置时“确定缓冲的持续时间(以秒为单位)(即查找缓冲指针的位置)或查找当前播放指针位置时已经播放的字节数(或者经过的时间)。 ”
在任何时刻,以下数量是已知的:
- 字节缓冲器指针位置 - 播放指针位置(以秒为单位) - 视频持续时间 - 视频长度(以字节为单位)
可以暂停/播放mediaElement对象或将其定位到以秒为单位的位置。
任何帮助都将不胜感激。
[请注意,不能说bufferPositionInSeconds = bufferPositionInBits / videoBitRate,因为大多数情况下视频的比特率是可变的,并且由于文件中存在元数据。]

1
我认为你的注释已经回答了为什么你不能仅基于字节找到位置/秒缓冲。 - Batavia
1个回答

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秒的校准分辨率..这取决于您的决定。


我也和上面提问的那个人一起在同一个项目上工作。谢谢你的建议。我想问你是否能想到一种快速完成索引的方法(即每个视频内几秒钟内完成)。 - unrealsoul007
不,我认为从数学上讲这是不可能的。比喻来说,这就好像在建造一座没有计划、只用散落在地面上且从未被测量过的砖块建造的塔之前,问能否测量其高度。我提供的解决方案就像是说:好的,先建造到5米高,现在检查使用了多少砖块,然后再建造到10米高……以此类推。 - G.Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接