RK3399 ,播放RTSP流,使用QMediaPlayer,不使用FFMpeg方式
rk3399 想要拉RTSP流并显示共有俩种显示方式
其中rk3399拥有mpp硬件解码器,能够解h264与h265码流
第一种方式为 FFmpeg qt MPP,方式进行解码
此种解码方式,前面的文章有阐述过,在此就不再过多阐述了
第二种方式是利用qt中的qMediaplayer方式进行播放,Qmediaplayer,自己并无解码器,rk3399中恰巧提供了GST(gstreamer)框架,Qt中的qmediaplayer 在linux下支持这种解码框架,能够自己调用,因此,我们只需要设置播放源即可,在本项目中,需要把显示的图像进行另外的处理,因此我们利用QVideoProbe 的方式的槽函数的方式进行获取
整体思路如下
1,确定rk3399 上有安装 gst ,可输入gst 按tab键进行补全命令进行查看,如图所示
2.
-
QMediaPlaylist *playlist = new QMediaPlaylist;
-
//playlist->addMedia(QUrl::fromLocalFile("/root/1.mp4"));
-
playlist->addMedia(QUrl(rtspUrl));
-
playlist->setCurrentIndex(1);
-
QMediaPlayer *cameraRtspPlayer = new QMediaPlayer(this);
-
cameraRtspPlayer->setPlaylist(playlist);
-
-
QVideoWidget *rtspVideoMianWidget = new QVideoWidget;
-
rtspVideoMianWidget->setAspectRatioMode(Qt::IgnoreAspectRatio);
-
-
connect(&VideoMianprobe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(slotGetRtspOneFrame(QVideoFrame)));
-
-
connect(cameraRtspPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(slotOpenRtspUrlResult(QMediaPlayer::State)));
-
-
QVideoProbe VideoMianprobe;
-
VideoMianprobe.setSource(cameraRtspPlayer);
-
cameraRtspPlayer->setVideoOutput(rtspVideoMianWidget);
-
cameraRtspPlayer->play();
QVideoProbe class允许你监控正在播放或者记录的视频
可以发出两个信号,其中比较重要的是后面一个videoFrameProbed
void flush()
void videoFrameProbed( const QVideoFrame &frame)
利用此函数我们可以接收rtsp流中的每一帧图像,再利用cpu或者rk3399中的rga模块进行转码,将nv12转为rgb888格式,
如下所示
-
if(!frame.isValid())
-
{
-
qDebug() << "frame is Valid";
-
return;
-
}
-
frame.map(QAbstractVideoBuffer::ReadOnly);
-
-
if(rtspDecode.dst_buf == nullptr)
-
{
-
int srcWidth = frame.width();
-
int srcHight = frame.height();
-
int reallyWidth = frame.width();
-
int reallyHeight = frame.height();
-
-
while(reallyWidth%6!=0)
-
{
-
reallyWidth ;
-
}
-
cropWidth = srcWidth - (reallyWidth - srcWidth);
-
cropHight = srcHight - (reallyHeight - srcHight);
-
rtspDecode.setSrcWidthHight(frame.width(),frame.height(),reallyWidth,reallyHeight);
-
-
rtspDecode.dst_buf = (uchar*)malloc(frame.width() * frame.height() * get_bpp_from_format(DST_FORMAT)*2);
-
}
-
-
rtspDecode.convertdata(frame.bits(),rtspDecode.dst_buf);
-
QImage qimg((uchar *)rtspDecode.dst_buf,frame.width(),frame.height(),QImage::Format_RGB888);
-
currRtspStopOldTimeMsTick = currMsTick;
-
aiCameraEnable = false;
-
sigAiCameraStart(qimg.copy(0,0,cropWidth,cropHight));
剩下部分为RGA解码,部分,注意这里要对图像的真实的分辨率进行计算,h264与h265,图像对齐方式并不一致,h264为16位对齐方式,h265对齐方式为265奇数对齐方式,直接设置用frame的宽高的方式,会导致rga解析的图像并不正确。因此我们这里要计算图像的正确的大小,还有一种方式,是利用ffmpeg拉流,获取图像正确的大小格式,这里我们直接计算图像的大小。为265整除即可,当图像转换完成后,即使宽高设置正确,也会存在绿边现象,这时我们可计算绿边的大小,用原始图像大小减去h265对齐之后的大小,就是绿边的大小,再利用Qimg的copy,拷贝正确的图像大小,即可。
rga 图像转换代码如下所示
-
im_rect src_rect;
-
im_rect dst_rect;
-
rga_buffer_t src;
-
rga_buffer_t dst;
-
IM_STATUS STATUS;
-
-
int ret = 0;
-
-
memset(&src_rect, 0, sizeof(src_rect));
-
memset(&dst_rect, 0, sizeof(dst_rect));
-
memset(&src, 0, sizeof(src));
-
memset(&dst, 0, sizeof(dst));
-
-
src = wrapbuffer_virtualaddr(srcdata, reallyWidth, reallyHight, SRC_FORMAT);
-
dst = wrapbuffer_virtualaddr(dst_buf, srcWidth,srcHight, DST_FORMAT);
-
-
-
if(src.width == 0 || dst.width == 0) {
-
printf("%s, %s\n", __FUNCTION__, imStrError());
-
return -1;
-
}
-
src.format = SRC_FORMAT;
-
dst.format = DST_FORMAT;
-
-
ret = imcheck(src, dst, src_rect, dst_rect);
-
if (IM_STATUS_NOERROR != ret) {
-
printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));
-
return -1;
-
}
-
STATUS = imcvtcolor(src, dst, src.format, dst.format);
-
// qDebug("resizing .... %s\n", imStrError(STATUS));
-
return 0;
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbjihj
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01