通过shell/bash脚本使用ffmpeg批量去除视频固定片头和片尾(Cygwin环境)

  • 任务需求:
  • 基本情况:
  • 技能需求:
  • 操作流程概括:
  • 运行通过的shell脚本:
  • 小结

任务需求:

对一批视频进行处理,去除其中的固定长度的片头和片尾。

基本情况:

  1. FFmpeg提供了一些基本的核心工具,包括剪切视频片段以及获取视频信息;
  2. FFmpeg没有提供针对需求的工具,尤其是固定片尾的处理;
  3. 需要综合FFmpeg的基本工具和shell脚本的文本处理工具,将视频长度提取出来进行处理,进而满足需求;
  4. 我之前都是在bat中使用FFmpeg简单进行视频批处理,但不是很了解Bat脚本及其处理文本的方法。论坛里有一些类似的文章只需4步实现批量删除音视频的片头片尾,不过没太仔细看,感兴趣的朋友可以了解一下;
  5. 不过我对shell脚本的文本处理很感兴趣。由于只是“半桶水”,所以还是要先感谢benarchen提供的利用shell脚本解决批量处理的方式;
  6. benarchen建议在安装Linux系统的设备中运行shell脚本,而我目前的设备安装的是Windows7,不能直接在命令行中运行;
  7. 不过我觉得应该可以在Windows7中使用Cygwin,运行该shell/bash脚本,曲线救国。

技能需求:

  1. Windows7中的命令行使用FFmpeg处理视频;
  2. Windows7中Cygwin的基本使用,在Cygwin中编辑、运行shell/bash 脚本;
  3. 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脚本,有几处简单报错和需要修改的地方。当时改得很快,没来得及截图,简单描述一下:

  1. 原代码中的“for i in (.mp4,.mp3,*.avi ); do”,这一句循环结构有语法报错,我直接改成了“for i in *.mp4”;
  2. 原代码中的FFmpeg路径为“/usr/local/ffmpeg/bin/ffmpeg”,我是在Cygwin环境中的,所以要注意FFmpeg的路径:“/cygdrive/e/Interest-0/010PC/000Tools/ffmpeg/bin/ffmpeg”,其中的“/cygdrive/e”就是指E盘,要根据实际存放位置确定;
  3. 原代码中”/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环境)相关推荐

  1. Shell脚本利用ffmpeg批量处理视频文件

    最近遇到一个问题,对一个文件下所有视频文件进行切割处理,类似于把每个长30分钟视频文件截取其中的第10分钟到第20分钟的内容,截取出来的视频生成一个新的视频文件.当然在Linux底下我们有好用的工具f ...

  2. 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 ...

  3. FFmpeg批量转换视频格式

    FFmpeg 批量转换视频格式 1.新建一个.bat文件(如新建"视频转换.bat"),将下列代码复制进去后保存. 2.将该文件放在含有视频的文件夹类,双击运行即可.运行完成后视频 ...

  4. python使用ffmpeg去掉视频片头和片尾

    python使用ffmpeg去掉视频片头和片尾 需要自己得到视频的片头和片尾时长:并且设置好视频文件的名称. 关于ffmpeg的配置及操作可看ffmpeg配置环境和测试,ffmpeg的基本使用,pyt ...

  5. 编写Bash脚本实现使用FFmpeg批量合并视频

    前言 使用FFmpeg能够很方便的合并同分辨率的视频.很多时候我们可能需要批量化合并视频,此时可以通过编写Bash脚本来实现. 实现 批量合并视频 合并三个文件夹中的视频结果: result_path ...

  6. shell/bash脚本命令教程

      shell/bash其实就是我们日常在unix系统终端中执行的语句,只是通常我们在命令行中都是单行语句执行的,而有时,我们希望将一些操作命令写到一个文本中,让电脑自动按顺序或是并行地执行这些命令, ...

  7. 使用批处理脚本(BAT)调用FFMPEG批量编码视频

    使用批处理脚本(BAT)编码视频非常方便,尤其当视频序列非常多的时候,更是省了不少简单重复性劳动. 只要学会批处理里面几个基本的命令就行了,感觉和c/c++差不多. set:设置变量(注意:变量一般情 ...

  8. 【Python正则表达式】 批量去除视频名称中的网址

    需求提出:许多资源下载站点,会在视频文件中加入网址.网站资源提供者为了更多的导入流量而附加的,为广大网友提供了有价值的资源,但是对于爱好干净,清爽的用户来说,手动去除网址毕竟不是太高效 关键技术点: ...

  9. FFmpeg批量提取视频的某一帧作为封面

    命令是这样的: ffmpeg -i input.flv -ss 00:00:02 -frames:v 1 out.png 说明: -i input.flv 截取的视频的名字 -ss 00:00:02 ...

最新文章

  1. R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战
  2. php超星查课接口,这是一个可以查询超星课程的接口,请教一下该怎么用啊
  3. 在jsx中绑定js表达式以及jsx注释
  4. Start vm by command line
  5. Java SE 7、8、9 –推进Java
  6. ubuntu 16.04 + apache2 将php7.1 切换到 php7.3
  7. Java OutputStreamWriter flush()方法与示例
  8. 面试题: 大公司面试 !=!=未看
  9. 机器学习 - [源码实现决策树小专题]决策树中混杂度数值度量的Python编程实现(信息熵和基尼系数的计算)
  10. 关于spring集成junit4测试步骤
  11. 传说中的“猴年马月”就要来了,感觉很多愿望都要实现啦!
  12. Ubuntu系统下面软件安装更新命令
  13. android俄罗斯方块开发代码,基于Android的俄罗斯方块开发(附源码)
  14. HTML显示日期时间代码
  15. 计算机如何取消还原卡,如何关闭硬件还原卡?
  16. matlab怎么带根号积分,如何用matlab画带根号的方程曲线图。曲线=[0.33-0.16x^2+0.12x]^(1/2)。...
  17. 奥西400服务器维修,奥西tds400驱动
  18. 怎么把链接生成二维码?怎样制作一个链接二维码?
  19. 搜狐公司董事局主席兼首席执行官——张朝阳名言3
  20. 对比两张excel的不同

热门文章

  1. 数据库迁移_迁移实战:一次 AntDB 数据库迁移经验分享
  2. 基于SSM+SpringBoot+MySQL+Thymelaf+Bootstrap的个人理财系统
  3. 综合项目:人工智能领域目前职位及薪资现状分析 - 基于主流招聘网站信息
  4. 身份证识别,银行卡识别,驾驶证识别,行驶证识别,根据百度文字识别 api 封装,能快速识别身份证信息,银行卡信息,驾驶证信息,行驶证信息,使用非常方便
  5. 【从零到壹】Python的数据类型
  6. 腾创网络始终专注于产品核心——互动视频会议组件
  7. ZYNQ7000搭建嵌入式Linux操作系统---增加PL端外设(以太网)篇
  8. 论文笔记-F3Net:Fusion, Feedback and Focus for Salient Object Detection
  9. python学习day30
  10. 透明传输 非透明传输