Firefly开源社区

rtsp视频流问题

26

积分

0

威望

0

贡献

技术小白

积分
26
发表于 2021-11-18 14:54:18     
你好。
1、在ff官方示例rkmedia_rtspget_vdec_test示例的基础上,把rtsp解码的视频流直接保存为NV12格式图片。打开后正上方显示不对,麻烦看下什么原因,测试代码以及图片如下:
  1. #include <assert.h>
  2. #include <fcntl.h>
  3. #include <pthread.h>
  4. #include <signal.h>
  5. #include <stdbool.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include <unistd.h>

  11. #include "common/sample_common.h"
  12. #include "rkmedia_api.h"
  13. #include "rkmedia_vdec.h"
  14. #include "ffrtsp/ffrtsp.hh"


  15. static bool quit = false;
  16. static void sigterm_handler(int sig) {
  17.         fprintf(stderr, "signal %d\n", sig);
  18.         quit = true;
  19. }

  20. unsigned long long getCurrentTime()
  21. {
  22.         struct tm t;
  23.         char date_time[64];
  24.         struct timespec time = { 0, 0 };
  25.         clock_gettime(CLOCK_REALTIME, &time);
  26.         clock_gettime(CLOCK_REALTIME, &time);
  27.         strftime(date_time, sizeof(date_time), "%Y-%m-%d %H:%M:%S", localtime_r(&time.tv_sec, &t));
  28.         printf("CLOCK_REALTIME : date_time=%s, tv_nsec=%ld\n", date_time, time.tv_nsec);
  29.         return(unsigned long long )((time.tv_sec*1000*1000*1000+time.tv_nsec)/1000000);
  30. }


  31. int FFRKMedia_Vdec_Send(u_int8_t* framebuff,unsigned framesize,bool * pquit,int cur_chn)
  32. {
  33.         //RTSP流数据送到decode通道
  34.     MEDIA_BUFFER mb = RK_MPI_MB_CreateBuffer(framesize, RK_FALSE, 0);
  35.     RK_MPI_MB_SetSize(mb, framesize);
  36.     memcpy(RK_MPI_MB_GetPtr(mb) ,framebuff , framesize);
  37.     RK_MPI_MB_SetSize(mb, framesize);
  38.     RK_MPI_SYS_SendMediaBuffer(RK_ID_VDEC, 0, mb);
  39.     RK_MPI_MB_ReleaseBuffer(mb);
  40.     if (quit)
  41.             *pquit = true;
  42. }

  43. void vdec_packet_cb(MEDIA_BUFFER mb) {
  44.          // decode 流媒体数据为NV12
  45.         int ret;
  46.         static RK_U32 jpeg_id = 0;
  47.         MB_IMAGE_INFO_S stImageInfo = {0};
  48.         ret = RK_MPI_MB_GetImageInfo(mb, &stImageInfo);//指定图像中获取图像信息 ,宽高,图片格式
  49.         if (ret) {
  50.                 printf("Get image info failed! ret = %d\n", ret);
  51.                 RK_MPI_MB_ReleaseBuffer(mb);
  52.                 return ;
  53.         }
  54.         printf("Get Frame:ptr:%p, fd:%d, size:%zu, mode:%d, channel:%d, "
  55.              "timestamp:%lld, ImgInfo:<wxh %dx%d, fmt 0x%x>\n",
  56.              RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetFD(mb), RK_MPI_MB_GetSize(mb),
  57.              RK_MPI_MB_GetModeID(mb), RK_MPI_MB_GetChannelID(mb),
  58.              RK_MPI_MB_GetTimestamp(mb), stImageInfo.u32Width,
  59.              stImageInfo.u32Height, stImageInfo.enImgType);
  60.         char jpeg_path[128];
  61.         sprintf(jpeg_path, "/userdata/data/test_yuv%d.yuv", jpeg_id);
  62.         FILE *file = fopen(jpeg_path, "w");
  63.         if (file) {
  64.                 fwrite(RK_MPI_MB_GetPtr(mb), 1, RK_MPI_MB_GetSize(mb), file);
  65.                 fclose(file);
  66.         }
  67.         RK_MPI_MB_ReleaseBuffer(mb);
  68.         jpeg_id++;
  69. }


  70. int main(int argc, char *argv[])
  71. {
  72.         int ret=0;
  73.          
  74.         signal(SIGINT, sigterm_handler);
  75.          
  76.         RK_MPI_SYS_Init();//初始化 MPI 系统

  77.         //设置decode属性
  78.         VDEC_CHN_ATTR_S stVdecAttr;
  79.         stVdecAttr.enCodecType = RK_CODEC_TYPE_H264;
  80.         stVdecAttr.enMode = VIDEO_MODE_STREAM;
  81.         stVdecAttr.enDecodecMode = VIDEO_DECODEC_HADRWARE;

  82.         ret = RK_MPI_VDEC_CreateChn(0, &stVdecAttr);
  83.         if (ret) {
  84.                 printf("Create Vdec[0] failed! ret=%d\n", ret);
  85.                 return -1;
  86.         }

  87.         //设置decode有数据时 回调
  88.         MPP_CHN_S VdecChn; //定义模块设备通道结构体。
  89.         VdecChn.enModId = RK_ID_VDEC;
  90.         VdecChn.s32DevId = 0;
  91.         VdecChn.s32ChnId = 0;
  92.         ret = RK_MPI_SYS_RegisterOutCb(&VdecChn, vdec_packet_cb); //注册数据输出回调。
  93.         if (ret) {
  94.                 printf("ERROR: register output callback for Vdec[0] error! ret=%d\n", ret);
  95.                 return 0;
  96.         }
  97.   
  98.         //设置流媒体参数
  99.         struct FFRTSPGet ffrtsp_get;
  100.         ffrtsp_get.callback = FFRKMedia_Vdec_Send;
  101.         ffrtsp_get.count = 1;
  102.         //测试url
  103. //        ffrtsp_get.ffrtsp_get_info[0].url = (char*)"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov";
  104.         ffrtsp_get.ffrtsp_get_info[0].url = (char*)"rtsp://admin:12345678@192.168.1.77";
  105.         ffrtspGet(ffrtsp_get);

  106.         while(!quit)
  107.         {
  108.                 sleep(1);
  109.         }

  110.         //释放资源
  111.         RK_MPI_VDEC_DestroyChn(0);
  112.         return 0;
  113. }

复制代码

C:\data\微信截图_20211118145328.png
回复

使用道具 举报

26

积分

0

威望

0

贡献

技术小白

积分
26
发表于 2021-11-18 14:59:37     
补传图片
微信截图_20211118145328.png
回复

使用道具 举报

810

积分

3

威望

0

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
810
发表于 2021-11-19 14:24:21     
这个看起来像分辨率字节对齐问题,需要 16 字节对齐,例如 1080 -> 1088
回复

使用道具 举报

26

积分

0

威望

0

贡献

技术小白

积分
26
发表于 昨天 22:46     
板蓝根 发表于 2021-11-19 14:24
这个看起来像分辨率字节对齐问题,需要 16 字节对齐,例如 1080 -> 1088

那这个在那地方设置,我这是直接取rtsp数据流,然后将数据发送到解码器通道
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表