MP4解析器版本冲突(压缩视频没有声音)

11

我在我的项目中使用这两个库:

https://github.com/HemendraGangwar/VideoTrimmingLikeWhatsapp https://github.com/fishwjy/VideoCompressor

这两个库都是本地导入到我的项目中的(即将它们复制并添加到项目中)。

这两个库分别单独使用时都能正常工作,但当我同时使用它们时,会出现一些类型为Program type already present的错误。我通过删除第二个库中的isoparser-1.0.6.jar文件来解决这些错误,因为我注意到这两个库都使用了相同的库'com.googlecode.mp4parser:isoparser',但版本不同:第一个库使用1.1.21,第二个库使用1.0.6

当只使用旧的库时,我得到了以下代码:

error: cannot find symbol class FileDataSourceViaHeapImpl

现在它正在工作,但问题是压缩后的输出视频没有声音。我该怎么解决?

这是我用于压缩视频(剪辑后)的代码:

VideoController.getInstance().convertVideo(tmpFile.toString(), dstFile.toString(),
           VideoController.COMPRESS_QUALITY_MEDIUM, null);

编辑1

以下是使用相同视频的几种情况:

VideoTrimmingLikeWhatsapp 1.1.21版本 => 可以使用

VideoTrimmingLikeWhatsapp 1.0.6版本 => 无法使用(缺少类的编译错误)

VideoCompressor 1.1.21版本 => 无法使用(没有声音)

VideoCompressor 1.0.6版本 => 可以使用

我尝试了很多方法,但还是无法解决。我也尝试使用SiliCompressor,它似乎也使用mp4isoparser的1.0.6版本,但出现了同样的问题,输出的视频没有声音。我几天前在这里发布了一个问题,但我认为他们不会很快解决这个问题。

我也在这里提交了问题。

我尝试从这里下载mp4parser的1.1.21版本,并尝试在本地导入它,以便更改包名称,但我无法做到这一点,因为它使用的是Maven而不是Gradle。旧版是一个jar文件,我需要对其进行反编译以便于修改。我能做到吗?

我还尝试使用ffmpeg库,但所有的库都比mp4isoparser工作得慢。

编辑2

SiliCompressor的作者已经回复了我在这里发布的问题,他说该问题现在应该已经解决。目前我无法验证,因为我不再从事该项目。如果有人能确认,请告诉我将答案添加到此主题中。

3个回答

5

这个在Proguard关闭时可以工作,但是在Proguard开启时应用程序会崩溃。您能否分享一下为此添加了哪些Proguard规则? - Nayab

0

如果问题确实是由于库版本引起的,解决起来会很困难。

首先我会再次检查一下。你说你分别测试了这些库并且它们都可以工作,但是,你尝试过将“VideoTrimmingLikeWhatsapp”的输出作为“VideoCompressor”的输入吗?

我怀疑“VideoCompressor”在某些情况下会对音频进行奇怪的处理,这个问题中有人说没有音频:

https://github.com/fishwjy/VideoCompressor/issues/1

如果您使用“VideoCompressor”和他自己的版本的“isoparser”得到了没有声音的视频,您可以排除库版本作为问题源。

然后,我认为您可以:替换“VideoCompressor”:它似乎依赖于Android库来执行压缩,您可以自己实现,或者您可以找到另一个库来完成工作。或者您可以修复“VideoCompressor”:您可以向作者报告问题,或者尝试自己修复。

如果您确认问题是版本冲突:那么我可以想到几个选项,但没有一个是容易的:

  • 您可以尝试使用类加载器并强制每个库使用其正确版本的“isoparser”。这本身可能很难做到,而且在Android中可能会有很多问题。

  • 您可以修补一个版本的isoparser,重命名包名称(例如为com.googlecode.mp4parser_old),以便两个版本可以共存,您还应该修补客户端库以使用新的包名称。这非常丑陋,但似乎可行。

  • 您可以尝试更新“VideoCompressor”以与isoparser-1.1.21兼容。您也可以要求作者这样做。

  • 同样,您可以替换“VideoCompressor”(或者可能是“VideoTrimmingLikeWhatsapp”)

我知道这不是最终答案,但希望能对您有所帮助。


你可以:替换'VideoCompressor',它似乎依赖于Android库来执行压缩,你可以自己实现。如何做到这一点?有任何链接吗?请参见帖子EDIT1以了解我所做的更多内容。 - hiddeneyes02
好的,VideoCompressor是开源的,你可以阅读代码并进行修复或重新实现,但...可能需要大量工作。你面临的问题看起来非常奇怪,请给我一些时间,我将尝试进一步调查。 - fonkap
再次问候,我正在尝试使用VideoCompressor的预期isoparser版本(1.0.6),但生成的视频没有音频!你能提供一个样本视频吗?或者,你能否尝试转换这个视频:https://archive.org/download/Test_Avi/MVI_0043.AVI - fonkap
@fontkap 我尝试使用您的视频,但输出只是一个大小为140B的文件,根本无法播放。这里有一个文件,只有在使用旧版本时才能正常工作 https://drive.google.com/open?id=1jWhzdKUuT8Lb5i8NYlUQF6-3CYRaGD4c - hiddeneyes02
这太奇怪了,这就是我得到的:https://drive.google.com/open?id=1Clw1IXZp1aJK16y-EvjZKwT2TT3ZImAS 一个大小为57kb的小视频,但完全可以播放。我会尝试您的文件。如果对您有用的信息是我使用手机运行示例VideoCompressor应用程序,它是Moto G(XT1072)。 - fonkap

0

虽然已经晚了,但我还是把这个解决方案发出来,希望对其他人有用。

是的,问题在于两个库之间的版本冲突。

解决方案:

  • 完全不要触碰视频压缩库。
  • 将视频剪辑器的“isoparser”依赖项降级到与视频压缩库依赖项“isoparser”相同的版本(1.0.6)。
  • 从TrimVideoUtils.java文件中删除以下行:

    import com.googlecode.mp4parser.FileDataSourceViaHeapImpl;
    

    然后更改以下行:

    Movie movie = MovieCreator.build(new FileDataSourceViaHeapImpl(src.getAbsolutePath()));
    

    Movie movie = MovieCreator.build(src.getAbsolutePath());
    

完成了。

注意:要小心处理大文件,因为此解决方案不使用内存映射。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接