我在项目中使用了这两个库:
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相比,它们所有的工作都非常慢
答案 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)
为时已晚,但我将此解决方案发送给他人使用。
是的,问题在于两个库之间的版本冲突。
解决方案:
从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'
}