使用QT+FFMPEG实现了RTSP视频流播放的基础操作,点击按钮后,将拉取指定地址的RTSP流,并在QT界面中通过Label显示
https://github.com/harry19902002/ffmpeg-first-demo
FFMPEG官方示例:FFmpeg: decode_video.c
新建一个QT工程,在pro添加lib目录和include目录的路径。
##ffmpeg
FFMPEG_LIB = /usr/local/ffmpeg/lib
FFMPEG_INCLUDE = /usr/local/ffmpeg/include
INCLUDEPATH += $$FFMPEG_INCLUDE \
LIBS += $$FFMPEG_LIB/libavcodec.so \
$$FFMPEG_LIB/libavdevice.so \
$$FFMPEG_LIB/libavfilter.so \
$$FFMPEG_LIB/libavformat.so \
$$FFMPEG_LIB/libavutil.so \
$$FFMPEG_LIB/libswresample.so \
$$FFMPEG_LIB/libswscale.so \
在MainWindow.ui中,添加一个QPushButton和QLabel控件,并添加“转到槽”,添加on_pushButton_clicked()。
#include <QTime>
//以毫秒为单位设置延时
void Delay(int msec)
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while(QTime::currentTime() < dieTime){
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
}
}
总体处理步骤有8步,如图所示

1.定义相关变量
AVFormatContext *pFormatCtx = NULL;
AVCodecContext *pCodecCtx = NULL;
const AVCodec *pCodec = NULL;
AVFrame *pFrame,*pFrameRGB;
AVPacket *packet;
struct SwsContext *img_convert_ctx;
unsigned char *out_buffer;
int i,videoIndex;
int ret;
char errors[1024] = "";
//rtsp地址:
char url[] = "rtsp://192.168.111.60:554/LiveMedia/ch1/Media1";
2.初始化相关模块
//初始化FFMPEG 调用了这个才能正常适用编码器和解码器
pFormatCtx = avformat_alloc_context(); //init FormatContext
//初始化FFmpeg网络模块
avformat_network_init(); //init FFmpeg network
3.打开视频文件并获取视频信息
//open Media File
ret = avformat_open_input(&pFormatCtx,url,NULL,NULL);
if(ret != 0){
av_strerror(ret,errors,sizeof(errors));
cout <<"Failed to open video: ["<< ret << "]"<< errors << endl;
exit(ret);
}
//Get audio information
ret = avformat_find_stream_info(pFormatCtx,NULL);
if(ret != 0){
av_strerror(ret,errors,sizeof(errors));
cout <<"Failed to get audio info: ["<< ret << "]"<< errors << endl;
exit(ret);
}
4.查找视频中的流信息
//循环查找视频中包含的流信息,直到找到视频类型的流
//便将其记录下来 videoIndex
//这里我们现在只处理视频流 音频流先不管他
for (i = 0; i < pFormatCtx->nb_streams; i++) {
if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
videoIndex = i;
}
}
//如果videoIndex为-1 说明没有找到视频流
if (videoIndex == -1) {
printf("Didn't find a video stream.\n");
return;
}
5.配置编码上下文,AVCodecContext内容
//配置编码上下文,AVCodecContext内容
//1.查找解码器
pCodec = avcodec_find_decoder(pFormatCtx->streams[videoIndex]->codecpar->codec_id);
//2.初始化上下文
pCodecCtx = avcodec_alloc_context3(pCodec);
//3.配置上下文相关参数
avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[videoIndex]->codecpar);
//4.打开解码器
ret = avcodec_open2(pCodecCtx, pCodec, NULL);
if(ret != 0){
av_strerror(ret,errors,sizeof(errors));
cout <<"Failed to open Codec Context: ["<< ret << "]"<< errors << endl;
exit(ret);
}
6.建立视频帧,并对相关参数进行配置
//初始化视频帧
pFrame = av_frame_alloc();
pFrameRGB = av_frame_alloc();
//为out_buffer申请一段存储图像的内存空间
out_buffer = (unsigned char*)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_RGB32,pCodecCtx->width,pCodecCtx->height,1));
//实现AVFrame中像素数据和Bitmap像素数据的关联
av_image_fill_arrays(pFrameRGB->data,pFrameRGB->linesize, out_buffer,
AV_PIX_FMT_RGB32,pCodecCtx->width, pCodecCtx->height,1);
//为AVPacket申请内存
packet = (AVPacket *)av_malloc(sizeof(AVPacket));
//打印媒体信息
av_dump_format(pFormatCtx,0,url,0);
//初始化一个SwsContext
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);
7.通过while循环,处理每一个视频帧,并渲染到Label上
//读取帧数据,并通过av_read_frame的返回值确认是不是还有视频帧
while(av_read_frame(pFormatCtx,packet) >=0){
//判断视频帧
if(packet->stream_index == videoIndex){
//解码视频帧
ret = avcodec_send_packet(pCodecCtx, packet);
ret = avcodec_receive_frame(pCodecCtx, pFrame);
if(ret != 0){
av_strerror(ret,errors,sizeof(errors));
cout <<"Failed to decode video frame: ["<< ret << "]"<< errors << endl;
}
if (ret == 0) {
//处理图像数据
sws_scale(img_convert_ctx,
(const unsigned char* const*) pFrame->data,
pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data,
pFrameRGB->linesize);
QImage img((uchar*)pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);
ui->label->setPixmap(QPixmap::fromImage(img));
//释放前需要一个延时
Delay(1);
}
}
//释放packet空间
av_packet_unref(packet);
}
8.结束后释放资源
//close and release resource
av_free(out_buffer);
av_free(pFrameRGB);
sws_freeContext(img_convert_ctx);
avcodec_close(pCodecCtx);
avcodec_free_context(&pCodecCtx);
avformat_close_input(&pFormatCtx);
exit(0);
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope
目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url
我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。
我如何用ruby编写一个脚本,当从命令行执行时播放mp3文件(背景音乐)?我试过了run="mplayer#{"/Users/bhushan/resume/m.mp3"}-aosdl-vox11-framedrop-cache16384-cache-min20/100"system(run)但它也不起作用,以上是播放器特定的。如果用户没有安装mplayer怎么办。有没有更好的办法? 最佳答案 我一般都是这样pid=fork{exec'mpg123','-q',file} 关于ruby
我运行的是OSX,对视频转换一无所知。但我有大约200个视频都是mp4格式,无法在Firefox中播放。我需要将它们转换为ogg才能使用html5视频标签。这些文件位于一个文件夹结构中,这使得一次一个地处理一个文件变得困难。我希望bash命令或Ruby命令遍历所有子文件夹并找到所有.mp4并转换它们。我找到了一份关于如何使用Google执行此操作的引用资料:http://athmasagar.wordpress.com/2011/05/12/a-bash-script-to-convert-mp4-files-to-oggogv/#!/bin/bashforfin$(ls*mp4|se
一、什么是web项目ui自动化测试?通过测试工具模拟人为操控浏览器,使软件按照测试人员的预定计划自动执行测试的一种方式,可以完成许多手工测试无法完成或者不易实现的繁琐工作。正确使用自动化测试,可以更全面的对软件进行测试,从而提高软件质量进而缩短迭代周期。二、构建测试用例的“九部曲”(一)创建流程包划分功能模块日常测试活动中,都会根据功能模块进行拆分,所以在设计器中我们可以通过创建流程包的方式来拆分需要测试的功能模块,如下图中操作创建一个电脑流程包并且取名为对应的功能模块名称,如果有多个功能模块就创建多个对应的流程包,实在RPA设计器有易用的图形可视化界面,方便管理较多的功能模块。(二)在流程包
目录需求基于JavaCV跨平台执行ffmpeg命令[^1]坑一内存不足坑二多个ffmpeg进程并行导致IO负载大,进而导致ioerror?坑三使用Java操作ffmpeg时,有时会卡死坑四Process的waitFor死锁问题及解决办法需求给透明背景的视频自动叠加一张背景图片基于JavaCV跨平台执行ffmpeg命令1我测试发现的本需求的最小依赖:dependency>groupId>org.bytedecogroupId>artifactId>ffmpeg-platform-gplartifactId>version>5.0-1.5.7version>dependency>核心代码:Stri