Я почесал голову более недели, и я уверен, что это просто простая логическая проблема, которую я упускаю из виду ... Я действительно не могу больше думать, так как я так долго смотрю на свой кодя надеюсь, что свежая пара глаз сможет увидеть, где находится проблема, и помочь мне ее исправить.
У меня есть файл bin от wireshark, который содержит RTP-сеанс через TCP, конечная цель длямне отправить его через UDP.Исходные размеры пакетов составляют 8192 байта, некоторые из них меньше (не имеет значения для объема этого вопроса, буферизации пакетов и т. Д.).Эти 8-килобайтные пакеты являются частью полного кадра, охватывающего несколько пакетов.После того, как я собрал полный кадр (считал из файла, восстановил кадр, удалив заголовки RTP и NAL, затем сохранив его в байте []), я затем разделю их на 1400 байт.
- Нарезать на 1400-байтовые чанки
- Реконструировать заголовок NAL для каждого чанка
- Создать новый заголовок RTP
- собрать все вместе и отправить его через DatagramPacket
Проблема здесь в том, что в последнем пакете полного кадра, похоже, отсутствуют некоторые байты (я сравнил свои сообщения с сообщением из исходного файла bin).Что делает мой код, чего я не вижу?
private LinkedList<byte[]> fragmentVideoData(int newSize) {
LinkedList<byte[]> videoFragments = new LinkedList();
byte firstByte, secondByte, startByte, endByte;
/*
NAL header being reconstructed.
*/
int videoSize = videoData.length - 1;
int pos = 1;
byte[] fragment = null;
if(videoSize > newSize) {
while(videoSize > 0) {
fragment = new byte[(videoSize < newSize) ? videoSize : newSize];
ByteBuffer fragmentBuf = ByteBuffer.wrap(fragment);
fragmentBuf.put(firstByte);
if(videoFragments.isEmpty()) {
fragmentBuf.put(startByte);
}
else if(videoSize < newSize) {
fragmentBuf.put(endByte);
}
else if(videoSize > newSize) {
fragmentBuf.put(secondByte);
}
fragmentBuf.put(videoData, pos, ((videoSize < newSize) ? videoSize : newSize) - 2);
videoFragments.add(fragment);
videoSize -= newSize - 2;
pos += newSize - 2;
fragmentBuf.clear();
}
}
else {
fragment = new byte[videoSize + 1];
ByteBuffer fragmentBuf = ByteBuffer.wrap(fragment);
fragmentBuf.put(videoData);
videoFragments.add(fragment);
}
return videoFragments;
}