小编ten*_*dev的帖子

使用mp4v2将h264写入mp4容器的正确方法是什么?

我在编写从RTP数据包到MP4文件的h264帧时遇到了问题.视频播放(例如)命令avplay/ffplay,但我收到这些错误:  

[h264 @ 0x7faebc006d40] no frame!0KB vq=   79KB sq=    0B f=0/9
Run Code Online (Sandbox Code Playgroud)

当然,看起来有些帧错过了.我写数据包的方式如下:

  1. 等待NAL类型= 8(= SPS)和7(= PPS)的数据包,此时将传入数据包保留在列表中.
  2. 如果NAL类型是28,则意味着帧被分割 - 查找起始位和结束位,然后创建适当的NAL单元并将片段粘在一起.
  3. 如果我们找到了PPS和SPS表,那么创建MP4文件:

    char*application_name ="isom"; _mp4file = MP4CreateEx(name,0,1,1,application_name,1);

     然后创建VideoTrack:

     _video = MP4AddH264VideoTrack(_mp4file, _videoTimeScale, _videoTimeScale / _videoSampleDuration, _videoWidth, _videoHeight,
                                                _sps->getData()[1], //sps[1] AVCProfileIndication
                                                _sps->getData()[2], //sps[2] profile_compat
                                                _sps->getData()[3], //sps[3] AVCLevelIndication
    3); // 4 (minusOne) bytes length before each NAL unit 
    
    Run Code Online (Sandbox Code Playgroud)

    并设置一些东西:

    MP4SetVideoProfileLevel(_mp4file, 0x7F);
    MP4AddH264SequenceParameterSet(_mp4file, _video, _sps->getData(), _sps->getSize());
    MP4AddH264PictureParameterSet(_mp4file, _video, _pps->getData(), _pps->getSize());
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从列表到文件刷新等待帧,在开头的Big Endian中添加了帧大小:

    MP4WriteSample(_mp4file, _video, waitingFrame->getDataWithNalSize(), waitingFrame->getSize(), MP4_INVALID_DURATION, 0, 1);
    Run Code Online (Sandbox Code Playgroud)
  5. 读取RTP数据包并将其写入循环到文件:
    MP4WriteSample(_mp4file, _video, …
    Run Code Online (Sandbox Code Playgroud)

video mp4 rtp h.264

5
推荐指数
1
解决办法
2397
查看次数

标签 统计

h.264 ×1

mp4 ×1

rtp ×1

video ×1