mp4parser版本冲突(压缩的视频没有声音)

时间:2018-07-30 13:27:20

标签: java android mp4parser conflicting-libraries

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

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

仅使用旧库时,我得到以下代码:

  

错误:找不到符号类FileDataSourceViaHeapImpl

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

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

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

EDIT1

在这里用相同的视频总结场景:

  

带有版本1.1.21的VideoTrimmingLikeWhatsapp =>可以

     

版本为1.0.6的VideoTrimmingLikeWhatsapp =>不起作用(编译缺少类的错误)

     

具有1.1.21 =>的VideoCompressor不起作用(无声音)

     

具有1.0.6的VideoCompressor =>工作

我尝试了很多事情,并且在这里失去了足迹。我还尝试使用SiliCompressor,似乎也使用了mp4isoparser的1.0.6版本,并且发生了相同的问题,输出的视频没有声音。我几天前发布了一个here问题,但我认为他们不会很快解决。

我还提交了here

我尝试从here下载mp4parser版本1.1.21,并尝试在本地导入它,以便更改包名称,但是我不能,因为它使用Maven而不是{{1 }}。旧版本是Gradle文件,我需要对其进行反编译,以便将其弄乱。我可以这样做吗?

我也尝试使用jar库,但是与mp4isoparser相比,它们所有的工作都非常慢

3 个答案:

答案 0 :(得分: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”)

我知道这不是绝对的答案,但希望对您有所帮助。

答案 1 :(得分:0)

为时已晚,但我将此解决方案发送给他人使用。

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

解决方案:

  • 完全不要接触视频压缩器库。
  • 将视频微调程序的“ isoparser”依赖项降级为具有视频压缩器库依赖项“ isoparser”的相同版本(1.0.6)。
  • 从TrimVideoUtils.java文件中删除以下行:

    @Value

    然后更改以下行:

    import com.googlecode.mp4parser.FileDataSourceViaHeapImpl;
    

    收件人

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

完成了。

注意:注意大文件。因为此解决方案不使用内存映射。

答案 2 :(得分:0)

此组合对我有用:

implementation 'com.iceteck.silicompressorr:silicompressor:2.2.3'
implementation ('com.googlecode.mp4parser:isoparser:1.0.6') {
         exclude group: 'org.aspectj', module: 'aspectjrt' 
}

信用至:DataFrame.all https://github.com/AndreyAsadchy