FFmpeg输出损坏的NAL单元

问题描述 投票:0回答:1

我需要将Windows PC的屏幕流式传输到Android。我打算使用FFmpeg捕获屏幕并使用H.264编解码器进行编码,通过RTP发送流,最后使用MediaCodec解码视频并将其显示在SurfaceView上。

我尝试了以下FFmpeg命令:

ffmpeg -f gdigrab -i desktop -an -video_size 1920x1080 -f rtp rtp://192.168.0.12:23000

但是,结果导致的所有NAL单元似乎已损坏,因为:

  1. NAL单元标头的forbidden_​​zero_bit(最高有效位)为1。例如,如下所示的NAL单元的标头(紧接在0x00 0x00 0x01之后的字节)为0xB6,因此显然最高有效位等于1。

  2. NAL单元中的很多字节等于0xFF。我实际上不知道他们是否应该像这样,他们对我来说似乎很奇怪。

这是FFmpeg输出的NAL单元之一的开始,并由Wireshark捕获:

0000   00 00 01 b6 56 5a bc 7c fd de ea e7 72 ff ff ff
0010   ff ff ff ef 7d d7 ff bd 6f 5f ff ee d7 ba bf ff
0020   fd df bd 7b a5 ff ff ff ff ff fd d7 78 bf fd e2
0030   ff ff ff ff ff ff 7b fe eb ff ff ff ff ff ff ff
0040   fe f5 ff ff ff ff fd b4 c6 17 45 ba 7e f4 e9 fb
0050   d7 ef 7f de ff ff ff ff fd d7 ff 79 ff bc ff ff
0060   ff ff ff ff ff ba ff ff ff ff ff ff ff 7b ff f7
0070   27 ff ff ff de ff ff ff ff ff ff ff fe ef fd c7
0080   de ef 6f 7b db dd db 74 de dd 37 bd ef ff ff ff
0090   ff ff ff ff 77 bb ff 75 ee ee bf ff ff fb dd df
00a0   ee d7 79 5e 5f ff ff ff fb 9b ff fb d7 ff ff ff
00b0   de bf ff ff ff ff ff ff ff ff fb 9d ef bd df 00
00c0   00 8f 03 ef ff ff ff ff ff ff ff 7b f7 03 1f fd
00d0   ed e5 ba ef 5d d5 cc 5f ff ff ff ff ff ff ff ff
00e0   ff ff ff ee 06 37 be f4 f6 eb ff ff ff ff ff ff
00f0   ff ff ff ff ff ff ff ba 5f f7 af ff ff ff ff ff
0100   ff ff ff ff ff ff ff ff fd d3 fb c2 ef 1b dd ed
...
...
...

Screenshot from Wireshark (same NAL unit)

我也尝试过在FFmpeg中明确指定视频编解码器,如下所示:

ffmpeg -f gdigrab -i desktop -an -vcodec libx264 -f rtp rtp://192.168.0.12:23000

在这种情况下,我没有附件B型的NAL单元,但有AVCC型的NAL单元(不带0x00 0x00 0x01分隔符,但以它们的长度开头,如here所述。]]

使用AVCC NAL单元,我不太清楚一个结点和另一个结点在哪里,以及上面链接的问题中提到的“额外数据”在哪里。

总而言之,我想知道的如下:

  1. 为什么第一个命令输出的NAL单元损坏?

  2. 据我了解(from here),您必须将单独的NAL单元馈送到MediaCodec进行解码。那么,如何将AVCC格式的NAL单元彼此分开?

  3. 在将视频编解码器指定为libx264时,我可以以某种方式强制FFmpeg输出Annex B型NAL单元而不是AVCC单元吗?] >>

  4. 是否有更直接的方法来捕获Windows上的屏幕,进行编码,将流发送到Android设备并在我的应用程序中显示视频? (也许是逃避我的通知的库或API)

  5. 我需要将Windows PC的屏幕流式传输到Android。我打算使用FFmpeg捕获屏幕并使用H.264编解码器进行编码,通过RTP发送流,最后使用MediaCodec来解码...

1)为什么第一个命令输出的NAL单元损坏?

没有被损坏。除了原始的h264数据,RTP数据包中还有其他信息。该信息可能包含字节序列00 00 01,并且不表示随后出现了NALU。

2)根据我的理解(从这里开始),您必须提供单独的NAL单位发送给MediaCodec进行解码。所以,我该如何在彼此的AVCC格式?

您解析流,包括协议开销

3)我可以以某种方式强制FFmpeg输出附件B型NAL单元将视频编解码器指定为libx264而不是AVCC?

这不符合RTP规范。如果使用RTP,则将获得AVCC起始lengthsize值。

4)是否有更直接的方式来捕获屏幕Windows,进行编码,将流发送到Android设备,然后在我的应用中显示视频? (也许是转义我的通知)

这是一个很自以为是的问题。 RTP非常简单。但是可能还有其他选择,每种选择都有其优缺点。

android ffmpeg h.264
1个回答
0
投票

1)为什么第一个命令输出的NAL单元损坏?

© www.soinside.com 2019 - 2024. All rights reserved.