背景
- 制作两个视频,一个正常,一个含各种异态(黑场、静帧、马赛克),用于一致性比对系统开发的测试
插入黑场
from moviepy.editor import VideoFileClip, concatenate_videoclips, ColorClip
import numpy as np
# 读取原始视频
video_path = 'video/normal_video.mp4'
video_clip = VideoFileClip(video_path)
# 视频信息
fps = video_clip.fps
width, height = video_clip.size
# 第10秒开始加入黑场的帧数
start_black_frame_time = 10 # 第10秒开始
black_frame_duration = 3 # 3秒的黑场
# 获取原视频中第10秒之前的部分
clip_before_black_frame = video_clip.subclip(0, start_black_frame_time)
# 生成纯黑色画面的黑场
black_frame = ColorClip(size=(width, height), color=(0, 0, 0), duration=black_frame_duration)
# 获取原视频中第13秒之后的部分
clip_after_black_frame = video_clip.subclip(start_black_frame_time + 3, video_clip.duration)
# 合并视频片段
final_clip = concatenate_videoclips([clip_before_black_frame, black_frame, clip_after_black_frame])
# 保存最终视频
output_video_path = 'video/video_with_black_frame.mp4'
final_clip.write_videofile(output_video_path, codec='libx264', audio_codec='aac', fps=fps)
插入静帧
from moviepy.editor import VideoFileClip, ImageClip, concatenate_videoclips
# 读取原始视频
video_path = 'video/video_with_black_frame.mp4'
video_clip = VideoFileClip(video_path)
# 视频信息
fps = video_clip.fps
# 获取原视频中第30秒的图像
static_frame_image = video_clip.get_frame(30)
# 创建静帧
static_frame = ImageClip(static_frame_image, duration=3)
# 获取原视频中第33秒之后的部分
clip_after_static_frame = video_clip.subclip(33, video_clip.duration)
# 合并视频片段
final_clip = concatenate_videoclips([video_clip.subclip(0, 30), static_frame, clip_after_static_frame])
# 保存最终视频
output_video_path = 'video/video_with_black_static_frame.mp4'
final_clip.write_videofile(output_video_path, codec='libx264', audio_codec='aac', fps=fps)
模拟马赛克
- 这个有点麻烦,很多测试视频马赛克比较假,跟实际播出中马赛克情况不同,实际环境中马赛克大多是传输丢包导致,因此这里采用模拟网卡丢包的方式(生产环境注意安全)造马赛克。
- 首先了解下模拟网口丢包命令:
# 查看规则
sudo tc qdisc show dev enp2s0f1
# 添加模拟丢包的规则
sudo tc qdisc add dev enp2s0f1 root netem loss 10%
# 删除规则
sudo tc qdisc del dev enp2s0f1 root netem
- 这里需要两台网络相通的服务器A和B,用A通过网卡如enp2s0f1(地址10.1.128.125)将模拟视频“video_with_black_static_frame.mp4”推单播流给服务器B网卡如enp2s0f1(地址10.1.128.124),在服务器A端造网口enp2s0f1丢包,在B测ping一下A的该端口,看是否发生实际丢包。
- 在服务器A用ffmpeg推送测试udp单播流到服务器B的enp2s0f1(地址10.1.128.124),可知一定是通过A的enp2s0f1(地址10.1.128.125)推过去的,但此时该口有丢包,因此B侧拉udp单播流一定是花屏马赛克的情况,B侧可以用播放器或者收录成视频文件验证一下。
以下是主要步骤:
- B服务器先开启ffmpeg收录指令 ffmpeg -i udp://10.1.128.124:11234 -c copy -f
mpegts video_with_black_static_masic_frame.mp4 由于A服务器还未推流,此时是B拉不到流的
- A服务器推送单播流 ffmpeg -re -i video_with_black_static_frame.mp4 -f mpegts
udp://10.1.128.124:11234 这时B应该收到数据,马上可以收录正常流了
- A服务器模拟丢包指令 sudo tc qdisc add dev enp2s0f1 root netem loss 10%
这时B收录应该各种丢包报错,录下来的就是含马赛克的视频
- 停止A服务器丢包指令 sudo tc qdisc del dev enp2s0f1 root netem
这时B收录各种丢包报错应该消失了
-
收录完成,停止推流,q退出
看效果(这才是马赛克)