簡體   English   中英

將 RTP 視頻流(H264 編解碼器)寫入 mp4 文件

[英]Write RTP video stream (H264 codec) to a mp4 file

我想存儲從 rtp(實時)流錄制到文件的 H264 視頻。 我已經用一個簡單的 java 程序試過了,但是 vlc 播放器無法打開文件。

這是我的代碼:

    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();
    }

該文件將被創建,但無法打開它。 是否有任何標題信息我必須剪切或添加到字節數組以獲得正確的視頻文件?

更新:

好的,問題似乎是h264 rtp數據包的nal頭信息,因為我可以打開帶有標准rtp頭的錄制的h263視頻(但視頻質量確實很差)。

您必須從 RTP 數據包中解壓視頻數據

Rtp 的數據包中包含不屬於 h264 流一部分的標頭,並且具有將一個 nal 單元(基本上是單個 h264“數據包”)拆分為多個數據包或將多個 nal 單元合並為一個數據包的機制,這兩者添加不能成為最終產品一部分的元數據。

此外,RTP 流可能不包含播放視頻所需的一些元數據,尤其是在通過 rtsp 協商時。 如果是這種情況,您將不得不從 SDP 中的 sprop-parameter-sets 中提取一些 NAL 單元。

您可以在此處找到有關所有這些工作原理的文檔: https : //tools.ietf.org/html/rfc6184 這真的沒有聽起來那么難。

當 h264 寫入文件時,每個 nal 單元前面必須是三個 0 字節,然后是一個 1 字節。 您可以在此處找到更多詳細信息: 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 是一個很棒的程序,在損壞的視頻文件上運行它可以提供一些關於它出了什么問題的見解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM