从摄像头录制视频实现

收藏两个头录视频demo之一:基于opencv实现

QT PRO文件需要加入:LIBS +=   -lopencv_core -lopencv_highgui,或者使用g++ 利用这个参数来编译非QT环境的代码。

#include <QCoreApplication>

#include <QtGui/QCloseEvent>

#include<opencv/cv.h>

#include<opencv/highgui.h>

void closeEvent(QCloseEvent *event);

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

cvNamedWindow("vedio");

CvCapture* capture = 0;

boolIsclose=true;

// 首先是要通过摄像设备来得到一个CvCapture对象

if(1 == argc)

{   // 从摄像头获取初始化对象CvCapture

capture = cvCreateCameraCapture(0);

}

else

{   // 从视频文件中获取初始化对象CvCapture

capture = cvCreateCameraCapture(atoi(argv[1]));

}

// 如果没有获取到有效的CvCapture对象,则返回 -1 终止程序运行

if(!capture)

{

return -1;

}

// QCloseEvent *closeEvent;

IplImage* frame;

//指定视频中每一帧的大小(我的摄像头拍摄下的图片均是160*120的)

CvSize size = cvSize(640,480);

//需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG  帧率设置为5

CvVideoWriter* videoWriter =

cvCreateVideoWriter("my.avi",CV_FOURCC(‘M‘,‘J‘,‘P‘,‘G‘),5,size);

char keyCode;

//每隔10ms,从摄像头中取出一帧

while((keyCode = cvWaitKey(10))&&Isclose)

{

if(keyCode == 27)

{

break;

}

//得到从摄像头中获取的帧

frame = cvQueryFrame(capture);

//将帧写入视频文件中

cvWriteFrame(videoWriter,frame);

cvShowImage("vedio",frame);

if(a.closingDown())

Isclose=false;

}

cvReleaseVideoWriter(&videoWriter);

cvReleaseImage(&frame);

cvDestroyWindow("video");

returna.exec();

}

效果如下:

这个图我就不传了,里面是我的头像。长得丑,怕吓到人。(Linux)

收藏两个摄像头录制视频的demo之二:基于QT实现

QT PRO文件需要加入如下:

QT       += multimedia multimediawidgets

程序我改为QT5.0.2版本

/*dialog.h*/

#ifndef DIALOG_H

#defineDIALOG_H

#include<QtWidgets/QDialog>

#include<QtMultimedia/QCamera>

#include<QtMultimediaWidgets/QCameraViewfinder>

#include<QtMultimedia/QMediaRecorder>

#include<QtWidgets/QPushButton>

#include <QtWidgets/QLabel>

namespace Ui {

class Dialog;

}

class Dialog : public QDialog

{

Q_OBJECT

public:

explicit Dialog(QWidget *parent = 0);

~Dialog();

publicslots:

voidrecordVideo();

voidchangeDuration(qint64 seconds);

voidpause();

void stop();

private:

Ui::Dialog *ui;

QCamera* camera;

QCameraViewfinder* viewfinder;

QMediaRecorder* mediaRecorder;

QPushButton* recordButton ;

QPushButton* pauseButton ;

QPushButton* stopButton;

QPushButton* exitButton;

QLabel* timeDisplay;

};

#endif// DIALOG_H

/*dialog.cpp*/

#include "dialog.h"

#include "ui/ui_dialog.h"

#include<QtWidgets/QHBoxLayout>

#include <QtWidgets/QVBoxLayout>

#include <QtWidgets/QPushButton>

#include<QUrl>

Dialog::Dialog(QWidget *parent) :

QDialog(parent),

ui(new Ui::Dialog)

{

// ui->setupUi(this);

QByteArray cameraDevice = QCamera::availableDevices()[0];

camera = new QCamera(cameraDevice);

QHBoxLayout* layout = new QHBoxLayout;

viewfinder = new QCameraViewfinder(this);

viewfinder->resize(640,480);

QVBoxLayout* vLayout = new QVBoxLayout ;

recordButton = new QPushButton("record", this);

pauseButton = new QPushButton("pause", this);

stopButton = new QPushButton("stop", this);

exitButton = new QPushButton("exit", this);

timeDisplay = new QLabel(this);

vLayout->addWidget(recordButton);

vLayout->addWidget(pauseButton);

vLayout->addWidget(stopButton);

vLayout->addWidget(timeDisplay);

vLayout->addWidget(exitButton);

connect(recordButton, SIGNAL(clicked()), this, SLOT(recordVideo()));

connect(pauseButton,SIGNAL(clicked()),this, SLOT(pause()));

connect(stopButton,SIGNAL(clicked()), this,SLOT(stop()));

connect(exitButton,SIGNAL(clicked()), this, SLOT(close()));

layout->addWidget(viewfinder);

layout->addLayout(vLayout);

camera->setViewfinder(viewfinder);

camera->setCaptureMode(QCamera::CaptureVideo);

camera->start();

mediaRecorder = new QMediaRecorder(camera);

connect(mediaRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(changeDuration(qint64)));

setLayout(layout);

}

Dialog::~Dialog()

{

deletemediaRecorder;

delete camera;

}

void Dialog:: recordVideo()

{

qDebug() << "record video";

mediaRecorder->setOutputLocation(QUrl("/home/zhanghaijun/testclip"));

mediaRecorder->record();

//QString str = QString("Recorded %1 sec").arg(mediaRecorder->duration());

//timeLabel->setText(str);

}

void Dialog:: changeDuration(qint64 seconds)

{

qDebug() << seconds;

//QString str = QString("Recorded %1 sec").arg(seconds);

timeDisplay->setNum(int(seconds));

}

voidDialog::pause()

{

qDebug() << "pause";

mediaRecorder->pause();

}

void Dialog::stop()

{

mediaRecorder->stop();

}

效果图如下:

这个也不传。

两个对比了下,个人感觉QT的类库做的比Opencv效果处理会更好点,在相同的灯光下会明显感觉清晰。本来还有个基于v4l2的demo,一直没调试出来。以后有时间再学习下。这两个都实现的是录像功能,但是在视频内加入声音还没有实现,这也等以后有时间来实现下。

时间: 2024-08-08 09:19:36

从摄像头录制视频实现的相关文章

win8 metro 调用摄像头录制视频并将视频保存在相应的位置

上一篇文章介绍了在win8 metro 调用摄像头拍摄照片并将照片保存在相应的位置的功能,那么这一片文章主要介绍了的就是录制视频了,其实这个差不多,所用的思想也是一样的,因为图片和视频都可以转化为流文件,那么它们本质上都是一样的,但是还是有个别地方时不同的,接下来我们就介绍一下这个别地方的不同吧 下面是metro UI的代码: <Page x:Class="Camera1.MainPage" xmlns="http://schemas.microsoft.com/win

ffmpeg命令 从网络摄像头录制视频

安装 sudo apt-get install ffmpeg 录制视频为record.mp4文件 ffmpeg -y -i rtsp://cameral_ip:port -vcodec copy -acodec copy -f mp4 record.mp4 原文地址:https://www.cnblogs.com/xbit/p/10335140.html

前置摄像头后台视频录制,即可以自动拍摄也可以手动干涉,实现完全控制

package com.example.recorddemo; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; im

Android切换前后置摄像头并录制视频

效果图: java代码: /** * RecordActivity.java * 版权所有(C) 2013 * 创建:cuiran 2013-10-15 下午3:20:45 */ package com.app931.oa.activity.video; import java.io.IOException; import java.util.List; import com.app931.oa.R; import com.app931.oa.util.LogsUtil; import com.

在Ubuntu上录制视频和编辑(很全)

Linux多媒体三剑客:GIMP,Inkscape,Blender3D Blender基金会制作的开源微电影Sintel:http://www.sintel.org/about电影采用Creative Commons Attribution 3.0授权.整个电影的制作,完全采用开源软件.使用64位Linux的图形工作站,用Blender进行3D图形,合成和视频编辑任务,用GIMP和Inkscape作图和绘画,在OpenEXR中渲染输出,用Python写脚本,在SVN中储存数据等等. 在Ubunt

Android开发之打开闪光灯录制视频

Android的SDK在线API上对录制视频的方法.步骤都写得非常清楚,但是如果没有一点思路,写起来也比较式费事.录制视频的全过程要打开闪光灯(可能是因为项目需要,或者特殊原因),则必须按照一定的顺序进行开关,毕竟容易出错.要实现录制的同时开启闪光灯也不难,官方API给出了一个大体的步骤.因为要采集点视频数据,临时写了个简单的Demo学习下,必要时再深度开发. 首先在工程中的AndroidManifest.xml中添加权限声明,因为要使用到摄像头,故需要添加Camera的相关权限,另外还需要写S

3D图片采集与展示(SurfaceView 自适应 Camera, 录制视频, 抽取帧)

      最近在做一个3D图片采集与展示. 主要功能为:自定义Camera(google 已经摈弃了Camera, 推荐使用Camera2,后续篇幅,我将会用Camera2取代Camera),围绕一个物体360度录制一个视频,然后在该视频抽取一定数量的帧,保存为图片存放.最后在一个Activity页面展示第一张图片,通过滑动或点击切换下一张图片,从而形成用图片展示的3D效果.该项目主要的目的是采集3D图片素材,然后上传到服务器处理,最终在用户客户端或网页端展示是通过OpenGL ES处理而来.

Android使用的开发MediaRecorder录制视频

MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用MediaRecorder录制视频与录制音频的步骤基本同样.仅仅是录制视频时不仅须要採集声音.还须要採集图像.为了让MediaRecorder录制时採集图像,应该在调用setAudioSource(int audio source)方法时再调用setVideoSource(int video source)方法来设置

Android录制视频

我们一般直接从摄像头和麦克风取数据,经过编码,保存为文件.android的视频录制需要使用到MediaRecorder,MediaRecorder除了可以用于录制音频,还可用于录制视频. 效果图如下图所示: 一个为录制过程中,可以看到屏幕上方的录制时间显示,后一个为停止录制视频. 然后录制好的视频可以在手机的SD卡中找到,如下图所示: 视频录制步骤: 1) 调用MediaRecorder 对象的setVideoEncoder().setVideoEncodingBitRate(intbitRat