我的编程空间,编程开发者的网络收藏夹
学习永远不晚

写一个shell脚本实现视频处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

写一个shell脚本实现视频处理

目录
  • 需求
  • 视频处理 ffmpeg
    • 裁剪
    • 格式转换
  • 配置参数
    • sed命令
  • 读取时间切片csv
    • 转换视频格式
      • 上传七牛
        • end

          需求

          去年同事准备做个公司内部的大讲堂网站,将一些内部培训的视频汇总,提供给公司同事观看,网站搭建相对来说比较简单,直接用Ant.design Pro+Eggjs实现。但是为了体验更好一些,我们准备将视频,根据内容进行切割,方便用户快速找到自己感兴趣的内容,同时转成m3u8上传cdn,优化视频播放和缓冲的速度。

          这就涉及到了视频切割和格式转换,传统的做法是通过视频剪辑软件来处理即可,但是作为开发,还是想用一些自动化的方法来完成这个工作,毕竟时间最宝贵了,因此就想到了直接使用shell脚本一键完成切割、转换和上传。

          第一次写shell脚本,也是边学边写,所以肯定还有很多可以优化的地方,和大家一起学习啊...

          视频处理 ffmpeg

          想要用shell处理视频,首先要有处理视频的命令行工具,这个不难找,百度一下就发现了ffmpeg,一个神级视频处理库。

          FFmpeg 是视频处理最常用的开源软件。FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。本文介绍 FFmpeg 命令行如何处理视频,比桌面视频处理软件更简洁高效。[借用一下阮一峰老师对ffmpeg的介绍]

          关于ffmpeg以及视频编解码的介绍,可以去阮老师这边看。

          我们的需求是裁剪和格式转换,这里也针对性介绍一下这两个场景的命令。

          裁剪

          # 起始时间+时长
          ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
          # 起始时间+结束时间
          ffmpeg -ss [start] -i [input] -to [end] -c copy [output]
          • -ss:裁剪的开始时间
          • -i:输入文件
          • -to:裁剪的截止时间
          • -t:时间长度
          • -c copy:直接复制,不经过重新编码

          格式转换

          ffmpeg -i demo.mp4 -profile:v baseline -level 3.0 
          -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
          
          • -profile:v baseline:输出编码指定具体的H.264标准。
          • -level:--
          • -start_number:--
          • -hls_time:每个切片的时间
          • -hls_list_size:设置播放列表保存的最多条目,设置为0会保存有所片信息
          • -f:指定视频容器

          配置参数

          sed命令

          为了后面方便处理不同的视频,我希望将一些配置参数提取出来,配置文件config如下:

          File=source.mp4 # 待处理文件地址
          Cut_config=videos.csv # 时间戳数据
          Output_path=./output/ # 裁剪、转格式后视频文件输出路径
          Qiniu_prefix=videos/source/ # 上传七牛的路径
          

          读取脚本如下

          file=`sed '/^File=/!d;s/.*=//' config`  
          cutConfig=`sed '/^Cut_config=/!d;s/.*=//' config`  
          outputPath=`sed '/^Output_path=/!d;s/.*=//' config`  
          qiniuPrefix=`sed '/^Qiniu_prefix=/!d;s/.*=//' config` 
          

          这里用到sed命令,sed 可依照脚本的指令来处理、编辑文本文件。在这里,我们主要是读取配置文件中的键值对类型数据。

          sed '/^File=/!d;s/.*=//' config: 找到File=开头的行,然后!d删除这一行之外的行,将==之前的字符替换为空字符串,然后返回的就是=后面的字符串。

          读取时间切片csv

          视频切片需要知道起止时间,以及切割完之后视频的名字,这个数据组织方式比较适合csv,所以我们放到了csv中来管理,每一行代表一个视频片段。

          00:00:45,00:12:10,car-mainmaterial-from-commercial-vehicle
          00:12:05,00:15:25,car-mainmaterial-from-nameplate
          00:15:25,00:29:00,car-mainmaterial-from-certificate-registry
          00:29:00,00:33:00,car-mainmaterial-from-driving-license
          00:33:00,00:36:40,car-mainmaterial-from-cargo-import-permission
          00:36:40,00:48:33,car-mainmaterial-from-practice-case
          

          接下来就是解析csv文件。

          # 变量声明
          count=0 # 计数
          videos=() # 视频列表
          
          # 遍历
          for line in $(cat $cutConfig)
          do 
              OLD_IFS="$IFS"
              IFS="," # 用,切割字符串
              arr=($line) # 切割完,得到三个字符串的数组
              IFS="$OLD_IFS" # 恢复IFS
              videos[$count]="$outputPath${arr[2]}" # 存储裁剪后的视频片段文件名
              count=$(($count+1))
              # ffmpeg裁剪文件
              ffmpeg -ss ${arr[0]} -t ${arr[1]} -i $file -vcodec copy -acodec copy $outputPath${arr[2]}.mp4 -loglevel quiet 
          done
          

          转换视频格式

          # 转换视频格式
          for video in ${videos[@]}
          do
              ffmpeg -i $video.mp4 -profile:v baseline -level 3.0  -start_number 0 -hls_time 10 -hls_list_size 0 -f hls $video.m3u8
          done
          
          

          上传七牛

          # 上传视频
          qshell qupload2 --class="lazy" data-src-dir=$outputPath --bucket=assets --key-prefix=$qiniuPrefix --skip-suffixes=mp4 --overwrite=true --rescan-local=true
          

          end

          获取视频的时间切换,简单用video标签写了一个界面,通过拖拽快速或去起止时间,然后导出一个制定格式的CSV文件。

          写一个shell脚本实现视频处理

           

          到此这篇关于shell脚本实现视频处理的文章就介绍到这了,更多相关shell脚本视频处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

          免责声明:

          ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

          ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

          写一个shell脚本实现视频处理

          下载Word文档到电脑,方便收藏和打印~

          下载Word文档

          猜你喜欢

          写一个shell脚本实现视频处理

          目录需求视频处理 ffmpeg裁剪格式转换配置参数sed命令读取时间切片csv转换视频格式上传七牛end需求 去年同事准备做个公司内部的大讲堂网站,将一些内部培训的视频汇总,提供给公司同事观看,网站搭建相对来说比较简单,直接用Ant.des
          2022-07-08

          Shell脚本如何实现文本处理

          这篇文章给大家分享的是有关Shell脚本如何实现文本处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。4.1 排序文本4.1.1 行的排序未提供命令行选项时,整个记录会根据当前locale所定义的次序排序。在传统
          2023-06-09

          怎么在Shell脚本中实现一个ftok函数

          怎么在Shell脚本中实现一个ftok函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。#!/bin/shlet key=0function ftok() { pat
          2023-06-09

          Linux 使用shell脚本处理字符串的实现

          1. 截取字符串的前8位expr substr "$string" 1 8 echo $string | awk '{print substr(,1,8)}' echo $string | cut -c1-8 echo $string |
          2022-06-04

          如何实现Shell脚本遍历一个日期范围

          本篇内容主要讲解“如何实现Shell脚本遍历一个日期范围”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现Shell脚本遍历一个日期范围”吧!代码如下:#!/usr/bin/env bash
          2023-06-09

          怎么用Shell脚本实现一个简易Web服务器

          这篇文章主要介绍“怎么用Shell脚本实现一个简易Web服务器”,在日常操作中,相信很多人在怎么用Shell脚本实现一个简易Web服务器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Shell脚本实现一
          2023-06-09

          Linux使用shell脚本处理字符串的实现方法

          这篇文章给大家分享的是有关Linux使用shell脚本处理字符串的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 截取字符串的前8位expr substr "$string" 1 8echo $str
          2023-06-09

          Shell脚本实现的一个简易Web服务器例子分享

          假设你想测试网页和一些CGI,而你又不想麻烦Apache安装完整的包。这个快速的shell脚本可能只是你所需要的东西。 简而言之,一个web服务器是一个应用程序,该应用程序将本地文本文件通过网络发送给客户的请求。如果你让另一个程序(例如in
          2022-06-04

          linux Shell脚本里面把一个数组传递到awk内部进行处理

          前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法。前两天在QQ群里讨论awk的时候,无意间又聊起这个话题。机缘巧合之下找到一个思路,特此分享。 测试环境:[root]# head
          2022-06-04

          详解Linux Shell 实现一个获取任意位数的随机密码的脚本

          Shell 命令行,实现一个获取任意位数的随机密码的脚本 每次我们想要获得一个密码的时候都很头疼,于是我之前自己用nodejs写了一个 Shell 脚本。这两天在学习 bash Shell 所以,想用同样的逻辑实现一个获取任意位数随机密码的
          2022-06-04

          Shell脚本实现判断IP地址是否在一个ip段内代码分享

          cat ipcalc.sh #!/bin/bash IP=$1 if [ -z $IP ] then echo -e “e[31;42m sh ipcalc.sh IP e[0m" exit fi while read MASK do mi
          2022-06-04

          怎么用shell脚本实现对OGG进程过期trail文件的删除处理

          本篇内容主要讲解“怎么用shell脚本实现对OGG进程过期trail文件的删除处理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用shell脚本实现对OGG进程过期trail文件的删除处理”
          2023-06-04

          怎么利用shell脚本实现对一个磁盘进行分区格式化挂载

          这篇文章给大家分享的是有关怎么利用shell脚本实现对一个磁盘进行分区格式化挂载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。查看当前磁盘分区状况查看当前磁盘的一个分区状况,使用命令:fdisk -lfdisk
          2023-06-09

          如何使用批处理实现文本最末列数值乘一个数

          这篇文章给大家分享的是有关如何使用批处理实现文本最末列数值乘一个数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。a.txt 1##4072.0###52.19### #72## # 2#38705.8# # #
          2023-06-08

          编程热搜

          目录