小视频已深刻千家万户,抛开商业推广和多样的玩法,视频质量无疑是金字塔的根基。基于业务需求,对小视频质量提供了一系列的检测保障。
相关参数说明:python
- blackdetect filter :
检查视频中纯黑色画面的时间段。在检查视频中的过渡片断、广告或者非法数据等黑屏画面时颇有效。输出数据包含黑屏片断的起始点,以及黑屏时长,单位为秒。- black_min_duration, d:
设置黑场时间阈值,只有黑场的连续时间大于门限值才认为是黑场视频。阈值大于等于0,默认2.0。- picture_black_ratio_th, pic_th:
设置黑场的判断阈值,nb_black_pixels/nb_pixels(黑场像素/总像素),该值为百分比,大于等于此阈值认为此帧图片是黑场. 默认值0.98.- pixel_black_th, pix_th:
设置黑场像素的判断阈值,默认值0.10。根据此阈值计算绝对阈值,低于绝对阈值的像素认为是黑场像素点。
绝对阈值计算公式以下:
absolute_threshold = luminance_minimum_value + pixel_black_th * luminance_range_size
luminance_range_size and luminance_minimum_value 依赖输入视频的格式, 对于YUV full-range 其范围是 [0-255],对于YUV non full-range 其范围是 [16-235];- 例子:
blackdetect=d=2:pix_th=0.00
该命令设置黑色像素判断的阈值为0,检查黑屏时长不小于2s的片断。
因为直接使用python执行获取不到ffmpeg打印出来的流日志,因此这里采用了ffreport的方式,将日志输出到文件里,再解析文件获取黑屏片断。
你们有什么好的办法欢迎指导!shell
import os import subprocess from time import time, sleep def black_detect(video): report_file_name = './log/blackvideo-{}.log'.format(int(time())) cmd = 'FFREPORT=file={}:level=32 ffmpeg -report -v quiet -i {video} -vf blackdetect=d=0.5:pix_th=0.40:pic_th={pic_th} -f null - '.format( report_file_name, video=video, pic_th=0.85) try: popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) popen.wait() # stdout, stderr = popen.stderr sleep(0.5) except Exception as e: print(e) if os.path.exists(report_file_name): with open(report_file_name, 'r') as rf: content = rf.readlines() black_duration = {} part = 1 for con in content: if 'black_start' in con: print(con) black_info = con.split(' ')[-1:-4:-1] part_black_info = dict(map(lambda x: x.replace('n', '').split(':'), black_info)) black_duration[part] = part_black_info part += 1 print(black_duration) else: print('检测失败...')
https://cloud.tencent.com/dev...ide
参考文档:
https://blog.csdn.net/ternenc...
https://blog.csdn.net/ternenc...ui