windows运行ffmeg工具
cd到ffmpeg 目录下
命令
ffmpeg -i 文件名.mp4 -vn -c copy 1.mp3 //抽取音频文件 抽取视频换成 -an
ffmpeg -ss 0:0:30 -t 0:0:5 -input.mp3 -c copy output.mp3 //从一段mp3 中截取一段(5s)mp3
ffmpeg.exe -i 1.mp3 -i 1.mp4 -c copy 2.mp4 //将音频和视频合并
opencv基本使用&&opencv基本安装
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main(int argc, char* argv[])
{
Mat image1 = imread("1.png");
imwrite("5.png",image1);//保存这张图片
Mat src = imread("2.png");
Mat image;
//Rect rect(0, 0, 100, 100);//矩形截取这个图片
//Mat src = src1(rect);//利用这个矩形来构造mat
//cvtColor(image, image, COLOR_BGR2GRAY);//灰度图的转换
//threshold(image, image, 100, 255,THRESH_BINARY);//二进制阈值化
//saturate_cast<uchar>(这里可以是函数);//防止值溢出1个字节得函数 如果溢出就被设置为255
//image.convertTo(image, -1, 2.0, 50);//改变图片得对比度和亮度参数一目标图片 参数2表示图片类型 -1就是当前类型 参数3 4亮度和对比度
//image.type();//指图像得类型 是灰度图还是grb图像
//image.create(Size(), image.type());//生成创建空间
//resize(image, image, Size(300, 300), 0, 0, INTER_NEAREST);//重定义图片得大小 4 5参数表示比例 6表示用什么算法 INTER_LINEAR另一种算法这种算法在处理放大时不会模糊
//pyrDown(image, image);//高斯金字塔向下采样 图像越来越小就是图像按照比例缩小 缩小一半
//pyrUp(image, image);//拉普拉斯金字塔向上采集 图像越来越大 美调用一次增大一倍
//float a = 0.5;
//resize(src, src, image1.size());//调整resize的大小
//addWeighted(image1, a, src, 1-a, 80, image);//合并两张图片第2 4为透明度,参数5为帧义(亮度) 6为目标图片
//rotate(image1, image1, ROTATE_180);//顺时针选择180度
//flip(image1, image1, 1);//镜像 0表示对x轴镜像1表示对y轴做镜像-1表示x y都做镜像
//将两张图片并排显示
Mat img1 = imread("1.png");
Mat img2 = imread("2.png");
int height = img1.rows;
int width1 = img1.cols;
int width2 = img2.cols;
// 将高图像等比缩放与低图像高度一致
if (img1.rows > img2.rows)
{
height = img2.rows;
width1 = img1.cols * ((float)img2.rows / (float)img1.rows);
resize(img1, img1, Size(width1, height));
}
else if (img1.rows < img2.rows)
{
width2 = img2.cols * ((float)img1.rows / (float)img2.rows);
resize(img2, img2, Size(width2, height));
}
//创建目标Mat
Mat des;
des.create(height, width1 + width2, img1.type());
Mat r1 = des(Rect(0, 0, width1, height));
img1.copyTo(r1);
Mat r2 = des(Rect(width1, 0, width2, height));
img2.copyTo(r2);//将两张图片并排显示*/
namedWindow("img");//创建窗口
imshow("img", des);//窗口显示图片
waitKey(0);//等待按键刷新显示的图像
return 0;
}
/*********************************************************************
* 配置opencv
* 下载opencv440
* 在x64下的/c15下的lib目录 opencv_world440d.lib这个文件放到当前目录,(dll动态链接库 链接器写lib)
* 在opencv目录下将include目录拷到当前目录
* 在x64下的/c15下的bin目录拷到当前目录 ( 这里需添加opencv_ffmpeg440.dll openh264-1.6.0-win32msvc.dll<没有可以去下载> opencv_world440.dll )
* 当前项目选择配置包含目录 包含库目录
* 连接器选择opencv_world440d.lib这个库文件即可
qt配置第三方库
pro文件 添加库,选择lib问添加,更改头文件
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../ku/face-sdk-demo/third_party/libzip/x64/ -lzip
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../ku/face-sdk-demo/third_party/libzip/x64/ -lzipd
INCLUDEPATH += $$PWD/../../ku/face-sdk-demo/third_party/libzip/x64
DEPENDPATH += $$PWD/../../ku/face-sdk-demo/third_party/libzip/x64
***********************************************************************/
//视频播放
int main(int argc, char* argv[])
{
#include<videoio.hpp>
VideoCapture video;//打开摄像头或播放视频得类
//bool open(int index api 这里是一个宏);//打开摄像头 视频流文件//同一个类型
//VideoCapture Vi(int index);//构造函数方式打开
video.open("1.mp4");//打开当前目录文件
if (!video.isOpened())//如果打开不成功//如果打开不成功可能是opencv_ffmpeg440.dll得库没有加载到当前目录
{
cout << "打开失败了" << endl;
getchar();
}
namedWindow("video");//创建窗口
/*********************************
*视频文件得属性
**********************************/
int s = 30;//刷帧时间
int fps = video.get(CAP_PROP_FPS);//获取视频得帧速率
int fcount = video.get(CAP_PROP_FRAME_COUNT);//获取视频总帧数
if (fps != 0)
{
s = 1000 / fps;//刷帧时间重定义
int fs = fcount / fps;//视频得总秒数
}
Mat frame;//读取得一帧数据
for (;;)//读取数据
{
//方式1
/*if (!video.read(frame))//读取一帧视频判断是否读取结束
//注意这个函数里包括读一帧解码 和转换格式 这两个又独立得函数可以独立调用当每秒有300帧可以只转换60帧也是比较流畅得
{
break;
}
if (frame.empty())break;//判断是否为空 用这个来判断读取视频是否结束
imshow("video", frame);//显示一帧
waitKey(5);//5毫秒一帧*/
//方式2
if (!video.grab())//读一帧并解码 读帧解码可能做好几次 转换格式可能只做一次当一秒超过300帧
{
break;
}
if(!video.retrieve(frame))//rgb转换格式
{
break;
}
int cur = video.get(CAP_PROP_POS_FRAMES);//获取当前得帧位置
if (cur == fcount - 1)//如果当前帧数等于总帧数
{
video.set(CAP_PROP_POS_FRAMES, 0);//就把当前帧数设置为0 从头开始播放
continue;
}
if (frame.empty())break;//判断是否为空 用这个来判断读取视频是否结束
imshow("video", frame);//显示一帧
waitKey(s);//5毫秒一帧
}
getchar();
video.release();//关闭
return 0;
}
//摄像头录制视频
int main(int argc, char* argv[])
{
#include<videoio.hpp>
VideoCapture video(0);//打开摄像头
if (!video.isOpened())//如果打开不成功//如果打开不成功可能是opencv_ffmpeg440.dll得库没有加载到当前目录
{
cout << "打开失败了" << endl;
getchar();
}
namedWindow("video");//创建窗口
Mat img;//读取得一帧数据
for (;;)//相机取帧 并写入到文件
{
video.read(img);//从相机中读取一帧数据到img
if (img.empty())break;//判断是否为空 用这个来判断读取视频是否结束
if (waitKey(5) == 'q')break;//5毫秒检测一次如果按下q就退出
imshow("video", img);//显示内容
VideoWriter vw;//视频写入器
int fps = video.get(CAP_PROP_FPS);//获取相机得速率
if (fps <= 0)fps = 25;//如果速率获取不到就设置为25
//创建一个视频以h2468格式指定视频得宽高就是一帧图片得宽高 最后一个参数表示颜色是rgb 这边必须一致如果是灰度图那么mat也应该是灰度图
vw.open("out.avi", VideoWriter::fourcc('h', '2', '6', '4'), fps, Size(video.get(CAP_PROP_XI_WIDTH),video.get(CAP_PROP_XI_HEIGHT)),true);
if (vw.isOpened())
{
cout << "创建视频错误了" << endl;//需下载openh264得库拷到当前目录
}
vw.write(img);//写入一帧图片
}
video.release();//关闭
return 0;
}