【问题标题】:How to reverse a video using ffmpeg in android?如何在android中使用ffmpeg反转视频?
【发布时间】:2016-12-28 05:27:36
【问题描述】:

我想反转从画廊和相机加载的视频。使用ffmpeg命令将视频转换为图像帧和帧转换为反向视频。

【问题讨论】:

  • 你能转换成图像帧吗?
  • 如果您使用命令行 ffmpeg 或仅解码所有帧并反转,您将使用反向过滤器。不过,这将使用大量内存,并且 ffmpeg 文档对此提出了警告。
  • 是的,我得到了所有帧
  • 你能写命令从所有图像帧中获取反向视频吗

标签: android ffmpeg


【解决方案1】:

来自https://stackoverflow.com/a/8137637/2930834

后者如下:

转储所有视频帧

$ ffmpeg -i input.mkv -an -qscale 1 %06d.jpg

转储音频

$ ffmpeg -i input.mkv -vn -ac 2 audio.wav

反向音频

$ sox -V audio.wav backwards.wav reverse

以 FFmpeg 作为输入的相反顺序的 Cat 视频帧

$ cat $(ls -t *jpg) | ffmpeg -f image2pipe -vcodec mjpeg -r 25 -i - -i backwards.wav -vcodec libx264 -vpre slow -crf 20 -threads 0 -acodec flac output.mkv

使用 mencoder 去隔行 PAL dv 并将帧速率从 25 提高到 50,然后通过管道传输到 FFmpeg。

$ mencoder input.dv -of rawvideo -ofps 50 -ovc raw -vf yadif=3,format=i420 -nosound -really-quiet -o - | ffmpeg -vsync 0 -f rawvideo -s 720x576 -r 50 -pix_fmt yuv420p -i - -vcodec libx264 -vpre slow -crf 20 -threads 0 video.mkv

也值得一试,

我没试过。希望这会有所帮助

【讨论】:

  • 我没试过。我会的,当我有空的时候。您面临的错误是什么?
  • -start_number: 没有这样的文件或目录
  • 我的命令是 [-y, -i, -start_number, 100, -i, /storage/emulated/0/Frame Folder/img%03d.png, /storage/emulated/0/ Kalpesh 文件夹/VID_reverse.mp4]
  • 如果正确,您确定路径正确吗,请尝试在框架文件夹中添加 %20 而不是空格。命令应类似于 [-y, -i, -start_number, 100, -i, /storage/emulated/0/Frame%20Folder/img%03d.png, /storage/emulated/0/Kalpesh Folder/VID_reverse.mp4]或将 Frame Folder 重命名为 Frame_Folder 等.....
  • 我猜“框架文件夹”目录名称中的空间正在破坏您的路径...
【解决方案2】:

1.将视频分成时长不超过 10 秒的片段(以下命令为 6 秒)

String[] complexCommand = {"-i", inputFileAbsolutePath, "-c:v", "libx264", "-crf", "22", "-map", "0", "-segment_time", "6", "-g", "9", "-sc_threshold", "0", "-force_key_frames", "expr:gte(t,n_forced*6)", "-f", "segment", outputFileAbsolutePath};

2.反转分割的视频

带音频

String command[] = {"-i", inputFileAbsolutePath, "-vf", "reverse", "-af", "areverse", outputFileAbsolutePath};

没有音频

String command[] = {"-i",inputFileAbsolutePath, "-vf", "reverse", outputFileAbsolutePath};

3.以相反的顺序连接反向分段视频

带音频

String command[] = {"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath .....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:v0] [0:a0] [1:v1] [1:a1]...[N:vN] concat=n=N:v=1:a=1 [v] [a],"-map","[v]","-map","[a]", outputFileAbsolutePath};

没有音频

String command[] = {"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath .....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:0] [1:0] [2:0]...[N:0] concat=n=N:v=1:a=0",outputFileAbsolutePath};

详细解释请查看this和示例代码here

【讨论】:

    【解决方案3】:

    此示例代码只是视频反向不包括音频。

    build.gradle

    compile 'com.writingminds:FFmpegAndroid:0.3.2'
    

    命令执行前,需要先加载二进制文件

    FFmpeg ffmpeg = FFmpeg.getInstance(this);
    
    try {
            ffmpeg.loadBinary(new FFmpegLoadBinaryResponseHandler() {
            @Override
            public void onFailure() {
    
            }
    
            @Override
            public void onSuccess() {
    
            }
    
            @Override
            public void onStart() {
    
            }
    
            @Override
            public void onFinish() {
    
            }
            });
            } catch (FFmpegNotSupportedException e) {
                 e.printStackTrace();
           }
    

    加载二进制文件后,你就可以执行你的命令了。

    String strInputVideoPath = dir.getAbsolutePath()  + "/" + "1543999518815.mp4";
    String strRevOutputVideoPath = dir.getAbsolutePath() + "/" + "reverse.mp4";    
    String[] cmdRevVid = {"-i",  strInputVideoPath,"-vf","reverse", strRevOutputVideoPath};
                try {
                    ffmpeg.execute(cmdRevVid, new ExecuteBinaryResponseHandler(){
                        @Override
                        public void onStart() {
    
                        }
    
                        @Override
                        public void onProgress(String message) {
    
                        }
    
                        @Override
                        public void onFailure(String message) {
    
                        }
    
                        @Override
                        public void onSuccess(String message) {
    
                            try{
    
    
    
                            }catch (Exception ex){
    
                            }
                        }
    
                        @Override
                        public void onFinish() {
    
                        }
                    });
    
                } catch (FFmpegCommandAlreadyRunningException e) {
                    // Handle if FFmpeg is not supported by device
                }
    

    就我而言,我必须自己做反向视频和连接视频。参考Post

    String[] cmdFinal = {"-i",  dir.getAbsolutePath()  + "/" + "inputVideo.mp4",
                    "-filter_complex", "[0:v]reverse,fifo[r];[0:v][r] concat=n=2:v=1 [v]",
                    "-map", "[v]",
                    dir.getAbsolutePath() + "/" + "final.mp4"};
    

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 2012-05-22
      • 2011-06-05
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2016-01-18
      • 2012-03-05
      • 2017-04-29
      相关资源
      最近更新 更多