我一直在压缩图像,没有任何问题。最近我的应用需要添加视频压缩功能。同样,Silicompressor 完成了这项工作,但由于某种原因,输出文件中没有音频。
我在 Runnable 中使用代码
String videoUriStr; // Passed as a variable
String folderPath = activity.getExternalFilesDir("/").getAbsolutePath() + "/My Folder";
String videoPath = SiliCompressor.with(context).compressVideo(videoUriStr, folderPath);
我可以无声地播放压缩视频(虽然在上传到 firebase 存储时,url 显示黑屏但视频长度正确。但我会弄清楚的)。我最关心的是声音。
我在谷歌上搜索了很多,找到了 2 个解决方案,其中第二个似乎很有希望,但正在寻找实现它的方法。
首先是将 implementation 'com.googlecode.mp4parser:isoparser:1.1.22'
降级为 implementation 'com.googlecode.mp4parser:isoparser:1.0.6'
,这不起作用。
第二个,我找到了 here,它说“问题似乎出在音频编码器上,我将音频编码器更改为 HE_AAC,它现在可以工作了”。可以请任何人帮助我吗?
答案 0 :(得分:0)
所以回答我自己的问题。在这方面没有得到太多帮助,因此决定将库切换到 FFmpeg。
摇篮
implementation 'com.writingminds:FFmpegAndroid:0.3.2'
加载库:
FFmpeg fFmpeg;
private void LoadFfmpegLibrary(){
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy_hh-mm", Locale.CANADA);
Date now = new Date();
String videoFileName = "Video-" + formatter.format(now) + ".mp4";
if(fFmpeg == null){
fFmpeg = FFmpeg.getInstance(context);
try {
fFmpeg.loadBinary(new LoadBinaryResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onFailure() {
}
@Override
public void onSuccess() {
}
@Override
public void onFinish() {
Compress(videoFileName);
}
});
} catch (FFmpegNotSupportedException e) {
e.printStackTrace();
}
} else {
Compress(videoFileName);
}
}
然后压缩视频
private void Compress(String fileName){
String outputPath = getExternalFilesDir("/").getAbsolutePath() + "/My Folder/" + fileName;
String[] commandArray;
commandArray = new String[]{"-y", "-i", originalFileUriStr, "-s", "720x480", "-r", "25", "-vcodec", "mpeg4", "-b:v", "300k", "-b:a", "48000", "-ac", "2", "-ar", "22050", outputPath};
final ProgressDialog dialog = new ProgressDialog(activity);
try {
fFmpeg.execute(commandArray, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
dialog.setMessage("Compressing... please wait");
}
@Override
public void onProgress(String message) {
Log.e("FFmpeg onProgress? ", message);
}
@Override
public void onFailure(String message) {
Log.e("FFmpeg onFailure? ", message);
}
@Override
public void onSuccess(String message) {
Log.e("FFmpeg onSuccess? ", message);
}
@Override
public void onFinish() {
Uri compressedOutputUri = Uri.fromFile(new File(outputPath));
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
e.printStackTrace();
}
}
现在声音完美无缺。