VLC 2.2和级别

时间:2015-08-19 16:07:25

标签: video mp4 vlc rtp libvlc

我有一个应用程序我已经编写过,可以将模拟的MP4摄像机流提供给一个黑盒子"。我使用讽刺的报价是因为我无法访问其来源,但我们与制造它的供应商签订了支持合同。

此黑匣子支持h.264 Level 2.2。它不使用任何类似SDP的东西,但只需要相机流为640x480 @ 30hz。我知道这是监控摄像机的合理标准输出。

所以我的应用程序使用vlc(特定于libVlc)将MP4文件传输到此设备。我有这个工作正常(one minor exception,但这是一个单独的问题)。但是,这与Vlc 2.1.5有关。当我尝试升级到最新的2.2.1时,而不是我们黑盒子另一边的视频,我们只看到白灰色的方块。

我们的供应商查看了wireshark转储,并告诉我vlc 2.2.1流报告自己为Level 5.1而不是2.2,并且它现在使用High Profile而不是Baseline或Main。它几乎看起来像VLC正试图升级" (转码?)我的视频在我身上,而且那个黑盒子上的读者搞砸了。

有没有办法从vlc 2.1.5中获取旧的行为,或者强制它使用我选择的Level和Profile?

1 个答案:

答案 0 :(得分:3)

H.264配置文件

Profiles是一组功能。如果您的黑匣子仅支持Baseline配置文件,则它无法使用High功能解码流。

VLC中,您可以设置x264编码器使用的H.264配置文件,如下所示:

--sout="#transcode{vcodec=h264,venc=x264{profile=baseline}...

H.264级别

将水平视为所需解码器性能的约束/指标。如果解码器支持特定配置文件的某个级别,那么它必须能够解码该级别和任何较低级别的流。

首先,640x480 @ 30 fps的等级为3,而不是2.2

您可以按照以下方式计算:

macrobolocks = ceil(640/16) * ceil(480/16) = 1200
macroblocks/s = macroblocks * 30 = 36000

ceil的原因是非mod16分辨率被填充为16的倍数。

然后你看一下H.264 Levels。您处于2.2 1620的帧大小限制范围内,但最大解码速度大于20252,因此您必须选择下一个级别3。您还必须考虑该表中Baseline个人资料的最大比特率。

如果你有Android设备,可以下载我的H.264 Calculator app from the Amazon App Store(如果你不喜欢他们的奥威尔应用权限,我可以发送apk

x264编码器会根据您的编码参数自动选择一个级别。使用VLC,您实际上可以使用以下内容设置标记:

--sout="#transcode{vcodec=h264,venc=x264{profile=baseline,level=22}"...

请注意,这会设置编码器输出标志,并且实际上不会生成Level 2.2流。你可以输入你想要的任何值,这样就可以将60 fps的全高清流标记为Level 2.2,即使它没有水平限制。

VLC转码

如果您想确保发送正确的流,则需要对源素材进行转码。这是640x480 @ 30 fps的一个示例,它会产生Level 3 H.264流,就像我在上面展示的那样。如果您需要Level 2.2,则需要降低分辨率或帧速率,或两者兼而有之。在这种情况下,您的视频比特率也会降低。

cvlc input.mp4 --sout="#transcode{vcodec=h264,venc=x264{profile=baseline},fps=30,width=640,height=480,vb=1372,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{...}

<强>的MediaInfo

Mediainfo是获取媒体文件信息的绝佳工具。您可以检查输入文件的规格,但它不会帮助您检测被编码器强制选择或错误选择的错误级别。最安全的方法是重新编码。