android - 使用 ffmpeg-android 连接视频文件

标签 android ffmpeg android-ffmpeg

我正在使用 ffmpeg-android连接两个视频文件,但连接时间太长,我猜是因为使用 "-filter_complex" 但这是我在互联网上找到的唯一命令,请有人简化以下命令吗?我只想连接由 camera2 api 捕获的两个视频文件,无需任何修改。

 String command[] = new String[]{
                        "-y",
                        "-i", firstPath,
                        "-i", secondPath,
                        "-strict",
                        "experimental",
                        "-filter_complex",
                        "[0:v]scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih)," +
                                "pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih)," +
                                "pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
                        "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264", "-crf", "27", "-q", "4", "-preset", "ultrafast", getVideoFilePath(getActivity())};
                commandFFMPEG(command);


 private void commandFFMPEG(String command[]) {
        FFmpeg ffmpeg = FFmpeg.getInstance(getActivity());
        try {
            ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {

                @Override
                public void onStart() {
                    startTime = System.currentTimeMillis();
                }

                @Override
                public void onProgress(String message) {

                }

                @Override
                public void onFailure(String message) {

                }

                @Override
                public void onSuccess(String message) {
                    long endTime = System.currentTimeMillis();
                    long result = endTime - startTime;
                    Toast.makeText(getActivity(), "Videos are merged", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFinish() {

                }
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            // Handle if FFmpeg is already running
        }
    }

最佳答案

Idk 它会帮助你,但是当我想用 ffmpeg 连接视频时,我使用了这个命令:

StringBuilder builder = new StringBuilder();
builder.append("-f ");
builder.append("concat ");
builder.append("-safe 0 ");
builder.append("-i ");
final String tempFile = getTextFile().getAbsolutePath();//it is text file with video files paths
builder.append(tempFile);
builder.append(" ");
builder.append("-c ");
builder.append("copy ");
builder.append(saveFile);// saveFile - it is your output file

无论如何,总时长为 20 秒的串联视频需要约 20 秒的处理时间。你可以看看here ,我写它是为了连接几个视频,但代码质量很糟糕,我不知道,你会不会明白那里的东西。 希望对你有帮助)

关于android - 使用 ffmpeg-android 连接视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51556944/

相关文章:

java - 监听器垃圾收集说明(Java/Android)

Android base64 编码的字符串无效?

animation - 如何从服务器上带有动画的照片生成视频?

android - 为 android x86 & x86_64 架构编译 ijkplayer x264,错误 : unknown type name 'v4si'

android - 在 Android 中使用 MediaRecorder 录制时使用 ffmpeg 处理视频

java - ListView 适配器行为异常。在我单击同一个 ListView 中的按钮后,ListView 中不相关的按钮被单击

android-如何检测双击 ImageView 并开始新 fragment

ffmpeg - 如何使用带有 h.264_qsv 的 ffmpeg 在给定间隔强制关键帧?

ffmpeg - 持续时间损坏的视频

安卓 ffmpeg : Use image for Watermark from drawable or assets folder