我有一个应用程序我已经编写过,可以将模拟的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?
答案 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是获取媒体文件信息的绝佳工具。您可以检查输入文件的规格,但它不会帮助您检测被编码器强制选择或错误选择的错误级别。最安全的方法是重新编码。