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%256!=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,拷贝正确的图像大小,即可。文章来源:https://www.toymoban.com/news/detail-417039.html
rga 图像转换代码如下所示文章来源地址https://www.toymoban.com/news/detail-417039.html
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;
到了这里,关于RK3399 ,播放RTSP流,使用QMediaPlayer,不使用FFMpeg方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!