在 Android 应用程序开发中预加载或预缓冲 .mp4 视频

Posted

技术标签:

【中文标题】在 Android 应用程序开发中预加载或预缓冲 .mp4 视频【英文标题】:Pre-Load or Pre-Buffer .mp4 video in android app development 【发布时间】:2011-11-05 14:43:32 【问题描述】:

我正在构建一个在ButtonClick 上成功显示MP4 视频文件的应用程序。我想预缓冲或预加载视频的 URI(远程 url),以便在单击按钮后不会延迟视频的播放。我希望它立即单击并播放,因此在应用启动启动屏幕上预加载或缓冲似乎是一个合适的解决方案。唯一的问题是我不知道怎么做。我有大量的 android 书籍,但几乎没有一本涉及缓冲,或者它们只涉及音频。

谁能告诉我如何缓冲以前活动的视频?

谢谢。

【问题讨论】:

您只想缓冲一部分视频吗?如果没有,您可以将 MP4 下载到闪存中,然后像文件一样播放。 不确定,但您是否尝试调用 start 然后立即调用 pause 或 stop? 您找到解决方案了吗? 【参考方案1】:

Google 发布 ExoPlayer,提供更高级别的媒体播放:http://developer.android.com/guide/topics/media/exoplayer.html

它支持不同的状态,例如在后台缓冲:

// 1. Instantiate the player.
player = ExoPlayer.Factory.newInstance(RENDERER_COUNT);
// 2. Construct renderers.
MediaCodecVideoTrackRenderer videoRenderer = …
MediaCodecAudioTrackRenderer audioRenderer = ...
// 3. Inject the renderers through prepare.
player.prepare(videoRenderer, audioRenderer);

我在自己的项目中使用它,它看起来非常有效。谷歌还制作了播放器的完整演示:https://github.com/google/ExoPlayer/tree/master/demo/src/main/java/com/google/android/exoplayer/demo/full,比简单演示更强大。

【讨论】:

感谢雨果的回答。我想创建一个视频播放列表应用程序。视频将通过 IP 传输。我希望每个视频之间的过渡是即时的。在视频播放完毕之前,我想预缓冲即将播放的下一个视频。我应该使用 Exoplayer 的两个实例吗?这可能吗?你会推荐这种方法吗? 我不相信 exoplayer 支持很多实例,但我确信应该有办法做到这一点。我你考虑使用 ExoPlayer,你可以在 github 上打开一个问题:github.com/google/ExoPlayer 如何使用此播放器预加载视频? @user1974368 player.prepare(...) 如答案所述即可。【参考方案2】:

您可以使用 MediaPlayer 来准备视频,如下所示:

mediaPlayer = new MediaPlayer();
mediaPlayer.setAudiostreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(<implementation of MediaPlayer.OnPreparedListener>);

mediaPlayer.setDataSource(dataSource);
mediaPlayer.prepareAsync();

调用prepareAsync() 后,媒体播放器将缓冲您的视频。 MediaPlayer.OnPreparedListener.onPrepared() 将告诉您媒体播放器是否已准备好播放。

只需检查准备好的标志并在单击按钮“onButtonClick”时调用mediaplayer.start()

【讨论】:

感谢您的回答。我想创建一个视频播放列表来预缓冲即将播放的视频。我应该为此使用 2 个 MediaPlayers 吗?我希望每个视频之间的过渡是即时的。我正在考虑在两名球员之间交替进行。你会推荐这种方法吗? 您可以采用这种方法,也可以创建一个“Preload Helper”类,为即将上传的视频预先下载。 如果视频 A 正在播放并且我将数据源设置为视频 B 并调用 prepareAsync(),那会停止在 mediaPlayer 中运行视频 A 吗?通过 Preload Helper 类,会使用第二个 mediaPlayer 吗?另外,你对使用新的 ExoPlayer android 类有什么想法?谢谢! 调用stop()停止视频A,然后将数据源设置为B并调用prepareAsync()。 Preload Helper 类我的意思是你创建一个类,在后台预下载即将播放的视频。准备就绪后,将媒体播放器源设置为预下载的文件。【参考方案3】:

原生 Android 浏览器不缓冲媒体文件(音频或视频),因此在 HTML5 上无法做到这一点。正如@bradenV2 所说,您可以将文件复制到内存(如果它是应用程序,您可以使用 Phonegap)。

【讨论】:

以上是关于在 Android 应用程序开发中预加载或预缓冲 .mp4 视频的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中预加载网页(使用 WebView?)

使用“预加载”链接指令在 Chrome 中预加载字体

NSBundle 中预加载内容的 iOS 存储问题以及来自 API 的增量更新

在 Flutter 应用中预加载(所有)图像资源

在 reactjs 组件中预加载数据

在 swift 3 中启动应用程序时,如何在另一个 ViewController 中预加载 UIWebView?