视频压缩后silicompressor没有声音

Silicompressor no sound after video is compressed

我一直在毫无问题地压缩图像。最近我的应用程序需要添加视频压缩功能。同样,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,现在可以使用了”。谁能帮我解决这个问题?

所以回答我自己的问题。在这方面没有得到太多帮助,因此决定将库切换到 FFmpeg.

Gradle

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();
    }
}

现在声音完美无缺。