需求

上一年同事预备做个公司内部的大讲堂网站,将一些内部训练的视频汇总,提供给公司同事观看,网站搭建相对来说比较简单,直接用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 --src-dir=$outputPath --bucket=assets --key-prefix=$qiniuPrefix --skip-suffixes=mp4 --overwrite=true --rescan-local=true

end

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

写一个shell脚本来做视频处理