平时都用opencv来解析视频流,但opencv集成的ffmpeg对比如h.264格式确不支持,因而还得使用ffmpeg。下面列出几种实用的用法:
ffmpeg工作流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
从上图可知,ffmpeg先是从输入文件中读取编码的数据包,然后再解码。
获取视频的相关信息
1
ffmpeg i input.mp4
输出的结果:
1
2
3
4
5
6
7
8
9
10
11
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : hikvision
encoder : Lavf57.83.100
Duration: 00:01:31.28, start: 0.000000, bitrate: 1007 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1280x720, 1006 kb/s, 25.07 fps, 25 tbr, 90k tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
从以上的输出可以获取视频的帧率是25,分辨率是1280*760,时长是1分31秒。
从视频流中抽取图片
1
ffmpeg -i input.mp4 %04d.png
表示从视频流中顺序的抽取图片,图片的格式为0001.png, 0002.png, 0003.png…..
以固定的帧率抽取图片
1
ffmpeg -i input.mp4 -vf fps=1 %04d.png
表示将以帧率为1的速率从视频中抽取图片。
以固定的速率抽取图片
1
ffmpeg -i input.mp4 -vf fps=1/4 %04d.png
表示以每4秒抽1张的速率从视频中抽取图片。
抽取固定时间段的视频
1
2
3
ffmpeg -ss 00:00:04 -i input.mp4 %04d.png
ffmpeg -ss 00:00:04 -i -t 2 input.mp4 %04d.png
ffmpeg -ss 00:00:04.0 -i -to 00:00:06.0 input.mp4 %04d.png
表示从第4秒开始抽取图片,而-t表示抽取2s,-to表示抽取到第6秒。
抽取一帧
1
ffmpeg -ss 00:00:04 -i input.mp4 -frames:v 1 screen.png
表示抽取第四秒的那一帧图片。
自定义分辨率
1
2
ffmpeg -i input.mp4 -s 640x480 %04d.png
ffmpeg -i input.mp4 -vf scale=640:-1 %04d.png
前者表示固定的640x480分辨率抽取图片,后者表示保持长宽比,缩放到640x357.
reference
[1]https://www.bannerbear.com/blog/how-to-extract-images-from-a-video-using-ffmpeg/ [2]https://ffmpeg.org/ffmpeg.html