关键词:
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954626
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(二) https://xiaolong.blog.csdn.net/article/details/126958188
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(三) https://xiaolong.blog.csdn.net/article/details/126959401
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四) https://xiaolong.blog.csdn.net/article/details/126959869
一、前言
说起ffmpeg,只要是搞音视频相关的开发应该都是听过的。FFmpeg提供了非常先进的音频/视频编解码库,并且支持跨平台。
现在互联网上ffmpeg相关的文章、教程也非常的多,ffmpeg本身主要是用来对视频、音频进行解码、编码,对音视频进行处理。
其中主要是解码和编码。 解码的应用主要是视频播放器制作、音乐播放器制作,解码视频文件得到视频画面再渲染显示出来就是播放器的基本模型了。 编码主要是用于视频录制保存,就是将摄像头的画面或者屏幕的画面编码后写入文件保存为视频,比如:行车记录仪录制视频,监控摄像头录制视频等等。 当然也可以编码推流到服务器,现在的直播平台、智能家居里的视频监控、智能安防摄像头都是这样的应用。
当前的这篇文章和接下来的几篇主要是介绍编码
的案例,通过ffmpeg设计一个视频录制软件,完成摄像头的视频录制保存、桌面画面录制保存,支持rtmp、rtsp推流到流媒体服务器实现直播。比如:推流到NGINX服务器、推流到B站直播间、推流到斗鱼直播间等等。 通过这个案例也可以了解到现在的安防摄像头是如何实现远程监控画面查看,如何保留历史视频文件进行回放等等。
接下来会通过连续几篇文章,循序渐进的编写案例来完成摄像头录制、音频录制、桌面录制、推流等这些功能。文章里不涉及太多的理论知识(理论知识网上太多了),主要是以代码、以实现功能为主。
我这里开发用到的环境介绍: 这些都是Qt基本环境,下载Qt安装包下来安装完就可以开发了。
ffmpeg版本: 4.2.2
Qt版本 : 5.12.6
编译器类型 : MinGW32bit
关于解码
的案例,在前面写了几篇文章做了介绍(后续也会持续更新)。
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(一)
https://xiaolong.blog.csdn.net/article/details/126832537
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(二)
https://xiaolong.blog.csdn.net/article/details/126833434
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(三)
https://xiaolong.blog.csdn.net/article/details/126836582
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(四)
https://xiaolong.blog.csdn.net/article/details/126842988
QT软件开发-基于FFMPEG设计视频播放器-支持流媒体地址播放(五)
https://xiaolong.blog.csdn.net/article/details/126915003
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解-完整例子(六)
https://blog.csdn.net/xiaolong1126626497/article/details/126916817
二、内容介绍
音视频的编码其实ffmpeg在例程里提供了案例,当前文章就是参考ffmpeg的案例实现的。
ffmpeg提供的音视频编码案例位置:ffmpeg-4.2.2\\doc\\examples\\muxing.c
,这个案例会生成一个10秒的视频,画面和音频是通过代码生成的。
这几篇文章循序渐进编写的内容规划与案例如下:
(1)完成目标:将摄像头画面编码后保存为mp4格式视频,保存在本地。 摄像头的画面采集采用Qt的QVideoProbe
类来捕获,windows、Android、Linux、iOS等平台都可以正常运行。
特点:只是保存摄像头画面,不录制音频。
(2)完成目标:捕获桌面的画面编码后保存为mp4格式视频,保存在本地。桌面的画面捕获采用Qt的QScreen
获取,通过定时器来间隔获取画面加到到编码队列里,然后编码成视频文件文件。 可以支持全屏录制、或者指定区域录制,只需要处理好图像,再传入编码器即可。
特点:只是保存摄像头画面,不录制音频。
(3)完成目标:在前面的例子上加上麦克风音频采集功能,通过Qt的QAudioInput
采集音频PCM数据,编码到视频里,完成画面+声音的录制保存。
特点:同时录制视频画面,麦克风声音。
(4)完成目标:在前面第(3)例子上修改,增加rtmp、rtsp推流,可以将视频画面和麦克风的声音编码推流到流媒体服务器。比如:B站直播间、斗鱼直播间、或者自己搭建的流媒体服务器上。 完成直播推流。推流后,可以自己通过播放器拉流进行观看。前面的播放器设计章节里,已经讲了如何使用ffmpeg开发流媒体播放器,最前面已经贴上链接了。
如果想自己搭建流媒体服务器,可以看这里:
windows下使用Nginx搭建Rtmp流媒体服务器,实现视频直播功能
https://blog.csdn.net/xiaolong1126626497/article/details/106391149
Linux下使用Nginx搭建Rtmp流媒体服务器,实现视频直播功能:
https://blog.csdn.net/xiaolong1126626497/article/details/10537889
三、设计说明
本篇文章要完成的目标:
**界面上: **设计好UI界面,UI界面按照最终的成品进行设计(先设计好UI界面,再陆陆续续的完成功能开发)。
功能上: 将摄像头画面编码后保存为mp4格式视频,保存在本地。 摄像头的画面采集采用Qt的QVideoProbe
类来捕获,windows、Android、Linux、iOS等平台都可以正常运行。
特点:只是保存摄像头画面,不录制音频。
设计说明:
要完成摄像头的采集和编码、需要有两个线程,通过子线程来完成耗时间的工作不卡UI。
A线程:采集摄像头的数据存放到缓冲区。
B线程:获取缓冲区的数据编码,保存为视频。
UI界面主要是完成画面和一些状态信息的展示。
在工程里有一个结构体,用来保存整个编码的的一些参数:
//录制视频的参数配置
struct RecordConfig
int Mode; // 0 本地录制 1 推流
int ImageInptSrc; //图像来源: 0 摄像头 1 桌面
int input_DataConf; // 0只要画面 1 画面+音频
qint8 desktop_page; //桌面的页面编号
int video_bit_rate; //码率
int video_frame; //帧率
int ImageWidth; //图像宽
int ImageHeight; //图像高
QString VideoSavePath; //视频保存路径
/*视频相关*/
QMutex video_encode_mutex;
QWaitCondition video_WaitConditon;
QCameraInfo camera;
/*音频相关*/
QAudioDeviceInfo audio;
QMutex audio_encode_mutex;
QQueue<QByteArray> AudioDataQueue;
/*推流地址 比如: rtmp rtsp等等*/
QByteArray PushStreamAddr;
//RGB图像缓冲区,这是采集数据之后转为RGB888的数据,因为还需要将此数据转为YUV420P
unsigned char *rgb_buffer;
size_t grb24_size; //RGB数据大小。 宽 x 高 x 3
//存放转换后的YUV42OP数据
unsigned char *video_yuv420p_buff;
unsigned char *video_yuv420p_buff_temp;
size_t yuv420p_size; //yuv420p数据大小。 宽 x 高 x 3 / 2
;
四、运行效果
(1)这是打开之后的界面
(2)设备配置页面
(3)配置好参数,点击开始按钮,开始录制视频,下面是录制中的效果。
(4)如果想停止录制,点击停止按钮,就可以停止。下面是点击停止按钮后的效果。
(5)在视频存放路径下可以看到录制好的视频。
查看视频的参数:
五、源代码
5.1 配置参数.h文件
#ifndef CONFIG_H
#define CONFIG_H
#include <QThread>
#include <QCamera>
#include <QVideoProbe>
#include <QWidget>
#include <QCameraInfo>
#include <QAudioDeviceInfo>
#include <QScrollBar>
#include <QMutex>
#include <QWaitCondition>
#include <QQueue>
#include <QPainter>
#include <QDateTime>
#include "Color_conversion.h"
#include <QEventLoop>
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>
#include <QStandardPaths>
//声明引用C的头文件
extern "C"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <libavutil/avassert.h>
#include <libavutil/channel_layout.h>
#include <libavutil/opt.h>
#include <libavutil/mathematics.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include "libavfilter/avfilter.h"
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
//录制视频的参数配置
struct RecordConfig
int Mode; // 0 本地录制 1 推流
int ImageInptSrc; //图像来源: 0 摄像头 1 桌面
int input_DataConf; // 0只要画面 1 画面+音频
qint8 desktop_page; //桌面的页面编号
int video_bit_rate; //码率
int video_frame; //帧率
int ImageWidth; //图像宽
int ImageHeight; //图像高
QString VideoSavePath; //视频保存路径
/*视频相关*/
QMutex video_encode_mutex;
QWaitCondition video_WaitConditon;
QCameraInfo camera;
/*音频相关*/
QAudioDeviceInfo audio;
QMutex audio_encode_mutex;
QQueue<QByteArray> AudioDataQueue;
/*推流地址 比如: rtmp rtsp等等*/
QByteArray PushStreamAddr;
//RGB图像缓冲区,这是采集数据之后转为RGB888的数据,因为还需要将此数据转为YUV420P
unsigned char *rgb_buffer;
size_t grb24_size; //RGB数据大小。 宽 x 高 x 3
//存放转换后的YUV42OP数据
unsigned char *video_yuv420p_buff;
unsigned char *video_yuv420p_buff_temp;
size_t yuv420p_size; //yuv420p数据大小。 宽 x 高 x 3 / 2
;
/*
音频码率=采样率 * 位深度* 通道数
44100 * 32 * 1 =1411200bps
*/
//音频相关参数设置
#define AUDIO_RATE_SET 44100 //音频采样率
#define AUDIO_BIT_RATE_SET 64000 //设置码率 40000
#define AUDIO_CHANNEL_SET AV_CH_LAYOUT_MONO //AV_CH_LAYOUT_MONO 单声道 AV_CH_LAYOUT_STEREO 立体声
#define FFMPEG_AudioFormat AV_SAMPLE_FMT_FLTP //指定音频的格式
#endif // CONFIG_H
5.2 ffmpeg编码线程.h
#ifndef FFMPEG_ENCODETHREAD_H
#define FFMPEG_ENCODETHREAD_H
#include "Config.h"
//单个输出AVStream的包装器
typedef struct OutputStream
AVStream *st;
AVCodecContext *enc;
/* 下一帧的点数*/
int64_t next_pts;
int samples_count;
AVFrame *frame;
AVFrame *tmp_frame;
struct SwsContext *sws_ctx;
struct SwrContext *swr_ctx;
OutputStream;
class ffmpeg_EncodeThread: public QThread
Q_OBJECT
public:
ffmpeg_EncodeThread(RecordConfig *config);
bool m_run; //运行状态 false表示退出 true表示正常运行
protected:
void run();
signals:
void LogSend(int err,QString text);
private:
struct RecordConfig *m_RecordConfig;
int StartEncode();
void ffmpeg_close_stream(OutputStream *ost);
void ffmpeg_add_stream(OutputStream *ost, AVFormatContext *oc,AVCodec **codec,enum AVCodecID codec_id);
void ffmpeg_open_video(AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg);
AVFrame *ffmpeg_alloc_picture(enum AVPixelFormat pix_fmt, int width, int height);
int ffmpeg_write_video_frame(AVFormatContext *oc, OutputStream *ost);
AVFrame *get_video_frame(OutputStream *ost);
void fill_yuv_image(AVFrame *pict, int frame_index,int width, int height);
int ffmpeg_write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt);
;
#endif // FFMPEG_ENCODETHREAD_H
5.3 ffmpeg编程线程.cpp
#include "ffmpeg_EncodeThread.h"
//关闭流
void ffmpeg_EncodeThread::ffmpeg_close_stream(OutputStream *ost)
avcodec_free_context(&ost->enc);
av_frame_free(&ost->frame);
av_frame_free(&ost->tmp_frame);
sws_freeContext(ost->sws_ctx);
swr_free(&ost->swr_ctx);
//添加输出流
void ffmpeg_EncodeThread::ffmpeg_add_stream(OutputStream *ost, AVFormatContext *oc,AVCodec **codec,enum AVCodecID codec_id)
AVCodecContext *c;
*codec = avcodec_find_encoder(codec_id);
ost->st = avformat_new_stream(oc,nullptr);
ost->st->id = oc->nb_streams-1;
c=avcodec_alloc_context3(*codec);
ost->enc = c;
switch ((*codec)->type)
case AVMEDIA_TYPE_AUDIO:
//设置数据格式
c->sample_fmt = FFMPEG_AudioFormat;
c->bit_rate = AUDIO_BIT_RATE_SET; //设置码率
c->sample_rate = AUDIO_RATE_SET; //音频采样率
//设置采样通道
c->channels= av_get_channel_layout_nb_channels(c->channel_layout);
c->channel_layout = AUDIO_CHANNEL_SET; //AV_CH_LAYOUT_MONO 单声道 AV_CH_LAYOUT_STEREO 立体声
c->channels=av_get_channel_layout_nb_channels(c->channel_layout); //通道数
ost->st->time_base=1,c->sample_rate;
//c->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; //允许使用实验性AAC编码器-增加的
break;
case AVMEDIA_TYPE_VIDEO:
c->codec_id = codec_id;
//码率:影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。
c->bit_rate = m_RecordConfig->video_bit_rate; //设置码率400000 400kps 500000
/*分辨率必须是2的倍数。 */
c->width = m_RecordConfig->ImageWidth;
c->height = m_RecordConfig->ImageHeight;
/*时基:这是基本的时间单位,以秒为单位*/
ost->st->time_base=1,m_RecordConfig->video_frame; //按帧率计算时间基准
c->framerate = m_RecordConfig->video_frame,1; //设置帧率
c->time_base = ost->st->time_base;
c->gop_size = 10; // 关键帧间隔 /* 最多每十二帧发射一帧内帧 */
c->pix_fmt = AV_PIX_FMT_YUV420P; //固定设置为420P
c->max_b_frames = 0; // 不使用b帧
if(c->codec_id == AV_CODEC_ID_MPEG1VIDEO)
c->mb_decision = 2;
// 预设:快速
av_opt_set(c->priv_data,"preset", "superfast", 0);
break;
default:
break;
/* 某些格式希望流头分开*/
if(oc->oformat->flags & AVFMT_GLOBALHEADER)c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
AVFrame *ffmpeg_EncodeThread::ffmpeg_alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
AVFrame *picture;
picture=av_frame_alloc();
picture->format = pix_fmt;
picture->width = width;
picture->height = height;
/*为帧数据分配缓冲区*/
av_frame_get_buffer(picture,32);
return picture;
void ffmpeg_EncodeThread::ffmpeg_open_video(AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
AVCodecContext *c = ost->enc;
AVDictionary *opt = nullptr;
av_dict_copy(&opt, opt_arg, 0);
//H264编码器的一些参数设置
c->qmin = 10;
c->qmax = 51;
//Optional Param
c->max_b_frames = 0;
#if 1
//下面设置两个参数影响编码延时,如果不设置,编码器默认会缓冲很多帧
// Set H264 preset and tune
// av_dict_set(&opt, "preset", "fast", 0);
// av_dict_set(&opt, "tune", "zerolatency", 0);
#else
/**
* ultrafast,superfast, veryfast, faster, fast, medium
* slow, slower, veryslow, placebo.
注意:这是x264编码速度的选项, 设置该参数可以降低编码延时
*/
av_opt_set(c->priv_data,"preset","superfast",0);
#endif
avcodec_open2(c, codec, &opt);
av_dict_free(&opt);
ost->frame = ffmpeg_alloc_picture(c->pix_fmt, c->width,c->height);
ost->tmp_frame = nullptr;
/* 将流参数复制到多路复用器 */
avcodec_parameters_from_context(ost->st->codecpar,c);
/*
准备图像数据
YUV422占用内存空间 = w * h * 2
YUV420占用内存空间 = width*height*3/2
*/
void ffmpeg_EncodeThread::fill_yuv_image(AVFrame *pict, int frame_index,int width, int height)
unsigned int y_size=width*height;
m_RecordConfig->video_encode_mutex.lock();
m_RecordConfig->video_WaitConditon.wait(&m_RecordConfig->video_encode_mutex);
memcpy(m_RecordConfig->video_yuv420p_buff_temp,
m_RecordConfig->video_yuv420p_buff,
m_RecordConfig->yuv420p_size);
m_RecordConfig->video_encode_mutex.unlock();
//将YUV数据拷贝到缓冲区 y_size=wXh
memcpy(pict->data[0],m_RecordConfig->video_yuv420p_buff_temp,y_size);
memcpy(pict->data[1],m_RecordConfig->video_yuv420p_buff_temp+y_size,y_size/4);
memcpy(pict->data[2],m_RecordConfig->video_yuv420p_buff_temp+y_size+y_size/4,y_size/4);
//获取一帧视频
AVFrame *ffmpeg_EncodeThread::get_video_frame(OutputStream *ost)
AVCodecContext *c = ost->enc;
/* 检查我们是否要生成更多帧---判断是否结束录制 */
// if(av_compare_ts(ost->next_pts, c->time_base,STREAM_DURATION, (AVRational) 1, 1 ) >= 0)
// return nullptr;
/*当我们将帧传递给编码器时,它可能会保留对它的引用
*内部; 确保我们在这里不覆盖它*/
if (av_frame_make_writable(ost->frame) < 0) return nullptr;
//获取图像
//DTS(解码时间戳)和PTS(显示时间戳)
fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height);
ost->frame->pts = ost->next_pts++;
//视频帧添加水印
return ost->frame;
int ffmpeg_EncodeThread::ffmpeg_write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
/*将输出数据包时间戳值从编解码器重新调整为流时基 */
av_packet_rescale_ts(pkt, *time_base, st->time_base);
pkt->stream_index = st->index;
/*将压缩的帧写入媒体文件*/
return av_interleaved_write_frame(fmt_ctx, pkt);
/*
*编码一个视频帧并将其发送到多路复用器
*/
int ffmpeg_EncodeThread::ffmpeg_write_video_frame(AVFormatContext *oc, OutputStream *ost)
int ret;
AVCodecContext *c;
AVFrame *frame;
int got_packet = 0;
AVPacket pkt;
c=ost->enc;
//获取一帧数据
frame = get_video_frame(ost);
if(frame==nullptr)
emit LogSend(-1,"视频帧制作失败...\\n");
return -1;
av_init_packet(&pkt);
//编码图像
ret=avcodec_encode_video2(c, qt软件开发-基于ffmpeg设计录屏与rtsprtmp推流软件(支持桌面与摄像头)
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)https://xiaolong.blog.csdn.net/article/details/126954626QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(二)https://xiaolong.blog.csdn.net/article/detai... 查看详情
qt软件开发-基于ffmpeg设计录屏与rtsprtmp推流软件(支持桌面与摄像头)
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)https://xiaolong.blog.csdn.net/article/details/126954626QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(二)https://xiaolong.blog.csdn.net/article/detai... 查看详情
qt软件开发-基于ffmpeg设计录屏与rtsprtmp推流软件(支持桌面与摄像头)
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)https://xiaolong.blog.csdn.net/article/details/126954626QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(二)https://xiaolong.blog.csdn.net/article/detai... 查看详情
qt软件开发-基于ffmpeg设计录屏与rtsprtmp推流软件(支持桌面与摄像头)(代码片段)
QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)https://xiaolong.blog.csdn.net/article/details/126954626QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(二)https://xiaolong.blog.cs 查看详情
qt软件开发-基于ffmpeg设计视频播放器-支持流媒体地址播放
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(一)https://xiaolong.blog.csdn.net/article/details/126832537QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(二)https://xiaolong.blog.csdn.net/article/details/126833434QT软件开发-基于FFMPEG设... 查看详情
qt软件开发-基于ffmpeg设计视频播放器-支持软解与硬解-完整例子
QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(一)https://xiaolong.blog.csdn.net/article/details/126832537QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解(二)https://xiaolong.blog.csdn.net/article/details/126833434QT软件开发-基于FFMPEG设... 查看详情
qt软件开发-基于ffmpeg设计视频播放器-支持软解与硬解(代码片段)
一、前言在前一章里介绍了ffmpeg基本概念,完成了ffmpeg对视频软件解码并渲染,实现了基本播放器功能设计。这篇文章介绍ffmpeg硬件加速解码视频的流程,完成基本播放器设计。我这里开发视频播放器用到的环境介绍:ffmpeg版本... 查看详情
qt软件开发-基于ffmpeg设计视频播放器-支持软解与硬解(代码片段)
一、前言在前一章里介绍了ffmpeg基本概念,完成了ffmpeg对视频解码并渲染,实现了基本播放器功能设计。只是之前都只是解码了图像,忽略了音频数据,这篇文章介绍ffmpeg如何解码音频,制作一个音乐播放器,为后续的完整播放... 查看详情
qt软件开发-基于ffmpeg设计视频播放器-支持软解与硬解(代码片段)
一、前言前面几篇文章里分别介绍了ffmpeg软解、硬解、音频解码,完成视频帧渲染,音频解码播放。之前做的视频播放器里,虽然也使用了硬件加速解码,解码确实快,但是渲染都采用QWidget方式渲染绘制,占用CPU较高,并且采... 查看详情
qt软件开发:基于qtav设计的视频播放器(代码片段)
一、环境介绍操作系统: win1064位QT版本: QT5.12.6编译器: MinGW32QtAV版本: QtAV-1.12.0FFMPEG版本: ffmpeg3.1 使用的是QtAV提供的包,直接使用完整源码下载: https://download.csdn.net/download/xiaolong1126626497/19759245二、编译QTAV模块参考... 查看详情
qt软件开发:基于ffmpge设计的流媒体播放器(rtmp/rtsp)(代码片段)
一、环境介绍操作系统: win1064位QT版本: QT5.12.6编译器: MinGW32ffmpeg版本: 4.2.2完整工程下载地址(下载即可编译运行): https://download.csdn.net/download/xiaolong1126626497/20644890本工程使用的FFMPEG库下载地址:https://download.csdn.net/down 查看详情
qt软件开发:基于ffmpge设计的流媒体播放器(rtmp/rtsp)(代码片段)
一、环境介绍操作系统: win1064位QT版本: QT5.12.6编译器: MinGW32ffmpeg版本: 4.2.2完整工程下载地址(下载即可编译运行): https://download.csdn.net/download/xiaolong1126626497/20644890本工程使用的FFMPEG库下载地址:https://download.csdn.net/down 查看详情
linux端录屏与播放:script和scriptreplay
...log.51cto.com/ganbing/2053636?utm_source=oschina-app二、Linux终端录屏与播放:script和scriptreplay Linux端录屏与播放:script和scriptreplay: 一、script常用选项选项描述-a,-- 查看详情
基于树莓派4b设计的音视频播放器(从0开始)
一、前言【1】功能总结选择树莓派设计一款家庭影院系统,可以播放本地视频、网络视频直播、游戏直播、娱乐直播、本地音乐、网络音乐,当做FM网络收音机。软件采用Qt设计、播放器引擎采用ffmpeg。当前的硬件选择的是树莓... 查看详情
javacv音视频开发宝典:使用javacv采集windows桌面屏幕画面并录屏mp4视频文件(ffmpeg基于dshow方式采集windows系统桌面画面)
《JavaCV音视频开发宝典》专栏目录导航《JavaCV音视频开发宝典》专栏介绍和目录前言之前已经写过dshow方式采集摄像头,一直没写dshow方式是因为dshow方式录屏需要单独装个插件,而之前写过的这章:JavaCV音视频开发宝典:JavaCV使... 查看详情
javacv音视频开发宝典:使用javacv采集windows桌面屏幕画面并录屏mp4视频文件(ffmpeg基于dshow方式采集windows系统桌面画面)
《JavaCV音视频开发宝典》专栏目录导航《JavaCV音视频开发宝典》专栏介绍和目录前言之前已经写过dshow方式采集摄像头,一直没写dshow方式是因为dshow方式录屏需要单独装个插件,而之前写过的这章:JavaCV音视频开发宝典:JavaCV使... 查看详情
javacv开发详解之9:基于gdigrab的windows屏幕画面抓取/采集(基于javacv的屏幕截屏录屏功能)
...像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV) javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG) javaCV开发详解之4:转流器实现(... 查看详情
c++qt结合ffmpeg实战开发视频播放器-17ffmpeg基本介绍(代码片段)
...的软件的部分类库,可以不开源,更适用于商业软件开发,我们在这不需要纠结,我们是学习使用并没有商业化,一般商业软件使用LGPL协议。二、ffmepg的基本使用1.FFmpeg命令行工具获取下载地址访问FFmpeg官网... 查看详情