通过shell/bash脚本使用ffmpeg批量去除视频固定片头和片尾(Cygwin环境)
通过shell/bash脚本使用ffmpeg批量去除视频固定片头和片尾(Cygwin环境)
- 任务需求:
- 基本情况:
- 技能需求:
- 操作流程概括:
- 运行通过的shell脚本:
- 小结
任务需求:
对一批视频进行处理,去除其中的固定长度的片头和片尾。
基本情况:
- FFmpeg提供了一些基本的核心工具,包括剪切视频片段以及获取视频信息;
- FFmpeg没有提供针对需求的工具,尤其是固定片尾的处理;
- 需要综合FFmpeg的基本工具和shell脚本的文本处理工具,将视频长度提取出来进行处理,进而满足需求;
- 我之前都是在bat中使用FFmpeg简单进行视频批处理,但不是很了解Bat脚本及其处理文本的方法。论坛里有一些类似的文章只需4步实现批量删除音视频的片头片尾,不过没太仔细看,感兴趣的朋友可以了解一下;
- 不过我对shell脚本的文本处理很感兴趣。由于只是“半桶水”,所以还是要先感谢benarchen提供的利用shell脚本解决批量处理的方式;
- benarchen建议在安装Linux系统的设备中运行shell脚本,而我目前的设备安装的是Windows7,不能直接在命令行中运行;
- 不过我觉得应该可以在Windows7中使用Cygwin,运行该shell/bash脚本,曲线救国。
技能需求:
- Windows7中的命令行使用FFmpeg处理视频;
- Windows7中Cygwin的基本使用,在Cygwin中编辑、运行shell/bash 脚本;
- Shell脚本的一些基础知识,循环结构等等。
以上这些技能,如果都会的话,估计不需要继续看下去就已经知道该怎么操作了。不会或者像我一样时间久了不熟悉的话,需要先自学或者温习一下,否则会影响操作流程,我这里就不介绍了。
操作流程概括:
-. 先简单测试了一下在Cygwin中运行FFmpeg的情况,准备好待测试视频文件,在Cygwin命令行中分别输入:
nohup /cygdrive/e/Interest-0/010PC/000Tools/ffmpeg/bin/ffmpeg -i input > tmp.log
/cygdrive/e/Interest-0/010PC/000Tools/ffmpeg/bin/ffmpeg –i input.mp4 output.mp4
关于路径的问题,下面有描述。上面的命令运行正常,输出的log里面也包含了视频的Metadata、Duration等信息,表示可以在Cygwin中处理视频。
-. 最后,开始调试博主提供的shell脚本,有几处简单报错和需要修改的地方。当时改得很快,没来得及截图,简单描述一下:
- 原代码中的“for i in (.mp4,.mp3,*.avi ); do”,这一句循环结构有语法报错,我直接改成了“for i in *.mp4”;
- 原代码中的FFmpeg路径为“/usr/local/ffmpeg/bin/ffmpeg”,我是在Cygwin环境中的,所以要注意FFmpeg的路径:“/cygdrive/e/Interest-0/010PC/000Tools/ffmpeg/bin/ffmpeg”,其中的“/cygdrive/e”就是指E盘,要根据实际存放位置确定;
- 原代码中”/usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i $i -t newtime−c:vcopy−c:acopy/data/tmp/newtime -c:v copy -c:a copy /data/tmp/newtime−c:vcopy−c:acopy/data/tmp/i –y”,我对这一行的改动有两点,一是应根据个人需要使用视频的编码方式,二是我的一些待处理文件的文件名有空格,所以其中的“$i”,需要套上双引号,以适应这类较复杂的文件名。
运行通过的shell脚本:
#!/bin/bash
#我这里要切除的开头和结尾都是 31 秒
beg=31
end=31#用 for 循环直接获取当前目录下的 mp4 文件循环处理,单个文件可以去掉 for 循环
for i in *.mp4
do#将元数据信息临时保存到 tmp.log 文件中nohup /cygdrive/e/Interest-0/010PC/000Tools/ffmpeg/bin/ffmpeg -i "$i" > tmp.log#获取视频的时长,格式为 00:00:10,10 (时:分:秒,微妙)time="`cat ./tmp.log |grep Duration: |awk '{print $2}'|awk -F "," '{print $1}'|xargs`"echo $time#求视频的总时长,先分别求出小时、分、秒的值,这里不处理微秒,可以忽略hour="`echo $time |awk -F ":" '{print $1}' `"min="`echo $time |awk -F ":" '{print $2}' `"sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"#echo $hour $min $secnum1=`expr $hour \* 3600`num2=`expr $min \* 60`num3=$sec#计算出视频的总时长(秒)sum=`expr $num1 + $num2 + $num3`#总时长减去开头和结尾就是截取后的视频时长,并且这里不需要再转回 hour:min:sec >的格式,直接使用结果即可newtime=`expr $sum - $beg - $end`echo $newtime/cygdrive/e/Interest-0/010PC/000Tools/ffmpeg/bin/ffmpeg -i "$i" -ss 00:00:31 -t $newtime -c:v libx264 -c:a aac ./tmp/"$i"
done
小结
一套操作下来花了几十分钟,主要是因为有小半年没有接触Cygwin和bash,打开Cygwin的一瞬间茫茫然。一些基本的操作和命令一时间回想不起来,比如根目录的表示方式、Cygwin中关于驱动盘的路径表达式、shell脚本表达式编辑等等。查找了一下过去的笔记和资料,时间主要花在这上面和调试了。相信如果熟练的话,几分钟就可以了。
万幸,原代码中间的文本处理过程是完全OK的,节省了很多时间,再次感谢原作者benarchen的分享。
通过shell/bash脚本使用ffmpeg批量去除视频固定片头和片尾(Cygwin环境)相关推荐
- Shell脚本利用ffmpeg批量处理视频文件
最近遇到一个问题,对一个文件下所有视频文件进行切割处理,类似于把每个长30分钟视频文件截取其中的第10分钟到第20分钟的内容,截取出来的视频生成一个新的视频文件.当然在Linux底下我们有好用的工具f ...
- shell bash脚本_如何在Windows 10上创建和运行Bash Shell脚本
shell bash脚本 With the arrival of Windows 10's Bash shell, you can now create and run Bash shell scri ...
- FFmpeg批量转换视频格式
FFmpeg 批量转换视频格式 1.新建一个.bat文件(如新建"视频转换.bat"),将下列代码复制进去后保存. 2.将该文件放在含有视频的文件夹类,双击运行即可.运行完成后视频 ...
- python使用ffmpeg去掉视频片头和片尾
python使用ffmpeg去掉视频片头和片尾 需要自己得到视频的片头和片尾时长:并且设置好视频文件的名称. 关于ffmpeg的配置及操作可看ffmpeg配置环境和测试,ffmpeg的基本使用,pyt ...
- 编写Bash脚本实现使用FFmpeg批量合并视频
前言 使用FFmpeg能够很方便的合并同分辨率的视频.很多时候我们可能需要批量化合并视频,此时可以通过编写Bash脚本来实现. 实现 批量合并视频 合并三个文件夹中的视频结果: result_path ...
- shell/bash脚本命令教程
shell/bash其实就是我们日常在unix系统终端中执行的语句,只是通常我们在命令行中都是单行语句执行的,而有时,我们希望将一些操作命令写到一个文本中,让电脑自动按顺序或是并行地执行这些命令, ...
- 使用批处理脚本(BAT)调用FFMPEG批量编码视频
使用批处理脚本(BAT)编码视频非常方便,尤其当视频序列非常多的时候,更是省了不少简单重复性劳动. 只要学会批处理里面几个基本的命令就行了,感觉和c/c++差不多. set:设置变量(注意:变量一般情 ...
- 【Python正则表达式】 批量去除视频名称中的网址
需求提出:许多资源下载站点,会在视频文件中加入网址.网站资源提供者为了更多的导入流量而附加的,为广大网友提供了有价值的资源,但是对于爱好干净,清爽的用户来说,手动去除网址毕竟不是太高效 关键技术点: ...
- FFmpeg批量提取视频的某一帧作为封面
命令是这样的: ffmpeg -i input.flv -ss 00:00:02 -frames:v 1 out.png 说明: -i input.flv 截取的视频的名字 -ss 00:00:02 ...
最新文章
- R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战
- php超星查课接口,这是一个可以查询超星课程的接口,请教一下该怎么用啊
- 在jsx中绑定js表达式以及jsx注释
- Start vm by command line
- Java SE 7、8、9 –推进Java
- ubuntu 16.04 + apache2 将php7.1 切换到 php7.3
- Java OutputStreamWriter flush()方法与示例
- 面试题: 大公司面试 !=!=未看
- 机器学习 - [源码实现决策树小专题]决策树中混杂度数值度量的Python编程实现(信息熵和基尼系数的计算)
- 关于spring集成junit4测试步骤
- 传说中的“猴年马月”就要来了,感觉很多愿望都要实现啦!
- Ubuntu系统下面软件安装更新命令
- android俄罗斯方块开发代码,基于Android的俄罗斯方块开发(附源码)
- HTML显示日期时间代码
- 计算机如何取消还原卡,如何关闭硬件还原卡?
- matlab怎么带根号积分,如何用matlab画带根号的方程曲线图。曲线=[0.33-0.16x^2+0.12x]^(1/2)。...
- 奥西400服务器维修,奥西tds400驱动
- 怎么把链接生成二维码?怎样制作一个链接二维码?
- 搜狐公司董事局主席兼首席执行官——张朝阳名言3
- 对比两张excel的不同
热门文章
- 数据库迁移_迁移实战:一次 AntDB 数据库迁移经验分享
- 基于SSM+SpringBoot+MySQL+Thymelaf+Bootstrap的个人理财系统
- 综合项目:人工智能领域目前职位及薪资现状分析 - 基于主流招聘网站信息
- 身份证识别,银行卡识别,驾驶证识别,行驶证识别,根据百度文字识别 api 封装,能快速识别身份证信息,银行卡信息,驾驶证信息,行驶证信息,使用非常方便
- 【从零到壹】Python的数据类型
- 腾创网络始终专注于产品核心——互动视频会议组件
- ZYNQ7000搭建嵌入式Linux操作系统---增加PL端外设(以太网)篇
- 论文笔记-F3Net:Fusion, Feedback and Focus for Salient Object Detection
- python学习day30
- 透明传输 非透明传输