Запись видеопотока RTP (кодек H264) в файл mp4

я хочу сохранить видео H264, записанное из потока rtp (live) в файл. Я пробовал это с помощью простой программы Java, но vlc player не может открыть файл.

вот мой код:

    try
    {
        socket = new DatagramSocket(port);
        fos = new FileOutputStream(filePath + outputFileName);

        do
        {
            DatagramPacket in = new DatagramPacket(inData, inData.length);
            socket.receive(in);

            byte[] bytes = in.getData();

            if (curPos < buffer.length)
            {
                for (int i = 0; i < bytes.length; i++)
                {
                    buffer[curPos] = bytes[i];
                    curPos++;

                    if (curPos >= buffer.length)
                    {
                        receivePackets = false;
                        break;
                    }
                }
            }
            else
            {
                receivePackets = false;
            }

            Thread.sleep(SOCKET_TIMEOUT);
        }
        while (receivePackets);

        fos.write(buffer, 0, buffer.length);            

        if (fos != null)
        {
            fos.close();
        }

        if (socket != null)
        {
            socket.close();
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

файл будет создан, но открыть его невозможно. есть ли какая-либо информация заголовка, которую я должен вырезать или добавить в массив байтов, чтобы получить правильный видеофайл?

ОБНОВЛЕНИЕ:

хорошо, проблема, кажется, заключается в последней информации заголовка rtp-пакета h264, потому что я могу открыть записанное видео h263 со стандартным заголовком rtp (но качество видео действительно плохое).


person Rich    schedule 31.08.2011    source источник
comment
Привет Райт, ты решил эту проблему? Как записать видео из rtp пакетов? Использовали ли вы какую-либо библиотеку RTP для удаления заголовков RTP, чтобы вы могли заставить блоки NAL записать их в файл? С уважением, Рам   -  person Ram    schedule 23.04.2012
comment
Я не работал над сохранением данных в файл. Я пытался реализовать прямую трансляцию через RTP/RTSP. Если вы все еще ищете решение, возможно, приложение spydroid содержит некоторую полезную информацию. .   -  person Rich    schedule 02.05.2012


Ответы (2)


Вы должны распаковать видеоданные из пакетов RTP.

person Georgi    schedule 23.12.2015
comment
Рассмотрите возможность предоставления более полезной информации в своем ответе, иначе это скорее комментарий. - person user3071284; 23.12.2015

Rtp имеет заголовки в своих пакетах, которые не являются частью потока h264, а также имеет механику для разделения одной конечной единицы (по сути, одного пакета h264) на несколько пакетов или объединения нескольких конечных единиц в один пакет, оба из которых добавляют метаданные. это не может быть частью конечного продукта.

Кроме того, поток RTP может не содержать некоторых метаданных, необходимых для воспроизведения видео, особенно если он согласован по протоколу rtsp. Если это так, вам придется вытащить некоторые блоки NAL из наборов параметров sprop в SDP.

Документацию о том, как все это работает, можно найти здесь: https://tools.ietf.org/html/rfc6184. Это действительно не так сложно, как кажется.

Когда h264 записывается в файл, каждой последней единице должны предшествовать три нулевых байта, а затем один байт. Подробнее об этом можно узнать здесь: https://www.itu.int/rec/T-REC-H.264-201906-I/en

VLC нужно уговорить воспроизвести необработанные файлы h264. Вы можете погуглить и найти простые шаги для этого, это не связано с кодом, поэтому я не буду копировать их здесь.

Если вам нужен файл в формате mp4, лучше всего использовать для этого библиотеку. Если вы хотите сделать все это самостоятельно, помогите вам небеса, но вы можете найти спецификацию здесь: https://web.archive.org/web/20180921052457/http://l.web.umkc.edu:80/lizhu/teaching/2016sp.video-communication/ref/mp4.pdf. Библиотека https://github.com/sannies/mp4parser написана на Java и может это делать, но некоторые вопросы. Ffmpeg — замечательная программа для этого, и мне посчастливилось запустить ее как подпроцесс для Java, передать ее стандарт и прочитать из него стандарт.

В качестве примечания: ffprobe — отличная программа, запуск ее на поврежденном видеофайле может дать некоторое представление о том, что с ней не так.

person yesennes    schedule 16.02.2021