簡體   English   中英

FFmpeg:解碼從 UDP 套接字接收的 AVPackets

[英]FFmpeg: Decoding AVPackets received from UDP socket

我正在嘗試將使用 FFmpeg 編碼的 stream 視頻幀從 Unity 游戲通過 UDP 從 Unity 游戲發送到客戶端 UI。 具體來說,我從服務器發送 AVPackets(據我所知,其中包含壓縮幀),然后在客戶端提取如下:

inline UDPpacket* SDLGameClient::receiveData()
{
    if(SDLNet_UDP_Recv(socket, packet))
        return packet;
    else
        return NULL;
}

int main()
{
    ...
    // Initialize UDP
    ...
    UDPpacket *udpPacket;

    int i = 0;

    for(;;)
    {
        udpPacket = client->receiveData();

        if(udpPacket != nullptr)
        {
            i++;
            std::cout << "Packet " << i << " received!" << std::endl;

            AVPacket packet;
            av_init_packet(&packet);

            packet.data = new uint8_t[udpPacket->len];
            memcpy(packet.data, udpPacket->data, udpPacket->len);
            packet.size = udpPacket->len;

            ...

為了實現聯網,我使用了 SDL_net 庫。 分段、發送和接收數據包似乎沒有任何問題。 我的問題是,如何將傳入的 AVPackets 和 stream 將 Unity 中記錄的幀解碼到客戶端? 我知道我需要使用avcodec_send_packetavcodec_receive_frame進行解碼(因為不推薦使用在許多示例解碼代碼中使用的avcodec_decode_video2 ),但是當我執行以下操作時:

int ret = avcodec_send_packet(codecContext, &packet);
if(ret < 0 || ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
    std::cout << "avcodec_send_packet: " << ret << std::endl;
else
{
    while(ret >= 0)
    {
        ret = avcodec_receive_frame(codecContext, frame);
        if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
            std::cout << "avcodec_receive_frame: " << ret << std::endl;

        std::cout << "Frame: " << codecContext->frame_number << std::endl;
    }
}

av_packet_unref(packet);

ret 總是返回一個負值(-22),所以可能是 AVPackets 出了點問題,或者我發送幀的速度太快了,我真的不知道:/

提前感謝您的幫助!

-22表示-EINVAL無效參數 通常,您可以檢查ffmpeg錯誤日志消息以獲取更多詳細信息。

我的猜測是您的數據包仍然是零散的,但是avcodec_send_packet()希望AVPacket始終包含完整的幀。 根據所涉及的編解碼器,您應該考慮使用AVParser恢復幀或在UDP分段之前對數據包進行幀構造,以便您可以自己恢復幀。

首先抱歉,由於聲譽問題,我無法對此發表評論。 我很想做同樣的事情。 我也得到完全相同的錯誤。 但是,我不知道如何添加 av_parser_parse2() function。 它還需要 AVCodecparseContext ,它也需要與發送者分開發送。 您能否分享您添加的部分 av_parser_parse2() function?

暫無
暫無

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

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