mp4v2 写mp4 java,视频 – 使用mp4v2将h264写入mp4容器的正确方法是什么?

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

[h264 @ 0x7faebc006d40] no frame!0KB vq=   79KB sq=    0B f=0/9

当然,看起来有些帧错过了.

我写数据包的方式如下:

>为此,等待NAL类型= 8(= SPS)和7(= PPS)的数据包

time将传入的数据包保留在列表中.

>如果NAL类型为28,则表示帧已分割 – 查找开始

位和结束位然后创建适当的NAL单位并坚持

碎片在一起.

>如果我们找到了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

并设置一些东西:

MP4SetVideoProfileLevel(_mp4file, 0x7F);

MP4AddH264SequenceParameterSet(_mp4file, _video, _sps->getData(), _sps->getSize());

MP4AddH264PictureParameterSet(_mp4file, _video, _pps->getData(), _pps->getSize());

>从列表到文件刷新等待帧,在开头的Big Endian中添加帧大小:

MP4WriteSample(_mp4file, _video, waitingFrame->getDataWithNalSize(), waitingFrame->getSize(), MP4_INVALID_DURATION, 0, 1);

>读取RTP数据包并将其写入循环到文件:

MP4WriteSample(_mp4file, _video, _videoFrame->getDataWithNalSize(), _videoFrame->getSize(), MP4_INVALID_DURATION, 0, 1);

RTP有效负载由以下类型的NAL组成:

– PPS(8)

– SPS(7)

– 分帧(28),坚持后我得到IDR(5)和非IDR(1)视频帧

– SEI(6)

– AUD(9)

奇怪的是,如果我不使用MP4WriteSample函数在文件的开头写PPS和SPS,我会收到这些错误(来自avplay):

[h264 @ 0x7faebc006d40] non-existing PPS 0 referenced

[h264 @ 0x7faebc006d40] decode_slice_header error

[h264 @ 0x7faebc008200] no frame!

但如果我这样做,就没有错误.

所以真正的问题是SEI NAL.如果我将它们写入RTP流中(使用MP4WriteSample),我会收到“无帧”错误.但是如果我在文件的开头只编写一个SEI“框架”(使用MP4WriteSample),我就会遇到这种错误:

[h264 @ 0x7f1e48007d40] error while decoding MB 50 0, bytestream (-48)

[h264 @ 0x7f1e48007d40] concealing 1499 DC, 1499 AC, 1499 MV errors

[h264 @ 0x7f1e48008200] error while decoding MB 44 0, bytestream (-25)

[h264 @ 0x7f1e48008200] concealing 1500 DC, 1500 AC, 1500 MV errors

[h264 @ 0x7f1e48006d40] top block unavailable for requested intra4x4 mode -1 at 52 0

然后图片失真(但后来我没有“没有帧”错误).

所以我的问题是什么是将SEI(也许是澳元?)NAL写入mp4容器的正确方法?

在我的项目中,我必须使用mp4v2库或任何其他免费使用许可证的库(这就是为什么我不能使用libav)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值