开源软件 Live555MediaSeverbug分析:
-
传输现象:
发送端使用wireshark抓包,并和视频源文件进行对比(二进制)可得到如下的实验现象:
-
码流文件所用编码
现象
H264
能够发送所有数据
MPEG4
少发送最后一帧的数据
-
原因
live555每一帧数据的结束是通过下一帧的起始码来判断,因此最后一帧无法正常结束,需要对最后一帧的数据的读取进行特殊处理,处理的过程如下:在数据流保存到发送缓冲区的时候进行判断是否到达文件末尾,如果到达文件末尾则进行逐字节保存(正常情况进行4字节保存)。
-
解决方法
修改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;
}
}
}
-
最终效果
发送端使用wireshark抓包,并和视频源文件进行对比(二进制)可得到如下的实验现象,视频服务器的问题得到解决:
-
码流文件所用编码
现象
H264
能够发送所有数据
MPEG4
能够发送所有数据
』