qt5 采集摄像头的视音频
2015-07-31 17:48
519 查看
本程序是通过使用QT+VS2010调用windows摄像头,QCamera采集视频帧,通过QAudioInput采集音频,将采集的视频格式RGB32通过传递内存使用ffmpeg将RGB32
实时转换为yuv420p,并分别将视频与音频分别保存为yuv文件和pcm文件。
视频采集设置每一帧数据 myvideosurface.h
#ifndef MYVIDEOSURFACE_H
#define MYVIDEOSURFACE_H
#include <QObject>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QMediaRecorder>
#include <QAudioEncoderSettings>
#include <QAbstractVideoSurface>
#include <QVideoSurfaceFormat>
#include <QVideoFrame>
#include <QUrl>
#include <QAbstractVideoSurface>
#include <QVideoProbe>
#include <QCamera>
class CCaptureVideoFrame : public QAbstractVideoSurface
{
Q_OBJECT
public:
explicit CCaptureVideoFrame(QObject *parent = 0);
virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const;
bool setSource(QCamera *pCamera);
signals:
//视频帧捕获信号
void CaptureFrame(const QVideoFrame& frame);
public slots:
virtual bool present(const QVideoFrame &frame);
virtual bool start(const QVideoSurfaceFormat & format);
private:
QVideoProbe m_Probe;//android下,目前只能用probe捕获视频
};
#endif // MYVIDEOSURFACE_H
myvideosurface.cpp
#include <QCamera>
#include "myvideosurface.h"
CCaptureVideoFrame::CCaptureVideoFrame(QObject *parent) :
QAbstractVideoSurface(parent)
{
}
QList<QVideoFrame::PixelFormat> CCaptureVideoFrame::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{
Q_UNUSED(handleType);
QList<QVideoFrame::PixelFormat> lst;
//lst.push_back(QVideoFrame::Format_YUYV);//Qt现在不支持此格式,因为Qt内部用了QImage来处理视频帧。
lst.push_back(QVideoFrame::Format_RGB32);
lst.push_back(QVideoFrame::Format_BGR32);
return lst;
}
//捕获视频帧。windows下格式是RGB32;android下是NV21
bool CCaptureVideoFrame::present(const QVideoFrame &frame)
{
//frame.map(QAbstractVideoBuffer::ReadOnly);
QVideoSurfaceFormat format = surfaceFormat();
//qDebug("frameRate=%d,frameHeight=%d,frameSize=%d\n",format.frameRate(),format.frameHeight(),format.frameSize());
emit CaptureFrame(frame);
return true;
}
//根据不同的平台,设置捕获方式
bool CCaptureVideoFrame::setSource(QCamera *pCamera)
{
bool ret = true;
#ifdef ANDROID
//android下,目前只能用probe捕获视频
ret = m_Probe.setSource(pCamera);
if(ret)
{
connect(&m_Probe, SIGNAL(videoFrameProbed(QVideoFrame)),
SLOT(present(QVideoFrame)));
}
#else
//windows下,只能用下面方式捕获视频
pCamera->setViewfinder(this);
#endif
return ret;
}
bool CCaptureVideoFrame::start(const QVideoSurfaceFormat & format)
{
qDebug("frameRate=%f\n",format.frameRate());
return true;
}
音频采集主要代码:
QAudioFormat format;
// Set up the desired format, for example:
format.setSampleRate(44100);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
qWarning() << "Default format not supported, trying to use the nearest.";
format = info.nearestFormat(format);
}
audio = new QAudioInput(format, this);
audio->start(&destinationFile);
博客内有完整工程代码。
实时转换为yuv420p,并分别将视频与音频分别保存为yuv文件和pcm文件。
视频采集设置每一帧数据 myvideosurface.h
#ifndef MYVIDEOSURFACE_H
#define MYVIDEOSURFACE_H
#include <QObject>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QMediaRecorder>
#include <QAudioEncoderSettings>
#include <QAbstractVideoSurface>
#include <QVideoSurfaceFormat>
#include <QVideoFrame>
#include <QUrl>
#include <QAbstractVideoSurface>
#include <QVideoProbe>
#include <QCamera>
class CCaptureVideoFrame : public QAbstractVideoSurface
{
Q_OBJECT
public:
explicit CCaptureVideoFrame(QObject *parent = 0);
virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const;
bool setSource(QCamera *pCamera);
signals:
//视频帧捕获信号
void CaptureFrame(const QVideoFrame& frame);
public slots:
virtual bool present(const QVideoFrame &frame);
virtual bool start(const QVideoSurfaceFormat & format);
private:
QVideoProbe m_Probe;//android下,目前只能用probe捕获视频
};
#endif // MYVIDEOSURFACE_H
myvideosurface.cpp
#include <QCamera>
#include "myvideosurface.h"
CCaptureVideoFrame::CCaptureVideoFrame(QObject *parent) :
QAbstractVideoSurface(parent)
{
}
QList<QVideoFrame::PixelFormat> CCaptureVideoFrame::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{
Q_UNUSED(handleType);
QList<QVideoFrame::PixelFormat> lst;
//lst.push_back(QVideoFrame::Format_YUYV);//Qt现在不支持此格式,因为Qt内部用了QImage来处理视频帧。
lst.push_back(QVideoFrame::Format_RGB32);
lst.push_back(QVideoFrame::Format_BGR32);
return lst;
}
//捕获视频帧。windows下格式是RGB32;android下是NV21
bool CCaptureVideoFrame::present(const QVideoFrame &frame)
{
//frame.map(QAbstractVideoBuffer::ReadOnly);
QVideoSurfaceFormat format = surfaceFormat();
//qDebug("frameRate=%d,frameHeight=%d,frameSize=%d\n",format.frameRate(),format.frameHeight(),format.frameSize());
emit CaptureFrame(frame);
return true;
}
//根据不同的平台,设置捕获方式
bool CCaptureVideoFrame::setSource(QCamera *pCamera)
{
bool ret = true;
#ifdef ANDROID
//android下,目前只能用probe捕获视频
ret = m_Probe.setSource(pCamera);
if(ret)
{
connect(&m_Probe, SIGNAL(videoFrameProbed(QVideoFrame)),
SLOT(present(QVideoFrame)));
}
#else
//windows下,只能用下面方式捕获视频
pCamera->setViewfinder(this);
#endif
return ret;
}
bool CCaptureVideoFrame::start(const QVideoSurfaceFormat & format)
{
qDebug("frameRate=%f\n",format.frameRate());
return true;
}
音频采集主要代码:
QAudioFormat format;
// Set up the desired format, for example:
format.setSampleRate(44100);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
qWarning() << "Default format not supported, trying to use the nearest.";
format = info.nearestFormat(format);
}
audio = new QAudioInput(format, this);
audio->start(&destinationFile);
博客内有完整工程代码。
相关文章推荐
- 使用qmake交叉编译一个桌面qt工程
- Qt的窗口的最大化。
- Qt5.4(later)树莓派2 交叉编译环境搭建
- qtcreator 交叉编译 配置
- 关于Qt的MVC
- Qt中定时器的使用
- Qt 5.3 下OpenCV 2.4.11 开发(7)单通道直方图绘制
- Qt归纳(四)
- Qt归纳(三)
- Qt归纳(二)
- Qt归纳(一)
- Qt重绘之update,repaint详解
- vs2013+qt+opencv3.0配置
- Qt - OpenCV的安装与配置 (win7 64 bit + OpenCV3.0 + minGW32)
- Qt获取组合键
- qt最简单的写文件代码linux最简单的写文件代码
- QT foreach 和 QTextCodec
- Qt以及Qt Designer怎样加入资源文件
- Qt窗体关闭时,如何自动销毁窗体类对象
- 使用Qt显示openCV矩阵图片