写入视频文件并同时播放
Posted
技术标签:
【中文标题】写入视频文件并同时播放【英文标题】:Writing video file and simultaneously playing it 【发布时间】:2013-05-12 10:41:38 【问题描述】:在我有趣的项目中,我正在从 youtube 下载视频文件,并写入本地磁盘上的文件。同时我也想玩。目的是将文件缓存在本地磁盘上,这样当我想再看视频时,应用程序可以在本地播放,从而节省带宽。
我正在使用Python 3.3.1
、PyQt4/Phonon
和LibVLC。到目前为止,我能够做到以下几点:
给定一个 youtube watch url,我可以下载视频文件并然后使用 PyQt4/Phonon 和 LibVLC 独立播放。它不是流媒体。
由于 LibVLC 支持流媒体,我可以通过流媒体播放给定的 url。
第二个非常接近我想要做的,但是由于它没有将文件保存在磁盘上,所以下次我无法在本地播放相同的视频。
我正在寻找一些关于如何从这里开始的指南。特别是,如何从仍在写入的不完整文件中播放视频。
我完全可以使用任何 API(可以完成这项工作),只要它是:
Python 3.3.1(最好) C C++。如果我当前的方法不正确或使问题比实际更困难,我也在寻找替代方法。
【问题讨论】:
你可能想看看 ffmpeg。它将允许您显示和写入文件。但我不确定如何在 PyOt4 上渲染它。有一个著名的教程dranger.com/ffmpeg 可以开始使用。输入文件可以改为url,而不是从文件中读取。 ffmpeg 是一个相当宽泛的术语,更具体地说,您需要查看libav 及其libavcodec(用于解码解复用流)和libavformat(用于解复用流)组件. libav 的 download page、win64 nightlies download page、documentation 和 examples。 我已经设法用 GStreamer 做了类似的事情。它有一个tee 元素,可用于将管道拆分为多个输出通道。 @StackedCrooked:你能详细说明一下吗? @Nawaz 很抱歉,但解释起来并不简单。您应该阅读 GStreamer 手册的前 10 章以获得基本概念。 (别担心,这只需要 30 分钟左右。) 【参考方案1】:VLC 支持播放不完整的文件,因此,如果您需要一些非阻塞 I/O 和/或并行代码,您应该能够开始下载,并且在写入足够多的文件后,使用LibVLC 开始播放。根据使用的压缩算法,您可能需要足够的缓冲,以便缓冲区中始终保留几秒钟的数据——如果我没记错的话,一些更现代的算法会记录前后的增量和索引信息。
您可能会收到一些警告/错误消息/异常,但我不会认为它们是致命的——让播放质量成为您的指南!
这和上面cmets的一些建议有些相似,也和@abarnert说的很多有关,在较小程度上和@StackedCrooked的一些交流有关。
【讨论】:
这种方法安全吗?我的意思是如果缓冲比 VLC 播放器的消耗速度慢,那么很快就没有缓冲并且播放器将停止。如果几秒钟内有更多缓冲区,它会恢复播放吗? @Nawaz 从安全的角度来看应该是安全的——VLC 必须能够处理流式传输和损坏的文件,并且不完整的文件最终是损坏的文件。更一般地说,缓冲问题是无论如何你都会遇到的问题。我不确定 VLC 是否会自行恢复播放,但假设 libVLC 抛出异常或过早终止播放,您可以缓冲并从最后一个已知的良好位置恢复播放(这意味着如果它是,您将必须跟踪位置不包括在例外中。)最简单的解决方案当然是最初缓冲更多。 听起来很合理。 +1 :-)(顺便说一句,如果您编辑答案会很好,添加您在评论中所说的内容以回应我的评论)。以上是关于写入视频文件并同时播放的主要内容,如果未能解决你的问题,请参考以下文章