我有一个基于FFmpeg的视频播放应用,可以播放来自任意InputStream的内容。
重要的是应用程序能够播放正在下载的视频文件。我似乎需要的是一种特殊的FileInputStream,它将(a)与下载线程共享文件访问权限,(b)如果到达下载部分的末尾,将悄然阻止,直到有更多内容可用。< / p> 由于RandomAccessFile,
(a)似乎很容易,但我对(b)有点困惑。我可能会破解一些可行的东西,但我想知道是否有一种标准方法来实现它。仔细考虑它会让我觉得我可能会遗漏一些明显的东西。
有什么想法?你们会怎么做?
答案 0 :(得分:2)
如果您可以将数据推送到文件中但不是推送到OutputStream(或者可以同时写入FileOutputStream和其他共享的PipedOutputStream),这将是最简单的解决方案:
使用PipedOutputStream和PipedInputStream。这将允许您实现A和B,但是您需要以某种方式在查看器端实现视频缓冲。
基本上你的下载程序线程会将它获取的每一位数据写入PipedOutputStream。 write()
方法没有阻塞,因为数据被推送到管道的内部缓冲区。
您的查看器主题将只是来自pipedInputStream的read()
,因为这是API所说的内容:This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
答案 1 :(得分:0)
我认为这可能会对您有所帮助:http://www.xuggle.com/xuggler/(尝试查看教程页面)。
答案 2 :(得分:0)
您必须轮询文件的长度。没有办法阻止等待文件的长度单独使用文件进行更改。您可以繁忙轮询,或每10或100毫秒轮询一次。
如果编写器和阅读器处于同一进程中,则可以使用锁定/同步块来在读取更多数据时通知读者。
使用多个进程,您可以使用套接字发送数据,或至少在长度发生变化时通知,以便读取器阻止。
答案 3 :(得分:0)
如果您不控制下载过程,并且想要播放任何下载文件(即使是其他一些下载程序),那么您可以Watch directory for changes。
需要提到的是,这种方法是跨平台和跨文件系统。这是同一篇文章的引用:
大多数文件系统实现都具有对文件更改通知的本机支持。 Watch Service API在可用的情况下利用此支持。但是,当文件系统不支持此机制时,Watch Service将轮询文件系统,等待事件。
答案 4 :(得分:0)
我相信这个问题没有真正的答案。我有一些有用的东西,但它对我来说看起来不合适。也许有时这是不可避免的。