ffmpeg - 视频裁剪

基于FFmpeg的短视频编辑工具Cut 最近在学习FFmpeg和音视频的相关知识,为了加强对FFmpeg的认识和了解,于是撸了一个短视频编辑软件Cut。 阅读详情

ffmpeg - 视频裁剪

最近遇到一个项目,需要实现一个视频在多个屏幕上播放,windows可以用硬件方案实现,在安卓系统上目测好像没有现成的硬件方案,只能硬着头皮用软件实现。

开始了解需求时还不知道要怎么做,由于之前用过ffmpeg做过视频截图,觉得很强大,就想到了能不能用ffmpeg分割视频,和其他人员商量了下觉得可行,接下来几天就是找资料,了解ffmpeg。

最后不负所望,做出来个demo,虽然还很多细节要考虑,但是前期工作已经完成了很大的一步,特在此记录下,也让有需要的参考下,让大佬提提建议(优化裁剪视频的时间)。

参考资料:
http://ffmpeg.org/ffmpeg.html#Video-and-Audio-file-format-conversion
https://www.it610.com/article/1280132859394277376.htm

ffmpeg linux环境安装教程:

  1. 安装:yasm
    wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
    ./configure --prefix=/usr/local/yasm
    make
    make install
  2. 安装:x264
    http://download.videolan.org/x264/snapshots/x264-snapshot-20191216-2245.tar.bz2
    ./configure --prefix=/usr/local/x264 --enable-shared --enable-static --enable-yasm
    make
    make install
  3. 安装ffmpeg
    下载:
    sudo git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
    sudo ./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib
    make
    make install
  4. 执行ffmpeg命令
    如遇问题:ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory
    问题解决:
    sudo vi /etc/ld.so.conf
    在文件中添加路径:
    /usr/local/ffmpeg/lib
    #usr/local/ffmpeg 目录是ffmpeg的安装目录,根据个人不同安装目录修改。
    更新环境变量:
    sudo ldconfig

视频裁剪Java代码:

/**
     * 视频裁剪   一张一张裁剪
     * @param url        文件路径
     * @param dirPath    存放裁剪后的文件夹地址
     * @param destRow    裁剪的行数
     * @param destColumn 裁剪的列数
     * @return
     */
    public static List<String> cut2(String url, String dirPath, int destRow, int destColumn) {
        log.info("视频裁剪入口2: url:{}, path:{}, destRow:{}, destColumn", url, dirPath, destRow, destColumn);
        List<String> resultList = new ArrayList<>();
        String suffix = url.substring(url.lastIndexOf("."));
        List<CommandDTO> commandDTOS = generateCoordinateAndFileName(suffix, destRow, destColumn);
        for (CommandDTO commandDTO : commandDTOS) {
            String destFileName = dirPath + "/" + commandDTO.getFileName();
            List<String> commands = new ArrayList<>();
            commands.add("ffmpeg");
            commands.add("-i");
            commands.add(url);
            commands.add("-vf");
            commands.add("crop=" + commandDTO.getCommand());
            commands.add("-vcodec");
            commands.add("libx264"); // 视频编码 需要安装x264编码库
            commands.add(destFileName);

            if(runCommand(commands) == 0) {
                resultList.add(destFileName);
            }
        }

        return resultList;
    }

    /**
     * 视频裁剪 一次性裁剪完成
     * @param url        文件路径
     * @param dirPath    存放裁剪后的文件夹地址
     * @param destRow    裁剪的行数
     * @param destColumn 裁剪的列数
     * @return
     */
    public static List<String> cut3(String url, String dirPath, int destRow, int destColumn) {
        log.info("视频裁剪入口3: url:{}, path:{}, destRow:{}, destColumn:{}", url, dirPath, destRow, destColumn);
        List<String> resultList = new ArrayList<>();
        String suffix = url.substring(url.lastIndexOf("."));
        List<CommandDTO> commandDTOS = generateCoordinateAndFileName(suffix, destRow, destColumn);

        List<String> commands = new ArrayList<>();
        commands.add("ffmpeg");
        commands.add("-i");
        commands.add(url);

        List<String> regions = new ArrayList<>();
        List<String> fileMaps = new ArrayList<>();
        for (CommandDTO commandDTO : commandDTOS) {
            String destFileName = dirPath + "/" + commandDTO.getFileName();
            regions.add("-filter_complex");
            regions.add("[0:v]crop=" + commandDTO.getCommand() + "[" + commandDTO.getCoordinate() + "]");

            fileMaps.add("-map");
            fileMaps.add("[" + commandDTO.getCoordinate() + "]");
            fileMaps.add("-map");
            fileMaps.add("0:a");
            fileMaps.add(destFileName);

            resultList.add(destFileName);
        }

        commands.addAll(regions);
        commands.addAll(fileMaps);
        log.info("即将执行的命令 command:{}", Arrays.toString(commands.toArray()));
        if(runCommand(commands) == 0) {
            return resultList;
        }

        return new ArrayList<>();
    }

    private static int runCommand(List<String> commands) {
        log.info("执行命令 command:{}", Arrays.toString(commands.toArray()));
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(commands);
        try {
            Process process = builder.start();
            int i = process.waitFor();
            log.info("i:{}", i);
            if (i != 0) {
                log.error("命令执行错误:{}", process.getErrorStream());
            } else {
                log.info("命令执行成功");
            }

            return i;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return -1;
    }

    /**
     * 生成执行命令坐标以及对应文件名
     * @param suffix
     * @param destRow
     * @param destColumn
     * @return
     */
    private static List<CommandDTO> generateCoordinateAndFileName(String suffix, int destRow, int destColumn) {
        List<CommandDTO> commandDTOS = new ArrayList<>();
        // 时间字符串,作为文件名使用,可自定义,最好不重复
        String timeStr = FileUtil.generateTimeStr();
        // 裁剪的宽高
        String averageSize = "iw/" + destColumn + ":ih/" + destRow + ":";
        // 裁剪的坐标组合
        List<String> coordinates = buildCoordinates(destRow, destColumn);
        for (String c : coordinates) {
            String[] split = c.split(":");
            String x = split[0].substring(split[0].lastIndexOf("*") + 1);
            String y = split[1].substring(split[1].lastIndexOf("*") + 1);
            // 裁剪的起始坐标
            String area = x + "-" + y;
            // 裁剪后的文件名
            String fileName = timeStr + "_" + area + suffix;

            CommandDTO commandDTO = new CommandDTO(averageSize + c, area, fileName);
            commandDTOS.add(commandDTO);
        }

        return commandDTOS;
    }

    /**
     * 坐标点计算
     * @param row     行数
     * @param column  列数
     * @return
     */
    private static List<String> buildCoordinates(int row, int column) {
        if (row <= 0 || column <= 0) {
            throw new RuntimeException("裁剪的行,列必须都大于0");
        }

        List<String> commands = new ArrayList<>();
        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                String rowColumnCommand = "iw/" + column + "*" + i + ":ih/" + row + "*" + k;
                commands.add(rowColumnCommand);
            }
        }

        return commands;
    }

第一次研究,有问题的可以一起探讨,欢迎各位留言,提意见,觉得有用的点个赞啥的…

ffmpeg裁剪合并视频 一 裁剪视频   ffmpeg提供简单的命令参数: ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT 对上面的命令稍做个解释。 -ss 开始时间,如: 00:00:20,表示从20秒开始; -t 时长,如: 00:00:10,表示截取10秒长的视频; -i 输入,后面是空格,紧跟着就是输入 阅读详情

相关推荐

ffmpeg裁剪视频

使用ffmpeg裁剪一段视频主要需要一下几步 1、avformat_open_input /* 打开输入文件 */ 2、avformat_alloc_output_context2 /* 打开输出文件 */ 3、avformat_new_stream /* 为输出文件创建流 */ 4、avcodec_copy_context &amp;&amp; avcodec_parameters_c...

JT同学的博客 1263

FFmpeg截屏、剪切一段视频、或者压缩视频

这里我给出剪切视频的一段代码,缺点是无法精确,比如我想剪切20秒,但是可能剪切好的是23秒。网上大多是通过命令的显示操作ffmpeg,不太灵活。//如果想截取规定时间段视频 请看系列文章二。

styleqw的博客 3741

FFmpeg裁剪视频

FFmpeg、裁剪视频、opencv

zhibing_ding的博客 1022

使用FFmpeg实现精确剪切视频

基本的剪切命令: 用-ss和-t选项, 从第 30 秒开始,向后截取 10 秒的视频,并保存: ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0-codec copy output.wmv ffmpeg -i input.wmv -ss 30 -c copy -t 10 -codec copy output.wmv 达成相同效果,也可以用-ss和-to选项, ffmpeg -i input.wm...

yunxiaobaobei的博客 3万+

Windows使用ffmpeg对视频进行倍速、裁剪等操作

下载ffmpeg,解压缩;在....\ffmpeg\bin目录下打开powershell,执行指令。输出文件地址另选地址保存。

weixin_56337147的博客 2047

FFmpeg基础: 视频裁剪

在对视频进行裁剪之前,我们先讲几个基本概念。 第一个概念是PTS(Presentation Time Stamp) 显示时间戳,用来定位帧的显示时间。 第二个概念是DTS(Decode Time Stamp)解码时间戳,用来定位帧的解码时间。 第三个概念是时间基time_base,用来度量时间。

yang1fei2的博客 3743

使用ffmpeg截取视频片段

本文将介绍2中使用ffmpeg截取视频的方法两种截取方式的命令行如下。

会意的博客 7541

autodl云服务器使用中的conda源报错

通过find path -name filename找到.condarc文件,在autodl服务器中,一般在/root/.condarc。为了利用jypyter打开conda虚拟环境运行,需要下载ipykenel。这个报错是源的问题,在通过源获取包元数据时出现了HTTP 429错误。通过conda换源解决。修改.condarc文件,命令: vim .condarc。但这样还不能解决问题,得把报错中有问题的源注释掉。通过以下命令添加清华镜像源。把报错的链接源注释如下。

Ty_kilig的博客 1584

FFmpeg命令裁剪和合并视频

FFmpeg命令裁剪和合并视频

qq_41682323的博客 3964

【OpenBMC 系列】4.启动流程 使用qume模拟ast2600-evb

1.安装openbmc适配的qume 2.启动bmc 3.使用bmc web

AiFool的博客 4459

STM32--LoRa通信模块

模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。

qq_47258284的博客 1万+

ffmpeg利用crop滤镜进行视频裁剪

首先可以用ffmpeg命令行对视频进行裁剪,原始文件是1920x1080尺寸。 ffmpeg -i e:/in-vs.mp4 -vf crop=‘1280:640:200:200’ out_crop.mp4 其中1280和640代表裁剪后的宽和高,200和200分别代表裁剪的x坐标和y坐标(基于原始图像)。 下面用代码给予说明: ret = avfilter_graph_create_filter(&m_pFilterCtxSrcVideoA, filter_src_videoA, pad_nam

tusong86的博客 7382

CMOS反相器版图设计全解析:PMOS/NMOS布局与VDD/VSS连接门道

版图设计是芯片从电路原理图迈向物理实现的必经桥梁,而CMOS反相器作为最基础的数字单元,恰好是理解这一过程的最佳切入点。在版图绘制中,PMOS与NMOS因导电类型和迁移率差异,需要在N阱与P衬底上分别规划,并呈现出不同的有源区尺寸。真正决定版图好坏的关键,往往在于VDD/VSS的完整连接——不仅要接通源漏,还要通过阱接触和衬底接触固定阱与衬底电位,防止寄生PN结正偏和闩锁效应。合理布局电源地线轨道、优化接触孔数量,能显著降低寄生电阻与电迁移风险。这些原理不仅适用于反相器,也是所有CMOS数字标准单元版图设计

weixin_29159441的博客 303

ffmpeg 裁剪视频

前言 之前写过一篇用 shell 脚本与 ffmpeg 结合,批量把视频切割成指定时长的多个视频片断,当时写的那个脚本只支持这一个小功能,写的粗糙,原视频的总时长也没有获取到,还需要手动填写。 这次在那个的基础上添加了自动获取视频分辨率、时长,并且按指定的宽高裁剪视频的中间部分的画面(在这个 demo 中是这样设置,可以根据需要改为指定部分的画面,原理就是计算指定画面在原视频中的比例)的功能。 正...

miao的博客 6236

【数据集】全球陆地表面反照率Albedo

【数据集】全球陆地表面反照率Albedo

WW、forever的博客 1454

真正的工业级环形缓冲区(Circular Buffer)完整实现细节

永远不要永远不要ToArray()或AddRange()永远返回或两段Span永远用_head_tail% Capacity实现环形照着上面这套代码改,你的系统将彻底告别内存爆炸,从“实验室玩具”变成“产线战神”!需要我给你一个支持两段绘制的完整实现吗?

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 127

ffmpeg音视频裁剪

音视频裁剪,通常会依据时间轴为基准,从某个起始点到终止点的音视频截取出来,当然音视频文件中存在多路流,所对每一组流进行裁剪。

Scl_Diligent的博客 3050

【C#程序员入门AI】AI应用的操作系统:Semantic Kernel 2026实战

用户ID用户信息

人工智能AI技术 1249

使用ffmpeg实现视频裁剪并保持清高晰度

Ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库。

十年以上架构设计经验,专注于软件架构和人工智能领域,对机器视觉、NLP、音视频等领域都有涉猎 2425

基于YOLO的智能视频监控异常行为检测研究:从算法原理到落地部署的全栈实践

本文深入探讨如何利用 YOLO(You Only Look Once)系列算法构建一套端到端的异常行为检测系统。文章首先回顾 YOLOv8 在时空建模上的局限,然后提出“YOLO-STA(Spatio-Temporal Aggregation)”轻量级改进框架,在公开数据集 UCF-Crime 上将异常行为检测的 mAP@0.5 从 72.4 提升到 80.1;接着给出完整训练、推理、部署的 Python 代码(PyTorch + TensorRT),并介绍如何仅用 4 GB 显存的 Jetson Xavi

博客 1333

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ffmpeg 视频裁剪格式问题

运用ffmpeg进行视频裁剪报错Invalid data found when processing input,以及运用ffmpeg进行视频裁剪 这两天需要将视频进行裁剪,具体是将一段长60分钟的图片进行裁剪,从第15分钟剪到第三十分钟,只需要其中的15分钟。然后在运行代码的时候报错了。错误代码如下 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x11c6f60] moov atom not found /home/zhutianhao/avatest/Gsm_ZBStr0s.mkv: Inva

m0_48256515的博客 5880

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

FFmpeg 视频裁剪

使用ffmpeg简单的裁剪视频中一部分内容,无水印,无失真

dmhy的博客 2030

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ffmpeg裁剪视频画面

iw输入视频宽度,ih输入视频高度。x、y省略则居中裁剪。

海天鹰 1365

ffmpeg视频裁剪

代码 ffmpeg视频裁剪 -vf

清远小栈 2417

ffmpeg 参数_使用FFmpeg命令行对视频进行缩放和裁剪操作

上篇文章《安装FFmpeg多媒体库,以及命令行程序使用介绍》学会如何安装FFmpeg,以及FFmpeg的简单使用,本章将深入FFmpeg命令行进行讲解,介绍如何对视频进行缩放和裁剪操作。通过ffmpeg --help查看ffmpeg命令的使用规则。ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

weixin_39759918的博客 2498
上一篇: Spring Cloud Alibaba 分布式事务
下一篇: 加密算法 - DES
菜鸟泽
博客等级 码龄12年 26粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值