我被告知有一个针对ffmpeg的补丁修复了流式传输到FLV播放器时的问题。
rtmpproto.c 第2314行附近有以下表达式:
if (rt->flv_header_bytes < 11)
break;
修复方法是将其更改为包含此附加要求:
if (rt->flv_header_bytes < 11 && !rt->flv_off)
break;
但是我很好奇这句话的逻辑。第一个语句检查FLV标头是否小于11个字节,但是在检查标头的大小字节数之前检查flv流是否先打开是不是更有效?
if (!rt->flv_off && rt->flv_header_bytes < 11)
break;
或者将语句更改为如此?
if (rt->flv_off || (!rt->flv_off && rt->flv_header_bytes < 11)
break;
这会更有效还是会以某种方式破坏代码?
答案 0 :(得分:1)
这取决于哪种情况最常失败,以及编译器是否遵守您键入条件的顺序。假设后者是真的(一个很大的假设),首先检查标题大小可能更有效,因为大概是FLV播放器通常是开启的。
更完整的评估需要更多具体内容......尽管这些都无论如何都不重要,因为(a)“浪费”的时间几乎肯定无关紧要;(b)编译器最有可能做得更好优化比你想象。
如果您想在第三个陈述中使用OR,只需应用DeMorgan定律并写下
if(rt->flv_off || rt->flv_header_bytes >= 11)
但同样,这不是真正需要担心的事情。