qq364530507

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507  发布于  2016-12-14 10:35:03
采纳率 0%
23个问答
1976

关于流媒体客户端组RTP包的问题

 
void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
struct timeval presentationTime, unsigned /*durationInMicroseconds*/)
{
    static int frame_number=0;
    // We've just received a frame of data.  (Optionally) print out information about it:
#ifdef DEBUG_PRINT_EACH_RECEIVED_FRAME
    if (fStreamId != NULL) envir() << "Stream \"" << fStreamId << "\"; ";
    envir() << fSubsession.mediumName() << "/" << fSubsession.codecName() << ":\tReceived " << frameSize << " bytes";
    if (numTruncatedBytes > 0) envir() << " (with " << numTruncatedBytes << " bytes truncated)";
    char uSecsStr[6+1]; // used to output the 'microseconds' part of the presentation time
    sprintf(uSecsStr, "%06u", (unsigned)presentationTime.tv_usec);
    envir() << ".\tPresentation time: " << (int)presentationTime.tv_sec << "." << uSecsStr;
    //if (fSubsession.rtpSource() != NULL && !fSubsession.rtpSource()->hasBeenSynchronizedUsingRTCP()) {
    //  envir() << "!"<<"\n"; // mark the debugging output to indicate that this presentation time is not RTCP-synchronized
    //}
    if (fSubsession.rtpSource() != NULL) {
        //  envir() << fSubsession.rtpSource()->curPacketRTPSeqNum()<<"\n";
        fprintf(stderr, "yyyyyyyyyyyy%d\n", fSubsession.rtpSource()->curPacketRTPSeqNum());
    }
#ifdef DEBUG_PRINT_NPT
    envir() << "\tNPT: " << fSubsession.getNormalPlayTime(presentationTime);
#endif

    envir() << "\n";

#endif
    // 此时,fReceiveBuffer中保存着接收到的视频数据,对该帧数据进行保存
    if((0 == strcmp(fSubsession.codecName(),"H264")) && (!isPause))
    {
        if (!fHaveWrittenFirstFrame)            // 仅每次播放的第一次进入执行本段代码
        {    // 对视频数据的SPS,PPS进行补偿
            unsigned numSPropRecords;
            SPropRecord* sPropRecords = parseSPropParameterSets(fSubsession.fmtp_spropparametersets(), numSPropRecords);
            // spydroid v6.8 or spydroid v9.1.
            for (unsigned i = 0; i < numSPropRecords; ++i)
            {
                memcpy(p_nalu_tail, start_code, sizeof(start_code));
                p_nalu_tail += sizeof(start_code);
                memcpy(p_nalu_tail, sPropRecords.sPropBytes, sPropRecords.sPropLength);
                p_nalu_tail += sPropRecords.sPropLength;
            }

            fHaveWrittenFirstFrame = true; // 标记SPS,PPS已经完成补偿

            memcpy(p_nalu_tail, start_code, sizeof(start_code));
            p_nalu_tail += sizeof(start_code);
            memcpy(p_nalu_tail, fReceiveBuffer, frameSize);
            p_nalu_tail += frameSize;
        }
        else
        {
            if(presentationTime.tv_sec == pre_time_stamp.tv_sec && presentationTime.tv_usec == pre_time_stamp.tv_usec)
            {
                memcpy(p_nalu_tail, start_code, sizeof(start_code));
                p_nalu_tail += sizeof(start_code);
                memcpy(p_nalu_tail, fReceiveBuffer, frameSize);
                p_nalu_tail += frameSize;
            }
            else
            {
                if(p_nalu_tail != nalu_buffer)
                {
                    AVPacket packet, *pkt = &packet;
                    av_new_packet(pkt, p_nalu_tail - nalu_buffer);
                    memcpy(pkt->data , nalu_buffer, p_nalu_tail - nalu_buffer);
                    //保存
                    framenumber_data++;
                    /*FILE* WYWFile = fopen(WYWFILE, "w");
                    char strr[1048576]={0};*/
                    //for(int i=0;i                     //{
                    ///**sprintf(strr,"%x",*(nalu_buffer+i));*/
                    //fwrite(strr,sizeof(strr),1,WYWFile);*/
                    //    fprintf(WYWFile,"%x",nalu_buffer+i);
                    //}
                    /*sprintf(strr,"frame%d:%x",framenumber,nalu_buffer);*/
                    /*fwrite(strr,sizeof(strr),1,WYWFile);*/
                    /*保存*/

                    packet_queue_put(videoq, pkt);
                }
                p_nalu_tail = nalu_buffer;
                memcpy(p_nalu_tail, start_code, sizeof(start_code));
                p_nalu_tail += sizeof(start_code);
                memcpy(p_nalu_tail, fReceiveBuffer, frameSize);
                p_nalu_tail += frameSize;
            }
        }
        pre_time_stamp = presentationTime;
    }

    // 可选的保存视频数据到Recieved.264文件
#ifdef SAVE_THE_STREAM_INTO_FILE
    if(NULL == fout)
    {
        envir() << "打开输出文件失败\n";
        return;
    }
    fwrite(nalu_buffer, p_nalu_tail - nalu_buffer, 1, fout);
#endif

    continuePlaying();                                // 继续,请求下一帧数据
}

以上是小弟从网上下的能够利用live555实现RTSP协议接收H.264载荷的RTP数据,FFMPEG解码,SDL显示的程序的数据接收部分,然后小弟将其改成利用OPENCV处理显示实现实时的目标跟踪。
但是回头仔细研究流媒体协议的过程中发现,这段数据接收部分有点看不懂,
代码中首先加上SPS,PPS补偿我理解,这是解码器需要的
后面通过presentationTime显示时间来判断这部分我不明白,还请大神们指教
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区