区块链技术博客
www.b2bchain.cn

修订.多媒体开发(10):提取图片以及位图保存求职学习资料

本文介绍了修订.多媒体开发(10):提取图片以及位图保存求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

小白:提取视频中的图片吗?那很简单,播放视频再截图就行啦。

播放视频再截图的做法,当然可以。但是,手动截图会太累而且无法保证准确度,特别是需要反复提取图片时,或者需要提取“105秒那一瞬间的美女图片”时,或者我需要每秒出一张图片时,那有别的办法吗?

本文介绍,如何使用FFmpeg实现从视频中提取图片的功能。

一般使用FFmpeg的方式,有两种,一种是使用FFmpeg的命令(也就是调用ffmpeg这个程序),另一种是调用FFmpeg的库文件。这里小程同样从命令行以及代码调用这两种方式,进行介绍。

(一)使用FFmpeg命令来解决问题

在安装FFmpeg后,打个命令就可以实现这个功能。对于FFmpeg的安装或调试,之前介绍过。

提取图片可以这样,比如:

ffmpeg -ss 00:00:5 -i moments.mp4 -vframes 1 -f image2 -y a.png

参数的意思是这样的:

ss表示开始提取图片的时间点,既可以用时分秒格式,也可以是多少秒。
如果使用到这个参数,那应该把它作为第一个参数,因为可以让FFmpeg提速。

i表示输入文件,就是视频文件。
vframes表示拿多少帧,也就是多少张图片。注意,这个参数要放在-i参数之后。
f表示提取出来的图片的格式。
y表示覆盖已有同名的图片。

再比如,可以这样:

ffmpeg -i xxx.mp4 -r 1 -y -f image2 -t 5 -s 240*320 pc%3d.jpg

参数的意思是这样的:

r表示每秒提取图片的帧数,即帧率,默认是25fps,上面设置为一秒拿一张图。
t表现持续提取多少秒,也可以用时分秒的格式来表示。
s表出来的图片的尺寸。
3%d表示以001、002这样的格式来命名输出的图片。

于是,

小白:那么说,如果我发现视频某个时间点有美女的话,那我就可以用ss从这个时间点再前一点,然后用t来持续提取5秒,或者用vframes来提取几十张,那就准没漏了!也就是这样:

ffmpeg -ss 10 -t 5 -r 1 -i Movie-1.mp4 -f image2 -y pc-temp/image%3d.jpg

小白:看,这是提取到的美女图:

修订.多媒体开发(10):提取图片以及位图保存

另一方面,你在提取到若干成图片后,有可能想把这些图片编码成视频,这时同样可以借助FFmpeg命令来完成。需要注意,图片变成视频,是需要视频编码器的,所以在安装FFmpeg时需要把视频编码器也带上(比如x264),这个之前有所介绍。

把图片编码成视频的命令是这样的:

ffmpeg -f image2 -i img%3d.jpg test.mp4

img%d表示以”img001″, “img002″这种命名的文件(也就是之前提取出来的图片),按顺序使用。注意f参数要在i参数之前。

你可能觉得mp4格式没有gif格式通用,于是又有了把mp4转成gif动态图的需求,这时还是可以敲打ffmpeg命令:

ffmpeg -i hello.mp4 hello.gif

当然这只是简单地把mp4转成gif,你也可以加上分辨率、码率之类的参数来控制,这里不细说。

(二)写代码调用FFmpeg库来解决问题

通过写代码调用FFmpeg库的方式来提取图片,并且保存成24bit的位图。

小程先贴上演示代码,再在后面做一些解释:

#include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include <stdio.h> #include <stdlib.h>  typedef struct {     unsigned int filesize;     unsigned short reserved1;     unsigned short reserved2;     unsigned int dataoffset; }BITMAP_FILE_HEADER;  typedef struct {     unsigned int infosize;     int width;     int height;     unsigned short planecount;     unsigned short bitcount;     unsigned int compressiontype;     unsigned int imagedatasize;     int xpixpermeter;     int ypixpermeter;     unsigned int colorusedcount;     unsigned int colorimportantcount; }BITMAP_INFO;  void extractpicture(const char* filepath) {     av_register_all();     av_log_set_level(AV_LOG_DEBUG);     AVFormatContext* formatContext = avformat_alloc_context();     int status = 0;     int success = 0;     int videostreamidx = -1;     AVCodecContext* codecContext = NULL;     status = avformat_open_input(&formatContext, filepath, NULL, NULL);     if (status == 0) {         status = avformat_find_stream_info(formatContext, NULL);         if (status >= 0) {             for (int i = 0; i < formatContext->nb_streams; i ++) {                 if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {                     videostreamidx = i;                     break;                 }             }             if (videostreamidx > -1) {                 codecContext = formatContext->streams[videostreamidx]->codec;                 AVCodec* codec = avcodec_find_decoder(codecContext->codec_id);                 if (codec) {                     status = avcodec_open2(codecContext, codec, NULL);

小白:提取视频中的图片吗?那很简单,播放视频再截图就行啦。

播放视频再截图的做法,当然可以。但是,手动截图会太累而且无法保证准确度,特别是需要反复提取图片时,或者需要提取“105秒那一瞬间的美女图片”时,或者我需要每秒出一张图片时,那有别的办法吗?

本文介绍,如何使用FFmpeg实现从视频中提取图片的功能。

一般使用FFmpeg的方式,有两种,一种是使用FFmpeg的命令(也就是调用ffmpeg这个程序),另一种是调用FFmpeg的库文件。这里小程同样从命令行以及代码调用这两种方式,进行介绍。

(一)使用FFmpeg命令来解决问题

在安装FFmpeg后,打个命令就可以实现这个功能。对于FFmpeg的安装或调试,之前介绍过。

提取图片可以这样,比如:

ffmpeg -ss 00:00:5 -i moments.mp4 -vframes 1 -f image2 -y a.png

参数的意思是这样的:

ss表示开始提取图片的时间点,既可以用时分秒格式,也可以是多少秒。
如果使用到这个参数,那应该把它作为第一个参数,因为可以让FFmpeg提速。

i表示输入文件,就是视频文件。
vframes表示拿多少帧,也就是多少张图片。注意,这个参数要放在-i参数之后。
f表示提取出来的图片的格式。
y表示覆盖已有同名的图片。

再比如,可以这样:

ffmpeg -i xxx.mp4 -r 1 -y -f image2 -t 5 -s 240*320 pc%3d.jpg

参数的意思是这样的:

r表示每秒提取图片的帧数,即帧率,默认是25fps,上面设置为一秒拿一张图。
t表现持续提取多少秒,也可以用时分秒的格式来表示。
s表出来的图片的尺寸。
3%d表示以001、002这样的格式来命名输出的图片。

于是,

小白:那么说,如果我发现视频某个时间点有美女的话,那我就可以用ss从这个时间点再前一点,然后用t来持续提取5秒,或者用vframes来提取几十张,那就准没漏了!也就是这样:

ffmpeg -ss 10 -t 5 -r 1 -i Movie-1.mp4 -f image2 -y pc-temp/image%3d.jpg

小白:看,这是提取到的美女图:

修订.多媒体开发(10):提取图片以及位图保存

另一方面,你在提取到若干成图片后,有可能想把这些图片编码成视频,这时同样可以借助FFmpeg命令来完成。需要注意,图片变成视频,是需要视频编码器的,所以在安装FFmpeg时需要把视频编码器也带上(比如x264),这个之前有所介绍。

把图片编码成视频的命令是这样的:

ffmpeg -f image2 -i img%3d.jpg test.mp4

img%d表示以”img001″, “img002″这种命名的文件(也就是之前提取出来的图片),按顺序使用。注意f参数要在i参数之前。

你可能觉得mp4格式没有gif格式通用,于是又有了把mp4转成gif动态图的需求,这时还是可以敲打ffmpeg命令:

ffmpeg -i hello.mp4 hello.gif

当然这只是简单地把mp4转成gif,你也可以加上分辨率、码率之类的参数来控制,这里不细说。

(二)写代码调用FFmpeg库来解决问题

通过写代码调用FFmpeg库的方式来提取图片,并且保存成24bit的位图。

小程先贴上演示代码,再在后面做一些解释:

#include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include <stdio.h> #include <stdlib.h>  typedef struct {     unsigned int filesize;     unsigned short reserved1;     unsigned short reserved2;     unsigned int dataoffset; }BITMAP_FILE_HEADER;  typedef struct {     unsigned int infosize;     int width;     int height;     unsigned short planecount;     unsigned short bitcount;     unsigned int compressiontype;     unsigned int imagedatasize;     int xpixpermeter;     int ypixpermeter;     unsigned int colorusedcount;     unsigned int colorimportantcount; }BITMAP_INFO;  void extractpicture(const char* filepath) {     av_register_all();     av_log_set_level(AV_LOG_DEBUG);     AVFormatContext* formatContext = avformat_alloc_context();     int status = 0;     int success = 0;     int videostreamidx = -1;     AVCodecContext* codecContext = NULL;     status = avformat_open_input(&formatContext, filepath, NULL, NULL);     if (status == 0) {         status = avformat_find_stream_info(formatContext, NULL);         if (status >= 0) {             for (int i = 0; i < formatContext->nb_streams; i ++) {                 if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {                     videostreamidx = i;                     break;                 }             }             if (videostreamidx > -1) {                 codecContext = formatContext->streams[videostreamidx]->codec;                 AVCodec* codec = avcodec_find_decoder(codecContext->codec_id);                 if (codec) {                     status = avcodec_open2(codecContext, codec, NULL);

小白:提取视频中的图片吗?那很简单,播放视频再截图就行啦。

播放视频再截图的做法,当然可以。但是,手动截图会太累而且无法保证准确度,特别是需要反复提取图片时,或者需要提取“105秒那一瞬间的美女图片”时,或者我需要每秒出一张图片时,那有别的办法吗?

本文介绍,如何使用FFmpeg实现从视频中提取图片的功能。

一般使用FFmpeg的方式,有两种,一种是使用FFmpeg的命令(也就是调用ffmpeg这个程序),另一种是调用FFmpeg的库文件。这里小程同样从命令行以及代码调用这两种方式,进行介绍。

(一)使用FFmpeg命令来解决问题

在安装FFmpeg后,打个命令就可以实现这个功能。对于FFmpeg的安装或调试,之前介绍过。

提取图片可以这样,比如:

ffmpeg -ss 00:00:5 -i moments.mp4 -vframes 1 -f image2 -y a.png

参数的意思是这样的:

ss表示开始提取图片的时间点,既可以用时分秒格式,也可以是多少秒。
如果使用到这个参数,那应该把它作为第一个参数,因为可以让FFmpeg提速。

i表示输入文件,就是视频文件。
vframes表示拿多少帧,也就是多少张图片。注意,这个参数要放在-i参数之后。
f表示提取出来的图片的格式。
y表示覆盖已有同名的图片。

再比如,可以这样:

ffmpeg -i xxx.mp4 -r 1 -y -f image2 -t 5 -s 240*320 pc%3d.jpg

参数的意思是这样的:

r表示每秒提取图片的帧数,即帧率,默认是25fps,上面设置为一秒拿一张图。
t表现持续提取多少秒,也可以用时分秒的格式来表示。
s表出来的图片的尺寸。
3%d表示以001、002这样的格式来命名输出的图片。

于是,

小白:那么说,如果我发现视频某个时间点有美女的话,那我就可以用ss从这个时间点再前一点,然后用t来持续提取5秒,或者用vframes来提取几十张,那就准没漏了!也就是这样:

ffmpeg -ss 10 -t 5 -r 1 -i Movie-1.mp4 -f image2 -y pc-temp/image%3d.jpg

小白:看,这是提取到的美女图:

修订.多媒体开发(10):提取图片以及位图保存

另一方面,你在提取到若干成图片后,有可能想把这些图片编码成视频,这时同样可以借助FFmpeg命令来完成。需要注意,图片变成视频,是需要视频编码器的,所以在安装FFmpeg时需要把视频编码器也带上(比如x264),这个之前有所介绍。

把图片编码成视频的命令是这样的:

ffmpeg -f image2 -i img%3d.jpg test.mp4

img%d表示以”img001″, “img002″这种命名的文件(也就是之前提取出来的图片),按顺序使用。注意f参数要在i参数之前。

你可能觉得mp4格式没有gif格式通用,于是又有了把mp4转成gif动态图的需求,这时还是可以敲打ffmpeg命令:

ffmpeg -i hello.mp4 hello.gif

当然这只是简单地把mp4转成gif,你也可以加上分辨率、码率之类的参数来控制,这里不细说。

(二)写代码调用FFmpeg库来解决问题

通过写代码调用FFmpeg库的方式来提取图片,并且保存成24bit的位图。

小程先贴上演示代码,再在后面做一些解释:

#include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include <stdio.h> #include <stdlib.h>  typedef struct {     unsigned int filesize;     unsigned short reserved1;     unsigned short reserved2;     unsigned int dataoffset; }BITMAP_FILE_HEADER;  typedef struct {     unsigned int infosize;     int width;     int height;     unsigned short planecount;     unsigned short bitcount;     unsigned int compressiontype;     unsigned int imagedatasize;     int xpixpermeter;     int ypixpermeter;     unsigned int colorusedcount;     unsigned int colorimportantcount; }BITMAP_INFO;  void extractpicture(const char* filepath) {     av_register_all();     av_log_set_level(AV_LOG_DEBUG);     AVFormatContext* formatContext = avformat_alloc_context();     int status = 0;     int success = 0;     int videostreamidx = -1;     AVCodecContext* codecContext = NULL;     status = avformat_open_input(&formatContext, filepath, NULL, NULL);     if (status == 0) {         status = avformat_find_stream_info(formatContext, NULL);         if (status >= 0) {             for (int i = 0; i < formatContext->nb_streams; i ++) {                 if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {                     videostreamidx = i;                     break;                 }             }             if (videostreamidx > -1) {                 codecContext = formatContext->streams[videostreamidx]->codec;                 AVCodec* codec = avcodec_find_decoder(codecContext->codec_id);                 if (codec) {                     status = avcodec_open2(codecContext, codec, NULL);

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 修订.多媒体开发(10):提取图片以及位图保存求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们