[swscaler] Warning: data is not aligned! This can lead to a speedloss 的解决方法【FFmpeg】

[swscaler] Warning: data is not aligned! This can lead to a speedloss 的解决

相信如果你用了FFmpeg一段时间,对以下的黄色警告肯定不会陌生




这种刺眼的黄色警告(还会影响性能),对一个强迫症患者来说,实在是不能忍!

其实导致报警的原因很简单,就是swscaler的缩放的目标尺寸不合适,它想要的大小是 16 的倍数!


只要简单的代码就解决掉这个讨厌的警告:

	m_dst_h = (dst_h >> 4) << 4 ;
	m_dst_w = (dst_w >> 4) <<4 ;


如果是按比例的话,就是:

	float ratio = 1.0f * getSrcWidth()/getSrcHeight();
	m_dst_h = (dst_h >> 4) << 4 ;
	m_dst_w = (int(ratio * m_dst_h)>>4)  <<4 ;


如图,世界就清净了



注意以上方法得到的尺寸是不大于原大小的,如果想得到不小于原大小尺寸,那么就要改为以下方法:

size = (size + 0xf) & ~0xf;


如果想得到2次幂的宽高,且不小于原宽高,那么改为以下方法:


 int tmp = 1;
 int w = bitmap.getWidth();
 int h = bitmap.getHeight();
 while (w > tmp || h > tmp) {
      tmp <<= 1;
 }

 int width = tmp;
 int height = tmp;





  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
出现"ValueError: Data must be aligned to block boundary in ECB mode"的原因是在使用AES ECB模式时,数据长度不是16的倍数。这个错误可以通过增加填充来解决。 在这里,我们可以使用PKCS7填充,将数据长度填充到16的倍数。修改后的代码如下: ```python from Crypto.Cipher import AES import os # PKCS7填充 def pkcs7_padding(data): padding_len = AES.block_size - len(data) % AES.block_size padding = bytes([padding_len] * padding_len) return data + padding # PKCS7反填充 def pkcs7_unpadding(data): padding_len = data[-1] return data[:-padding_len] # 生成随机子密钥 def generate_subkey(key): aes = AES.new(key, AES.MODE_ECB) subkey = os.urandom(16) return aes.encrypt(subkey) # 加密函数 def encrypt(key, plaintext): aes = AES.new(key, AES.MODE_ECB) plaintext = pkcs7_padding(plaintext) ciphertext = aes.encrypt(plaintext) subkey = generate_subkey(key) aes = AES.new(subkey, AES.MODE_ECB) encrypted_subkey = aes.encrypt(subkey) return encrypted_subkey + ciphertext # 解密函数 def decrypt(key, ciphertext): encrypted_subkey = ciphertext[:16] subkey = AES.new(key, AES.MODE_ECB).decrypt(encrypted_subkey) aes = AES.new(subkey, AES.MODE_ECB) plaintext = aes.decrypt(ciphertext[16:]) plaintext = pkcs7_unpadding(plaintext) return plaintext # 测试代码 if __name__ == '__main__': key = os.urandom(16) plaintext = b'This is a test plaintext.' ciphertext = encrypt(key, plaintext) decrypted_plaintext = decrypt(key, ciphertext) print(decrypted_plaintext) ``` 在修改后的代码中,我们增加了PKCS7填充和反填充函数,用于将数据长度填充到16的倍数。在加密函数中,我们首先对明文进行填充,然后再进行加密。在解密函数中,我们先使用给定的密钥解密出加密后的子密钥,然后使用该子密钥解密密文,最后再进行反填充,得到明文。 需要注意的是,在使用PKCS7填充时,如果数据长度已经是16的倍数,还需要增加一个16字节的填充块。此外,在使用填充时,需要确保加密和解密的代码中都使用了相同的填充方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaderJoy

您的打赏是我继续写博客的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值