当前位置: 首页 > 知识库问答 >
问题:

FFmpeg输出损坏的NAL单元

叶衡虑
2023-03-14

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

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

然而,所有生成的NAL单元似乎都已损坏,原因是:

>

  • NAL单元报头的forbidden_zero_bit(最高有效位)为1。例如,下图所示NAL单元的报头(0x00 0x00 0x01之后的字节)是0xB6,因此最高有效位显然等于1。

    NAL单元中的许多字节等于0xFF。我真的不知道他们是不是应该是这样的,他们只是在我看来很奇怪。

    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
    ...
    ...
    ...
    
    ffmpeg -f gdigrab -i desktop -an -vcodec libx264 -f rtp rtp://192.168.0.12:23000
    

    在本例中,我得到的不是附件B样式的NAL单元,而是AVCC样式的单元(没有0x00 0x00 0x01分隔符,但前面有它们的长度,如本文所述)。

    对于AVCC NAL单元,我真的不明白一个在哪里结束,另一个在哪里开始,也不明白上面链接的问题中提到的“引渡”在哪里。

    总结起来,我想知道的有以下几点:

    有没有更简单的方法在Windows上捕获屏幕,编码,发送流到Android设备,并在我的应用程序中显示视频?(可能是我没有注意到的库或API)

  • 共有1个答案

    丁翊歌
    2023-03-14

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

    不会被腐蚀。RTP数据包中存在原始h264数据以外的信息。该信息可能包含字节序列00 0001,并且它不会发出NALU的信号。

    2)根据我的理解(从这里),您必须将不同的NAL单元提供给MediaCodec进行解码。那么,我如何将AVCC格式的NAL单元彼此分开呢?

    4)有没有更简单的方法在Windows上捕获屏幕,编码,将流发送到Android设备,然后在我的应用程序中显示视频?(可能是一个库或一个我没有注意到的API)

    这是一个相当固执己见的问题。RTP非常简单。但也有可能有其他的选择,每种选择都有利弊。

     类似资料:
    • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl

    • 问题内容: 一些背景: 在使用Macports的Mac OS X 10.6上,我已经DYLD_LIBRARY_PATH在.bash_profile中进行了设置。 问题: 运行时出现java -version此错误: VM初始化期间发生错误 无法加载本机库:libjava.jnilib 通过一个有用的论坛线程,我发现问题是由于设置了’/ opt / local / lib’目录中的某些文件而导致了麻

    • 出于性能考虑,我们尝试重新使用相同的KieBase对象来为针对相同规则集的每个规则调用生成新的KieSession。Everthingyth运行良好,直到一段时间后,突然,从缓存的kieBase新创建的kieSession停止触发它应该触发的规则。 但是一旦我们摆脱了缓存的kieBase并重新创建了一个新的kieBase和新的kieSession,它就会再次开始工作。 我们的理解是,kieBase

    • 我正在ServletOutputStream上编写一个excel文件(使用HSSFWorkBook for xls和XSSFWorkBook forxlsx)。作为ServletResponse的一部分下载的excel已损坏并包含垃圾字符。 我尝试过将Excel文件写入FileOutpuStream,它工作正常。Excel文件可读且完好无损。 已经检查了关于同一问题的其他几个StackOverfl

    • 问题内容: 我正在尝试使用FileReference类上传文件。文件> 2MB都可以正常工作,但是文件<2MB会导致此错误: “ java.io.IOException:表单数据损坏:提前结束” 在服务器上,我使用com.oreilly.servlet包来处理请求。 我已经多次使用此软件包来成功处理来自flex的文件上传,但是由于某些原因,现在遇到了这个问题。 这是有关更多信息的堆栈跟踪: 问题答