Ретрансляция RTP через TCP в RTP через UDP - PullRequest
0 голосов
/ 13 сентября 2018

Я почесал голову более недели, и я уверен, что это просто простая логическая проблема, которую я упускаю из виду ... Я действительно не могу больше думать, так как я так долго смотрю на свой кодя надеюсь, что свежая пара глаз сможет увидеть, где находится проблема, и помочь мне ее исправить.

У меня есть файл bin от wireshark, который содержит RTP-сеанс через TCP, конечная цель длямне отправить его через UDP.Исходные размеры пакетов составляют 8192 байта, некоторые из них меньше (не имеет значения для объема этого вопроса, буферизации пакетов и т. Д.).Эти 8-килобайтные пакеты являются частью полного кадра, охватывающего несколько пакетов.После того, как я собрал полный кадр (считал из файла, восстановил кадр, удалив заголовки RTP и NAL, затем сохранив его в байте []), я затем разделю их на 1400 байт.

  1. Нарезать на 1400-байтовые чанки
  2. Реконструировать заголовок NAL для каждого чанка
  3. Создать новый заголовок RTP
  4. собрать все вместе и отправить его через 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...