当前位置:   article > 正文

android ffmpeg视频抽帧 ffmpeg视频长度裁剪 ffmpeg视频区域裁剪 ffmpeg视频压缩

android ffmpeg视频抽帧 ffmpeg视频长度裁剪 ffmpeg视频区域裁剪 ffmpeg视频压缩
    implementation("com.arthenica:mobile-ffmpeg-full:4.4")
  • 1

1.ffmpeg视频抽帧

    /**
     * ffmpeg -i "123.mp4" -r 5 -q:v 2 -f image2 %d.jpeg
     * <p>
     * 备注:
     * -i 是用来获取输入文件的名称,-i “123.mp4” 就是获取这个叫做123的mp4视频文件,当然你用avi格式之类的也可以;
     * -r 是设置每秒提取图片的帧数,也即采样率,-r 5的意思就是每秒抽取5张视频帧;
     * -q:v 2 这个可以提高抽取到的图片的质量的;
     * -f 是设定输出格式,这里image2就是图像解析模式,还有contact连接模式等;
     * %d.jpeg,可以指定文件的输出名字jpeg,jpg,png之类的都可以,也可以在前面加个路径,变成 /data/mp4-%05d.jpeg
     *
     * @param path
     */
    private void startShootVideoThumb(String path) {
        String dicName = DIR_IMAGE_ANALYSIS + new Date().getTime();
        FileUtil.getInstance().initDirectory(dicName);
        String ffmpegCmd = "-i " + path + " -r 1 -f image2 " + dicName + "/frame%04d.png";
        String[] command = ffmpegCmd.split(" ");
        System.out.println(Arrays.toString(command));
        FFmpeg.executeAsync(command, (executionId, returnCode) -> {
            LogUtil.e("文件解码=" + (returnCode == 0));
            File[] files = FileUtil.getInstance().getFiles(dicName);
            LogUtil.e("文件解码=" + files.length);
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2.ffmpeg视频长度裁剪

    /**
     * @param start 裁剪开始时间
     * @param duration 裁剪长度
     */
    @UnstableApi
    private void cutVideoLong(double start, double duration) {
        LogUtil.e("视频长度裁剪");
        String out = StorageUtil.getCacheDir() + File.separator + "editVideo.mp4";
        StorageUtil.deleteFile(out);

        String cmd = "-ss " + start + " -t " + duration + " -accurate_seek" + " -i " + mFilename + " -codec copy -avoid_negative_ts 1 " + out;
        LogUtil.e(cmd);
        String[] command = cmd.split(" ");
        try {
            FFmpeg.executeAsync(command, (executionId, returnCode) -> {
                LogUtil.e("文件长度裁剪" + (returnCode == 0));
                if (returnCode == 0) {
                    cutVideoSize(out);
                } else {
                    showToast("文件裁剪失败!");
                    dialog.dismiss();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3.ffmpeg视频区域裁剪

-i input.mp4 指定输入视频文件。

-ss 00:00:00 开始时间。

-t 00:00:10 截取视频的时长。

-vf "crop=out_w:out_h:x:y" 指定裁剪的宽度(out_w)、高度(out_h)以及起始坐标(x, y)。

-codec:a copy 复制音频流。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
    @UnstableApi
    private void cutVideoSize(String path) {
        float[] cutArr = cutView.getCutArr();
        float left = cutArr[0];
        float top = cutArr[1];
        float right = cutArr[2];
        float bottom = cutArr[3];

        int cutWidth = cutView.getRectWidth();
        int cutHeight = cutView.getRectHeight();

        float leftPro = left / cutWidth;
        float topPro = top / cutHeight;
        float rightPro = right / cutWidth;
        float bottomPro = bottom / cutHeight;

        //得到裁剪位置
        int videoWidth = player.getVideoFormat().width;
        int videoHeight = player.getVideoFormat().height;

        int cropWidth = (int) (videoWidth * (rightPro - leftPro));
        int cropHeight = (int) (videoHeight * (bottomPro - topPro));
        if (cropWidth % 2 != 0) {
            cropWidth = cropWidth - 1;
        }
        if (cropHeight % 2 != 0) {
            cropHeight = cropHeight - 1;
        }

        LogUtil.e("视频大小裁剪");
        String out = StorageUtil.getCacheDir() + File.separator + "cutVideo.mp4";
        StorageUtil.deleteFile(out);

        String[] command = new String[]{"-i", path, "-filter:v", "crop=" + cropWidth + ":" + cropHeight + ":" + left + ":" + top, out};
        LogUtil.e(Arrays.toString(command));
        try {
            FFmpeg.executeAsync(command, (executionId, returnCode) -> {
                LogUtil.e("文件大小裁剪" + (returnCode == 0));
                if (returnCode == 0) {
                    processorVideo(out);
                } else {
                    showToast("文件裁剪失败!");
                    dialog.dismiss();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

4.ffmpeg视频压缩

 String cmd = "-i " + inputFile + " -b:v 2000k -s 720*1280 -r 30 " + outputFile;
       
inputVideoPath 是原始视频文件的路径,
outputVideoPath 是压缩后视频文件的存储路径。
-b:v 参数设置视频的比特率
,-r 设置帧率,
-s 设置视频的分辨率。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
    public static void compress(Context context, String inputFile, String outputFile, final VideoCompressListener callback) {
        LogUtil.e("视频压缩");
        String cmd = "-i " + inputFile + " -b:v 2000k -s 720*1280 -r 30 " + outputFile;
        LogUtil.e(cmd);
        String[] command = cmd.split(" ");
        FFmpeg.executeAsync(command, (executionId, returnCode) -> {
            LogUtil.e("文件压缩" + (returnCode == 0));
            if (returnCode == Config.RETURN_CODE_SUCCESS) {
                if (callback != null) {
                    callback.onSuccess("视频压缩成功!");
                }
            } else {
                if (callback != null) {
                    callback.onFailure("视频压缩失败!");
                }
            }
            callback.onFinish();
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

5.其他

1.FFMPEG裁剪视频

命令:ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT

其中各参数的说明如下:

START: 开始时间。如00:01:20,表示裁剪部分从1分20秒处开始

DURATION: 视频时长。如00:02:30,表示截取时长为2分30秒的视频

INPUT :输入。表示原始视频文件

OUTPUT:输出。

-vcode copy和-acodec copy 表示所要使用的视频和音频的编码格式,copy表示原样拷贝。

2.FFMPEG提取某一帧图像

命令:ffmpeg -i INPUT -y -f image2 -ss TIME -vframes 1 OUTPUT

其中各参数的说明如下:

  INPUT :输入。表示原始视频文件

TIME:某个时间点,要提取的图像即为该时间点的图像。格式00:01:30或直接写90

OUTPUT:会在视频文件所在的文件夹下生成图像文件

3.FFMPEG合并视频文件

命令:ffmpeg -i concat:”PART1.mpg|PART2.mpg” -vcodec copy -acodec copy OUTPUT.mpg

其中各参数的说明如下:

PART1:要合并的第一个视频文件的名字

PART2:要合并的第二个视频文件的名字

OUTPUT:合并后的视频文件的名字

4.FFMPEG转换视频格式

命令:ffmpeg -i INPUT -f mpeg OUTPUT

例如:ffmpeg -i D:/temp1/avi -f mpeg D:/result.mpg

5. FFMPEG将视频转换为图像帧

命令:ffmpeg -i ./test/video.mpg -r 1 -f image2 temp/%05d.png
其中-r是表示图像的帧率。



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
ffmpeg -filter参数

FFmpeg的-filter参数用于在音视频流上应用各种过滤器。这些过滤器可以用于添加效果、转换格式、调整大小和比特率等。-filter参数接受一个由逗号分隔的过滤器列表。过滤器在应用时按照给定的顺序依次执行。
常用过滤器

1.scale:调整视频的大小。
可以指定目标宽度和高度,也可以指定比例因子。例如,使用filter参数`-filter:v scale=640:480`可以将视频调整为宽度为640像素高度为480像素的大小。

2.crop:裁剪视频的指定区域。
可以指定左上角的坐标以及裁剪后的宽度和高度。例如,使用filter参数`-filter:v crop=320:240:10:10`可以裁剪视频,以保留左上角为(10, 10)、宽度为320像素、高度为240像素的区域。

3.framerate:调整视频的帧率。
可以指定目标帧率。例如,使用filter参数filter:v framerate=30`可以将视频的帧率设置为30fps。

4. drawtext:在视频中添加文字。
可以指定文字内容、字体、大小、颜色、位置等参数。例如,使用filter参数`-filter:v"drawtext=text='Hello World':fontfile=arial.ttf: fontsize=20: fontcolor=white: x=10: y=10"可以在视频的左上角添加一个白色的20号字体的"Hello World"文字。

5.setpts:调整视频的播放速度。
可以指定一个表达式来改变时间戳。例如,使用filter参数`-filter:v setpts=0.5*PTS`可以将视频的播放速度加快一倍。

6.volume:调整音频的音量。
可以指定音量的增益值。例如,使用filter参数`filter:a volume=2.0`可以将音频的音量增加一倍。

7.concat:合并多个视频或音频文件。
可以指定多个输入文件,并按指定的顺序进行合并。例如,使用filter参数`-filter complex"[0:v][1:v]concat=n=2:v=1[outv]; [0:a][1:a]concat=n=2:a=1[outa]" -map "[outv]"map "[outa]"可以将两个视频文件合并为一个输出文件。

使用例子
1.调整视频的大小和帧率:
ffmpeg -iinput.mp4 -filter:v "scale=640:480,framerate=30'output.mp4

3.在视频中添加文字:
ffmpeg -i input.mp4 -vf "drawtext=text='Hello World': fontfile=arial.ttf.fontsize=20: fontcolor=white: x=10:y=10" output.mp4

3.调整视频的播放速度:
ffmpeg -iinput.mp4 -filter:v setpts=0.5*PTS output.mp4

4.合并两个视频文件:
ffmpeg -iinput1.mp4 -iinput2.mp4 -filter complex "[0:v][1:vconcat=n=2:v=1[outv]; [0:a][1:a]concat=n=2:a=1[outa]" -map "[outv]"map "[outa]" output.mp4


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/979501
推荐阅读
相关标签
  

闽ICP备14008679号