Fragmented MP4 - problem playing in browser

后端 未结 4 1121
醉梦人生
醉梦人生 2021-02-09 05:28

I try to create fragmented MP4 from raw H264 video data so I could play it in internet browser\'s player. My goal is to create live streaming system, where media server would se

4条回答
  •  礼貌的吻别
    2021-02-09 06:09

    I finally found the solution. My MP4 now plays in Chrome (while still playing in other tested browsers).

    In Chrome chrome://media-internals/ shows MSE logs (of a sort). When I looked there, I found a few of following warnings for my test player:

    ISO-BMFF container metadata for video frame indicates that the frame is not a keyframe, but the video frame contents indicate the opposite.
    

    That made me think and encouraged to set AV_PKT_FLAG_KEY for packets with keyframes. I added following code to section with filling AVPacket structure:

        //Check if keyframe field needs to be set
        int allowedNalsCount = 3; //In one packet there would be at most three NALs: SPS, PPS and video frame
        packet.flags = 0;
        for(int i = 0; i < frameSize && allowedNalsCount > 0; ++i)
        {
            uint32_t *curr =  (uint32_t*)(frameBuffer + i);
            if(*curr == synchMarker)
            {
                uint8_t nalType = frameBuffer[i + sizeof(uint32_t)] & 0x1F;
                if(nalType == KEYFRAME)
                {
                    std::cout << "Keyframe detected at frame nr " << framesTotal << std::endl;
                    packet.flags = AV_PKT_FLAG_KEY;
                    break;
                }
                else
                    i += sizeof(uint32_t) + 1; //We parsed this already, no point in doing it again
    
                --allowedNalsCount;
            }
        }
    

    A KEYFRAME constant turns out to be 0x5 in my case (Slice IDR).

提交回复
热议问题