首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法在Exoplayer中播放android扩展文件OBB中的OGG音频文件

ExoPlayer是一个开源的Android媒体播放器库,它提供了强大的功能和灵活的定制选项。然而,ExoPlayer默认情况下不支持直接播放存储在Android OBB扩展文件中的OGG音频文件。为了在ExoPlayer中播放这些文件,我们需要进行一些额外的步骤。

首先,我们需要将OGG音频文件从OBB扩展文件中解压出来。Android提供了一个名为APKExpansionSupport的类,可以帮助我们访问OBB扩展文件。我们可以使用该类的getAPKExpansionZipFile()方法获取到OBB文件的ZipResourceFile对象,然后使用ZipResourceFile对象的getInputStream()方法获取到OGG音频文件的输入流。接下来,我们可以将输入流写入到应用程序的本地存储中,例如内部存储或外部存储。

一旦我们将OGG音频文件解压到本地存储中,我们可以使用ExoPlayer来播放它。首先,我们需要创建一个MediaSource对象,用于指定要播放的媒体文件。对于OGG音频文件,我们可以使用ProgressiveMediaSource类,并将解压后的本地文件路径传递给它。然后,我们可以将MediaSource对象传递给ExoPlayer的prepare()方法进行准备。最后,我们可以调用ExoPlayer的setPlayWhenReady()方法开始播放音频。

以下是一个示例代码,演示了如何在ExoPlayer中播放存储在Android OBB扩展文件中的OGG音频文件:

代码语言:txt
复制
// 导入所需的类
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.upstream.FileDataSourceFactory;
import com.google.android.exoplayer2.upstream.ZipResourceFile;

// 获取OBB扩展文件的ZipResourceFile对象
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, mainVersion, patchVersion);
// 获取OGG音频文件的输入流
InputStream inputStream = expansionFile.getInputStream("path/to/ogg/file.ogg");
// 将输入流写入本地存储
File outputFile = new File(context.getFilesDir(), "file.ogg");
OutputStream outputStream = new FileOutputStream(outputFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();

// 创建ExoPlayer实例
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context);
// 创建数据源工厂
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(context, "user-agent");
// 创建媒体源
ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
        .createMediaSource(outputFile.toUri());
// 准备播放器
player.prepare(mediaSource);
// 开始播放
player.setPlayWhenReady(true);

在上述示例代码中,我们首先使用APKExpansionSupport类获取到OBB扩展文件的ZipResourceFile对象。然后,我们使用该对象的getInputStream()方法获取到OGG音频文件的输入流,并将其写入到应用程序的本地存储中。接下来,我们创建了ExoPlayer的实例,并使用DefaultDataSourceFactory类创建了数据源工厂。然后,我们使用ProgressiveMediaSource.Factory类创建了媒体源,并将解压后的本地文件路径传递给它。最后,我们调用了ExoPlayer的prepare()方法准备播放器,并调用了setPlayWhenReady()方法开始播放音频。

这是一个基本的示例,你可以根据自己的需求进行定制和扩展。希望对你有帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在Android开发中如何使用OpenSL ES库播放解码后的pcm音频文件?

支持pcm数据的采集和播放 支持播放的音频数据来源广泛,res、assets、sdcard、在线网络音频以及代码中定义的音频二进制数据   和Android提供的AudioRecord和AudioTrack...因为AudioRecord和AudioTrack都是Android提供的Java API,无论是采集还是播放音频,都需要将音频数据从java层拷贝到native层,或从native层拷贝到java层,这无疑是十分消耗资源的...如果希望减少拷贝,开发更加高效的Android音频应用,则建议使用Android NDK提供的OpenSL ES API接口,它支持在native层直接处理音频数据。...link to the target library android log OpenSLES )   在java层只需获取到要播放的pcm...absolutePath+File.separator+"input.pcm" playPcmBySL(pcmPath)   需要注意的是,pcm文件可以通过使用ffmpeg解码mp3文件得到,但是在解码的时候需要注意的是

22710

使用 FPGA 播放 SD 卡中的音频文件

使用 FPGA 播放音频(一) 这篇重点:如何从 SD 卡读取音频文件并将其输出到扬声器上。 开篇第一步 在上一篇教程中,创建了一个 I2S 发送器用来发送来从FPGA内部 ROM 的音频数据。...设计中必须实现以下组件: 用于为 I2S 发送器创建输入时钟的时钟预分频器 AXI-Stream 从接口 I2S发送器的控制逻辑‌ 为分频器创建了一个过程,该过程在MCLK时钟上升沿对计数器进行计数,并在半个周期后切换信号...输出时钟可以通过 AXI-Lite 接口适应音频文件的采样率。 AXI-Stream FIFO 充当处理系统和 I2S 发送器之间的链接。...读取 SD 卡需要 Xilinx 的 xilffs FAT 库,该库必须集成到 Vitis 项目的板级支持包中(不要忘记启用LFN支持大文件名的选项): 第一步,软件使用该AudioPlayer_Init...当从处理系统到 FIFO 的传输完成时,会触发TC中断(传输完成),并从 SD 卡读取下一个数据块。之后重复进行上面步骤,直到文件完全播放。

28810
  • 4款知名播放器比较:ijkPlayer、VLC、SmartPlayer、ExoPlayer

    ,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。...]支持播放过程中,实时静音/取消静音; [实时音量调节]支持播放过程中实时调节音量; [实时快照]支持播放过程中截取当前播放画面; [只播关键帧]Windows平台支持实时设置是否只播放关键帧;...ExoPlayer ExoPlayer 是google推出的开源播放器,主要是集成了Android 提供的一套解码系统来解析视频和音频,将MediaCodec封装地非常完善,形成了一个性能优越,播放稳定性较好的一个开发播放器...; VLC对点播的支持比较好,但是工程庞大,接入或二次开发难度比较大; SmartPlayer对RTSP和RTMP直播播放支持非常优秀,毫秒级延迟,稳定性比较好; ExoPlayer不太适合直播,视频解码无法接入软解...,可扩展性一般,而且只支持Android平台。

    8.7K70

    ExoPlayer播放音视频的使用介绍

    ExoPlayer是一款开源的应用级媒体播放器,基于Android的低级媒体API构建。本指南描述了ExoPlayer库及其使用。它是指ExoPlayer的主要演示应用程序中的代码,以提供具体的示例。...更少的设备特定问题以及不同设备和Android版本的行为差异更小。 在Android 4.4(API级别19)及更高版本上支持Widevine通用加密。 您可以根据使用情况来自定义和扩展播放器。...(1)将ExoPlayer添加为依赖项 入门的第一步是确保您的项目根目录中的build.gradle文件中包含JCenter和Google存储库。...有关详细信息,请浏览 扩展目录 及其各自的README文件。 (2)创建播放器 您可以使用ExoPlayerFactory创建一个ExoPlayer实例。...(1)从侧面加载字幕文件 给定一个视频文件和一个单独的字幕文件,可以使用 MergingMediaSource 将它们合并到单个播放源中。

    6.5K20

    在PHP中操作文件的扩展属性

    在PHP中操作文件的扩展属性 在操作系统的文件中,还存在着一种我们可以自己定义的文件属性。这些属性不是保存在文件内容中,也不是直接可以通过 ls -al 所能看到的内容。...它们可以将一个键值对信息永久得关联到文件上,一般现在的 Linux 系统都支持这样的文件扩展属性的功能。在操作系统中我们可以通过 setfattr、 getfattr、 attr 这些命令来操作它们。...配合上面的 xattr_list() 函数就可以获取某个文件的所有扩展属性信息。如果我们不增加 XATTR_ROOT 参数的话,是无法读取到 root命名空间 中的内容的。...总结 今天的内容非常地简单浅显,这个文件的扩展属性的功能说实话也是看到 PHP 中有这个功能扩展才回去查看了 Linux 系统中的相关文档。...测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/9.在PHP中操作文件的扩展属性.php 参考文档

    2.2K20

    Android 音频播放速率调整实现

    MediaPlayer 播放音频最先想到的就是MediaPlayer这个Android提供的原生API了,在Android 6.0+(23+)MediaPlayer可以通过setSpeed来改变播放速率...在代码中,我们需要: // 设置音乐播放速度 public static void changeplayerSpeed(float speed) { if (mPlayer == null...以前,需要另想办法处理,后续查到好的方法再补充 } } 实际实现过程中 ,我发现手上的测试机Honor V9执行该操作后 ,播放静默了 ,不仅没有实现播放速率的切换,播放也不能恢复。...实际实现过程中 ,seekTo正常,播放速率切换也正常(只是在切换到慢速0.5x的时候存在重音的情况),但是播放不了https开头url的音频文件,搜索了一下需要自己编译ijkplayer源码以支持https...表现正常,而且切换播放速率时,没有重(chong)音的情况,但没有在6.0以下的设备上测试过。

    1.2K10

    ExoPlayer 多路流切换

    这种播放器只能使用重启播放器方式实现码流切换。ExoPlayer作为开源播放器,具备很好的可扩展性,既支持DASH/HLS切换,同时也支持解码器重启方式的切换。...所谓多路流是指播放过程中,存在多个I/O相关的媒体资源。对于常见的Mp4而言,一般来说既包括音频轨道,又包括视频轨道,在解封装之后,一路进入音频渲染器中,一路进入视频渲染器中,属于典型的两路流。...而ExoPlayer本质上是支持多路流的,可以同时支持多个Mp4、多个音频文件、多种语言版本的歌词。...四、对齐 4.1 对齐流程 本文所说的对齐和DASH、HLS有本质的区别,不存在切片,但是仍然要解决对齐问题,在ExoPlayer中对齐的过程中并没有直接去调用seek方法对齐,而是通过SeekPoint...的开始位置,也是IDR帧的位置(IDR帧是I帧的一种);一般来说Mp4 文件头部有moov信息,从采样表(sample table)中可以查找出关键帧和关键帧所映射的文件位置信息,采样表会在起播阶段完成解析

    1.4K31

    音视频开发之旅(44)-ExoPlayer介绍及简单使用

    ExoPlayer 支持基于 HTTP 的动态自适应流 (DASH)、SmoothStreaming 和通用加密、以及可以很好的支持播放队列、播放源的无缝切换等功能。它采用易于自定义和扩展的设计。...ExoPlayer没有设定可以播放的媒体类型、存储方式以及渲染方式,也没有直接实现加载和播放。而是在播放器被创建或者准备播放时将这些工作代理给注册的组件来实现。...在我们的日常项目开发中,开发一个组件 从易用性和以扩展性方面考虑,既要保证使用者很容易上手使用(提供一套默认实现),又要有方便使用者根据自己的场景进行方便的扩展的能力。...STATE_ENDED: 播放完了所有的资源后处于改状态 二、ExoPlayer的简单使用 这一小节我们学习实践ExoPlayer的使用 2.1 AS中引入library ExoPlayer有很好的扩展性和可定制性...,Mainfest中静态注册后,在requesetPermission中动态的请求下。

    7.9K00

    HTML音频操作

    HTML5 在浏览器中播放音频     如视频播放一样,在HTML5出现之前我们要想在浏览器中播放音频,没有一个官方浏览器遵循的播放标准(也就是没有提供一个可以专门来处理音频的HTML标签),我们依然需要使用适用于各种浏览器的音频播放插件才可以...HTML5 正式发布后,他给我们提供了处理音频的标准方法:audio 标签,我们可以通过 audio 标签处理音频文件;audio 标签能够播放声音文件或者音频流,遗憾的是当今的主流浏览器任然没有完全兼容他...Audio 标签,无法播放此音频 在上面的其他例子中我们只是使用一个 Ogg 音频文件格式,这种格式目前只兼容 Firefox、Opera 以及 Chrome 浏览器。...HTML5 Audio 标签的属性 属性名 属性值 描述 autoplay autoplay 如果使用该属性,则音频文件在加载就绪后马上播放 controls controls 如果使用该属性,则向用户显示一些控制控件...,比如:播放按钮、暂停按钮等 loop loop 如果使用该属性,则每当音频文件播放结束时,会重新开始重复播放 preload preload 如果使用该属性,则音频文件在页面加载时进行加载,并预先准备播放

    2.1K30

    【HTML5】HTML5 多媒体标签 ① ( audio 音频标签 | 音频标签常见属性值设置 | 音频标签默认代码设置 | 音频标签设置多种类型音频文件 )

    / mp3 ; Safari 3.0 : mp3 / wav ; 可以在 音频标签 中 放 ogg 和 mp3 两种格式的标签 , 所有的浏览器都可以播放音频 ; audio 标签常用属性...不同的播放器 , 显示的操作空间是不同的 , 风格无法做到统一 ; loop 属性 : 值为 loop , 音频循环播放 ; 设置 loop="loop" 就会循环播放 ; 三、音频标签代码示例...ogg 格式的音频文件 ; 如果浏览器支持 ogg 就播放该 ogg 文件 ; 如果不支持 ogg 格式 , 则继续读取下一行 ; 第三个 source 标签 配置的是 wav 格式的音频文件 ;...mp3 就播放该 mp3 文件 - 如果不支持 mp3 格式 , 则继续读取下一行 第二个 source 标签配置的是 ogg 格式的音频文件...- 如果浏览器支持 ogg 就播放该 ogg 文件 - 如果不支持 ogg 格式 , 则继续读取下一行 第二个 source 标签配置的是 wav 格式的音频文件

    5.9K40

    YouTube开源播放器中文使用指南

    贰·ExoPlayer的优缺点 优点 在不同Android版本和不同的手机设备上拥有更统一的行为表现,更少的设备差异带来的问题。 作为一个独立的库,可以很轻易的升级。...可以根据用户的需求方便的对播放器行为进行定制和扩展,ExoPlayer中的很多组件都支持自定义和扩展。 支持播放视频列表,并且可以支持对视频的裁剪、合并,以及循环播放设置。...添加ExoPlayer的依赖 首先我们要保证在项目根目录的build.gradle中包含Google和JCenter仓库: repositories { google() jcenter...() } 在app module的build.gradle中添加对ExoPlayer的依赖: implementation 'com.google.android.exoplayer:exoplayer...我们可以直接在我们的布局文件中引用PlayerView。

    4K20

    HTML5 标签audio添加网页背景音乐代码

    HTML5 Audio标签能够支持wav, mp3, ogg, acc, webm等格式,但有个很重要的音乐文件格式midi(扩展名mid)却在各大浏览器中都没有内置的支持(详见此处)。...不是所有的浏览器都支持MP3 OGG之类的,每个浏览器因为版权的问题支持的格式都是不一样的。  浏览器和音频兼容性 浏览器制造商并非都同意使用某种音频文件格式。...对于图像,PNG、JPEG 或 GIF 格式的文件在任何浏览器上都能加载到您的网页里。遗憾的是,音频文件并非如此。表 1 展示了网页中可以使用的音频文件格式,但是并非所有格式都能用于所有浏览器。...支持 不支持 支持 不支持 没有一种通用的文件格式让每个浏览器都使用单个文件格式意味着至少有 2/5 的浏览器无法播放某些声音。...这不是无法在单一音频标准中达成一致的浏览器制造商不妥协的问题,而是涉及专利权和特许权使用费的法律和财务问题。不受软件专利限制的 OGG 格式旨在一劳永逸地解决这个问题。

    11.4K31

    FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址

    引入ExoPlayer播放RTMP直播流的集成步骤说明如下。...一、修改build.gradle打开APP模块的build.gradle,在dependencies节点内部补充以下的导包配置:implementation 'com.google.android.exoplayer...的主包,还导入了rtmp的扩展包。...二、修改播放代码支持RTMP流ExoPlayer的详细用法参见《Android Studio开发实战:从零基础到App上线(第3版)》一书第14章的“14.3.3  新型播放器ExoPlayer”,其中与...三、调整SRS的配置文件通过小程序或者ExoPlayer播放RTMP直播流时,可能出现播放界面黑屏,但有声音传出的情况。这是因为SRS默认没有缓存关键帧,使得拉流一开始没找到关键帧就黑屏了。

    18110

    Android主流播放器比较

    本篇文章主要介绍 Android 原生 VideoView,Google 开源视频播放框架 ExoPlayer,Vitamio 视频播放框架以及 Bilibili 开源视频播放框架 ijkplayer...VideoView 的使用非常简单,播放视频的步骤: 在界面布局文件中定义 VideoView 组件,或在程序中创建 VideoView 组件 调用 VideoView 的如下两个方法来加载指定的视频:...支持高级的 HLS 特性,例如正确处理 EXT-X-DISCONTINUITY 标签; 支持自定义和扩展,ExoPlayer 专门为此设计; 便于随着 App 的升级而升级。...因为 ExoPlayer 是一个包含在你的应用中的库,对于你使用哪个版本有完全的控制权,并且你可以简单的跟随应用的升级而升级; 更少的适配性问题。...2.在 Activity 的 onCreate 方法中添加如下代码,初始化 Vitamio 的解码器 @Override public void onCreate(Bundle icicle) {

    3K20

    Ijkplayer、ExoPlayer、VLC播放器综合比较

    modules供开发者二次开发; 2.ijkplayer 官方维护力度小,版本更新很慢; ExoPlayer ExoPlayer 是google推出的开源播放器,主要是集成了Android 提供的一套解码系统来解析视频和音频...; 优点: 1.接入包小,1.1M; 2.维护团队强大,更新速度快; 缺点: 1.不太适合直播; 2.视频解码无法接入软解,可扩展性一般; 3.适合播放场景简单的项目,播放过程中无切换码流的情况; --...-- ExoPlayer 会替代MediaPlayer成为Android平台上的默认播放器吗?...目前还是一个小而轻的播放器,如果要合成到系统中,它需要调整的东西太多,代码量会变得很繁杂,很可能得不偿失; 综合分析 对于Android 团队在播放器选型这一块,我觉得根据情况选择ijkplayer或者...exoplayer; 如果你的播放场景比较简单,播放的视频源比较单一,例如短视频,建议选择exoplayer; 如果你的播放场景比较复杂,有直播场景,特别是涉及到播放过程中码流的切换,还是选择ijkplayer

    8.7K20

    音视频开发之旅(45)-ExoPlayer 音频播放器实践(一)

    在设计音乐播放器APP架构时,有几种常用的做法 方案一 注册Service,用于数据设置、音乐控制,在Service中自定义播放器的一些状态值和回调接口用于流程控制 通过广播、aidl等实现和页面层逻辑的通信...APP媒体会话 方案二 Android5.0时推出的MediaSession框架(Supprot包中MediaSessionCompat也对低版本做了支持),专门用来解决媒体播放时界面和Service通信的问题...也包含媒体播放器实例(比如我们本篇实践的ExoPlayer) MediaSession 一般在MediaBrowserService的onCreate中创建,通过MediaSession.CallBack...Activity直接和Service通过MediaSession框架中的各种回调进行通信,播放器ExoPlayer封装在Service内,数据的获取也在Service中。...这明显和真实的场景有差异。 另外播放管理相关的没有分离,播放队列的维护,播放状态的管理等等没有统一的管理,不利于扩展扩展更换播放器等。

    5.4K00

    FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题

    即使不用VLC播放器,直接在Qt工程的C++代码中调用FFmpeg的API,也能访问ZLMediaKit的直播地址,并正常渲染视频画面。...根据该书的操作步骤,在APP工程的JNI代码中调用FFmpeg的API,也能正常播放ZLMediaKit的直播画面。...但是如果手机APP不走FFmpeg,通过其他途径访问直播地址之时,却发现无法播放ZLMediaKit的HLS直播地址http://124.***.***.***:8080/live/test/hls.m3u8...无论采用谷歌官方的ExoPlayer,还是采用微信小程序的video标签,都播放不了ZLMediaKit的HLS视频。...那么修改HttpFileManager.cpp里的accessFile函数,把这里的401鉴权代码注释掉,并将修改后的代码文件上传到Linux服务器。

    23810

    Python的playsound介绍

    Python的playsound介绍 在Python中,有许多库可以用来处理音频文件和播放音频。其中一个常用的库是playsound,它提供了一种简单而直观的方法来播放音频文件。...这将导致playsound库在播放音频文件时启动一个新的进程。...但是,请注意不同平台上可能需要安装不同的音频解码器或依赖库,以确保能够正确播放音频文件。 阻塞式播放:playsound库默认以阻塞式的方式播放音频文件,这意味着在播放音频期间,代码将会停止执行。...下面是一个实际应用场景的示例代码,演示了如何使用playsound库在Python中播放音频文件。 假设你正在写一个Python程序,需要在用户执行某些操作时播放一些提示音效。...这些库提供了更多的音频处理功能,例如音频剪辑、音频格式转换、音频录制等。它们也可以用来实现在Python中播放音频文件的功能。

    84820

    Android ExoPlayer 音画同步代码分析

    ExoPlayer 中,Audio Master实现中有两个核心类:com.google.android.exoplayer2.audio.AudioTrackPositionTracker和com.google.android.exoplayer2...在 ExoPlayer 中 com.google.android.exoplayer2.audio.BaseRenderer#getMediaClock 方法是空实现,但是在子类中视频依然返回 null...MediaClock 是ExoPlayer中播放进度重要组件,核心逻辑只有两个,一个是调节播放倍速,另一个是获取播放时间。...,在ExoPlayer中,自定义的MediaClock基本上很难从外部传入,那么,如果想在外部传入自定义的MediaClock怎么实现呢 ?...在有些业务中的音频输出和ExoPlayer是分开的,我们要考虑如何通过音频播放器去同步ExoPlayer中的视频渲染器,但有ExoPlayer具备高度的可扩展性,我们可以通过自定时钟的方式去同步ExoPlayer

    1.5K20
    领券