【问题标题】:Silicompressor no sound after video is compressedSilicompressor 视频压缩后没有声音
【发布时间】:2021-02-27 18:54:49
【问题描述】:

我一直在压缩图像,没有任何问题。最近我的应用需要添加视频压缩功能。同样,Silicompressor 完成了这项工作,但由于某种原因,输出文件中没有音频。

我在 Runnable 中使用代码

String videoUriStr; // Passed as a variable

String folderPath = activity.getExternalFilesDir("/").getAbsolutePath() + "/My Folder";
String videoPath = SiliCompressor.with(context).compressVideo(videoUriStr, folderPath);

我可以播放没有声音的压缩视频(尽管在上传到 Firebase 存储时,网址显示黑屏但视频长度正确。但我会弄清楚的)。我主要关心的是声音。

我在 google 上搜索了很多,发现了 2 个解决方案,其中第二个似乎很有希望,但正在寻找实现它的方法。

首先是将implementation 'com.googlecode.mp4parser:isoparser:1.1.22'降级为implementation 'com.googlecode.mp4parser:isoparser:1.0.6',这样不行。

第二个,我发现 here,说“问题似乎与音频编码器有关,我将音频编码器更改为 HE_AAC,它现在可以工作了”。谁能帮我解决这个问题?

【问题讨论】:

    标签: android compression


    【解决方案1】:

    所以回答我自己的问题。在这方面没有得到太多帮助,因此决定将库切换到 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();
        }
    }
    

    现在声音效果完美。

    【讨论】:

    • 嗨@Dev Chauhan 实现了相同但未成功的输出。是“originalFileUriStr”字符串。我正在从相机中获取输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多