6

我知道在 SO 上已经有一些这样的问题,但它们与在播放文件之前提取文件有关。

在此处的 Android 文档中,它解释说您可以直接从 .zip 文件播放文件而无需解压缩。

提示:如果您将媒体文件打包到 ZIP 中,您可以对带有偏移和长度控件(例如 MediaPlayer.setDataSource()和 SoundPool.load())的文件使用媒体播放调用,而无需解压缩 ZIP。为了使其正常工作,您在创建 ZIP 包时不得对媒体文件执行额外的压缩。例如,使用 zip 工具时,应使用 -n 选项指定不应压缩的文件后缀:

zip -n .mp4;.ogg main_expansion media_files

我制作了一个(未压缩的)zip 包,但我不知道如何从 aZipEntry到 a FileDescriptor,他们也没有进一步解释。如何在FileDescriptor不解压缩 zip 文件的情况下获得一个?

4

4 回答 4

4

即使您的应用中没有使用 APK 扩展,您也可以使用APK 扩展 Zip 库来执行此操作。

按照此文档获取库:使用 APK 扩展 Zip 库

使用您最喜欢的压缩工具压缩您的声音文件而不进行压缩。

使用此代码加载音乐:

ZipResourceFile expansionFile = new ZipResourceFile("myZipFile.zip");
AssetFileDescriptor assetFileDescriptor = expansionFile.getAssetFileDescriptor("myMusic.mp3");
try {
    mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor());
    mediaPlayer.prepare();
    mediaPlayer.start();
}
catch (IOException e) {
    // Handle exception
}
于 2014-08-20T11:11:36.870 回答
3

这个问题最近没有很多解决方案,所以我也被困在这个问题上——直到我在试图读取 zip 文件的函数中创建了一个新的 MediaPlayer 实例。突然开始播放没有问题。现在,相反,我将我的(全局)MediaPlayer 传递给这样的函数:(Kotlin)

private fun preparePlayer(mp: MediaPlayer, position: Int) {

    // Path of shared storage
    val root: File = Environment.getExternalStorageDirectory()
    Log.i("ROOT", root.toString())

    // path of the zip file
    val zipFilePath = File(root.absolutePath+"/Android/obb/MY_PACKAGE_NAME/MY_ZIP_FILE.zip")

    // Is zip file recognized?
    val zipFileExists = zipFilePath.exists()
    Log.i("Does zip file exist?", zipFileExists.toString())

    // Define the zip file as ZipResourceFile
    val expansionFile = ZipResourceFile(zipFilePath.absolutePath)

    // Your media in the zip file
    val afd = expansionFile.getAssetFileDescriptor("track_01.mp3")

    // val mp = MediaPlayer()   // not necessary if you pass it as a function parameter
    mp.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
    mp.prepare()
    mp.start()   // Music should start playing automatically

也许这可以帮助别人。祝你好运!

于 2018-10-31T10:15:42.417 回答
1
try {
    ZipFile zf= new ZipFile(filename);
    ZipEntry ze = zip.getEntry(fileName);
    if (ze!= null) {
        InputStream in = zf.getInputStream(ze);
        File f = File.createTempFile("_AUDIO_", ".wav");
        FileOutputStream out = new FileOutputStream(f);
        IOUtils.copy(in, out);
        // play f
    }
} catch (IOException e) {

}

可能重复的问题

于 2013-02-25T04:46:26.850 回答
0

如果您想在不解压缩的情况下使用 zip 中的媒体文件,您还必须将起始偏移量和长度添加到setDataSource.

ZipResourceFile expansionFile = new ZipResourceFile("myZipFile.zip");
AssetFileDescriptor assetFileDescriptor = expansionFile.getAssetFileDescriptor("myMusic.mp3");
try {
    mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),
                              assetFileDescriptor.getStartOffset(),
                              assetFileDescriptor.getLength());
    mediaPlayer.prepare();
    mediaPlayer.start();
}
catch (IOException e) {
    // Handle exception
}
于 2015-08-26T17:47:02.790 回答