上午还在写单元测试,下午就干这件事:抽取一批视频抽取前面3秒,中间3秒,后面3秒的图片。一秒大概25帧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #!/bin/bash
#set -e #去掉后脚本可跳过错误继续运行 #ls *.mp4 > filelist.txt
#du -h *.mp4 | grep -v "4.0K" | awk '{print $2}' > filelist.txt #由于后期发现有的监控视频很小,所以要改。还有不能先awk print需要先grep再进行print
mkdir imageCut #cat filelist.txt | while read filename #此处属于莫名奇妙不能用while for filename in `cat filelist.txt` do pathname=$(echo $filename | cut -d "." -f1 ) echo $pathname mkdir $PWD/imageCut/$pathname echo "Process in $filename, and it will be set in $pathname" sleep 1 time=`ffprobe -v error -show_entries stream=width,height,bit_rate,duration -of default=noprint_wrappers=1 $filename | grep "duration" | cut -d "=" -f2 | cut -d "." -f1` #获取总的视频时长
middletime=`expr $time / 2 - 3` endtime=`expr $time - 3` echo $middletime m_time=$middletime-3 ffmpeg -ss 00:00 -t 3 -i $filename -q:v 2 -f image2 $PWD/imageCut/$pathname/imagehead-%d.jpg 2>>log.err #get the first 3 second image frames to des and log the err in current folder ffmpeg -ss $middletime -t 3 -i $filename -q:v 2 -f image2 $PWD/imageCut/$pathname/imagmiddle-%d.jpg 2>>log.err #get the middle 3 second image frames ffmpeg -ss $endtime -t 3 -i $filename -q:v 2 -f image2 $PWD/imageCut/$pathname/simageend-%d.jpg 2>>log.err #get the last 3 second image frames
#mv $(ls *.jpg) $PWD/imageCut/$pathname #这样的写法不严谨,脚本通用率就低了,你也不知道该目录下有没有其他img文件。直接在输出时定位过去。
done
rm -f filelist.txt
|
后来又分析了下errlog,发现中间有一些视频是不能抽取的,但是呢,总的抽取过程中,所有视频基本上都是226张左右,也就是说是正常的,但是6万多张图片中,大概800张抽取错误。现在分析是视频不完整导致的。