live555 MPEG4无法发送最后一帧的解决(bug)



开源软件 Live555MediaSeverbug分析:

  1. 传输现象:

发送端使用wireshark抓包,并和视频源文件进行对比(二进制)可得到如下的实验现象:

码流文件所用编码

现象

H264

能够发送所有数据

MPEG4

少发送最后一帧的数据


  1. 原因

live555每一帧数据的结束是通过下一帧的起始码来判断,因此最后一帧无法正常结束,需要对最后一帧的数据的读取进行特殊处理,处理的过程如下:在数据流保存到发送缓冲区的时候进行判断是否到达文件末尾,如果到达文件末尾则进行逐字节保存(正常情况进行4字节保存)。


  1. 解决方法


修改MPEG4中将数据流保存到发送缓冲区的函数saveToNextCode(),修改过的代码如下:

    if (haveSeenEOF()) {//增加的判断部分
      // We hit EOF the last time that we tried to parse this data,
      // so we know that the remaining unparsed data forms a complete NAL unit:
      save4Bytes(curWord);
      unsigned remainingDataSize = totNumValidBytes() - curOffset();
      if (remainingDataSize == 0) (void)get1Byte(); // forces another read, which will cause EOF to get handled for real this time
#ifdef DEBUG
      fprintf(stderr, "This frame unit (%d bytes) ends with EOF\n", remainingDataSize);
#endif
      if (remainingDataSize == 0) return;
      
       while (remainingDataSize > 0) {
      
      saveByte(get1Byte());
      remainingDataSize--;
      }
      curWord = 0x000001B6;
    } else {
      while ((curWord&0xFFFFFF00) != 0x00000100) {

	if ((unsigned)(curWord&0xFF) > 1) {
	  save4Bytes(curWord);
	  curWord = get4Bytes();
	} else {
	  saveByte(curWord>>24);
	  unsigned char newByte = get1Byte();
	  curWord = (curWord<<8)|newByte;
	}

    }
  }




  1. 最终效果

发送端使用wireshark抓包,并和视频源文件进行对比(二进制)可得到如下的实验现象,视频服务器的问题得到解决:


码流文件所用编码

现象

H264

能够发送所有数据

MPEG4

能够发送所有数据


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值