用ffmpeg模拟生成异态视频

背景

  • 制作两个视频,一个正常,一个含各种异态(黑场、静帧、马赛克),用于一致性比对系统开发的测试

插入黑场

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侧可以用播放器或者收录成视频文件验证一下。
    视频模拟马赛克方案
    以下是主要步骤:
  1. B服务器先开启ffmpeg收录指令 ffmpeg -i udp://10.1.128.124:11234 -c copy -f
    mpegts video_with_black_static_masic_frame.mp4 由于A服务器还未推流,此时是B拉不到流的

在这里插入图片描述

  1. A服务器推送单播流 ffmpeg -re -i video_with_black_static_frame.mp4 -f mpegts
    udp://10.1.128.124:11234 这时B应该收到数据,马上可以收录正常流了

在这里插入图片描述

  1. A服务器模拟丢包指令 sudo tc qdisc add dev enp2s0f1 root netem loss 10%
    这时B收录应该各种丢包报错,录下来的就是含马赛克的视频

在这里插入图片描述

  1. 停止A服务器丢包指令 sudo tc qdisc del dev enp2s0f1 root netem
    这时B收录各种丢包报错应该消失了

在这里插入图片描述

  1. 收录完成,停止推流,q退出

    看效果(这才是马赛克)
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值