我的数据包格式是否正确,可以使用ffmpeg将h.264数据转换为.mp4

时间:2014-09-02 13:34:08

标签: video ffmpeg h.264

我将使用ffmpeg

将h.264流数据转换为.mp4

SPS NALU:67 64 00 1F AC 56 50 20 06 1A 6E 04 04 04 0D A0 88 46 58

PPS NALU:28 EE 37 27

我使用以上NALU制作了原始文件,如下所示:

| 0x 00 00 00 01 | SPS | 0x 00 00 01 | PPS |帧数据| 0x 00 00 01 |

我的原始文件在这里:https://www.dropbox.com/s/gc9s9mll6ev9aoq/sps_pps_payload?dl=0

并自行构建数据:https://www.dropbox.com/s/ibs7io0aprpo66e/packet1?dl=0

在ffmpeg上使用以下命令:

ffmpeg.exe -f h264 -i RawInputFile -vcodec copy -r 25 OutPutFilename.mp4

但它总是给出: 访问单元中缺少图片,大小为XXXXX

没有框架!

流0的解码失败

无法找到流0的编解码器参数:未指定大小

我哪里错了?

2 个答案:

答案 0 :(得分:1)

您是如何生成“RawInputFile”的?查看SPS,PPS缓冲区有不同的帧头,如果是PPS,则在SPS 0x00 0x00 0x01的情况下为0x00 0x00 0x00 0x01。虽然这应该不是问题。

但是也有不同的NAL标头,在SPS的情况下,它是 0x67 ,在PPS的情况下, 0x28 。 NAL的低5位表示帧类型

e.g。

0x67& 0x1f = 0x07,即SPS

0x28& 0x1f = 0x08即PPS

但为什么高三位正在改变?需要检查这3位代表什么。

关于您的问题,FFMPEG或任何其他多路复用器都需要以下格式输入流,

0x00 0x00 0x00 0x01 0x67<< ...... SPS帧......>>

0x00 0x00 0x00 0x01 0x68<< ...... PPS帧.......>>

0x00 0x00 0x00 0x01 0x65<< ...... I frame ........>>

0x00 0x00 0x00 0x01 0x61<< ...... P frame ........>>

0x00 0x00 0x00 0x01 0x67<< ...... SPS帧......>>

0x00 0x00 0x00 0x01 0x68<< ...... PPS帧......>>

注意: 这里0x67,0x68等仅用于示例目的,高3位可以改变。

答案 1 :(得分:0)

您将在尺寸为xxxx"的访问单元中丢失图片。如果你没有用关键帧(I帧)完成你的文件。 只需确保文件的最后一帧是I帧。