首页 > 其他分享 >使用 OpenCV 为视频添加视频时间水印

使用 OpenCV 为视频添加视频时间水印

时间:2025-01-01 14:52:02浏览次数:1  
标签:视频 frame cap cv2 水印 OpenCV video time total

该文章的原创地址: https://bbs.huaweicloud.com/blogs/444240

1. 安装 opencv-python

pip install opencv-python

2. 代码逻辑

  1. 使用 opencv 读取视频文件
import cv2
import sys

# 使用 cv 打开视频文件
cap = cv2.VideoCapture("./test.mp4")

# 检查视频文件是否呈贡打开
if not cap.isOpened():
    print("failed to open the video file", file=sys.stderr)
    sys.exit(1)

# 持续读取视频每一帧
while True:
    # ret 是读取结果, frame 是视频的每一帧
    ret, frame = cap.read()
    # 如果读取失败
    if not ret:
        print("read video file to end", file=sys.stderr)
        break
    # 显示视频
    # 第一个参数是窗口名称, 第二个参数是视频帧
    cv2.imshow("test.mp4", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
  1. 获取视频属性
# 获取视频 FPS
fps = cap.get(cv2.CAP_PROP_FPS)
# 获取视频尺寸
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 获取视频总帧数
total_frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 获取当前帧的时间, 毫秒
current_frame_time = (cap.get(cv2.CAP_PROP_POS_MSEC))
  1. 获取视频总时长
def get_total_video_time(frame_count, fps):
    (frame_count / fps) * 1000
  1. 转换帧时间为字符串
def milliseconds_to_time_str(milliseconds)
    # 将毫秒转换为秒
    seconds = milliseconds / 1000
    # 计算小时数
    hours = int(seconds // 3600)
    seconds %= 3600
    # 计算分钟数
    minutes = int(seconds // 60)
    seconds %= 60
    # 返回格式化的时间字符串
    return f"{hours:02}:{minutes:02}:{seconds:06.3f}"
  1. 绘制水印
# 总视频时长
total_video_time = get_total_video_time(total_frame_count, fps)
# 总视频时长字符串
total_video_time_str = milliseconds_to_time_str(total_video_time)

# 当前视频时间字符串
current_frame_time_str = milliseconds_to_time_str(current_frame_time)

# 绘制一个背景
rect_pos_1 = (0, frame_height)
rect_pos_2 = (460, frame_height - 70)
cv2.rectangle(frame, rect_pos_1, rect_pos_2, (25, 25, 25), cv2.FILLED)

# 绘制帧进度
text_pos_1 = (5, frame_height - 40)
text = f"{frame_count:05}/{total_frame_count}"
cv2.putText(frame, text, text_pos_1, cv2.FONT_HERSHEY_DUPLEX ,1, (255, 255, 255), 1)

# 绘制时间进度
text_pos_2 = (5, frame_height - 5)
text = f"{time_str}/{total_time_str}"
cv2.putText(frame, text, text_pos_2, cv2.FONT_HERSHEY_DUPLEX ,1, (255, 255, 255), 1)
  1. 保存视频
# 打开视频写
writer = cv2.VideoWriter("./output.mp4")
# 写出帧到视频文件
writer.write(frame)
# 释放写
writer.release()

3. 完整代码

import cv2
import sys

def get_total_video_time(frame_count, fps):
    return (frame_count / fps) * 1000

def milliseconds_to_time_str(milliseconds):
    # 将毫秒转换为秒
    seconds = milliseconds / 1000
    # 计算小时数
    hours = int(seconds // 3600)
    seconds %= 3600
    # 计算分钟数
    minutes = int(seconds // 60)
    seconds %= 60
    # 返回格式化的时间字符串
    return f"{hours:02}:{minutes:02}:{seconds:06.3f}"

def main(input_video, output_video):
    cap = cv2.VideoCapture(input_video)
    if not cap.isOpened():
        print(f"failed to open the video file, video_file={input_video}", file=sys.stderr)
        sys.exit(1)

    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    total_frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    total_video_time = get_total_video_time(total_frame_count, fps)
    total_video_time_str = milliseconds_to_time_str(total_video_time)
    frame_index = 0

    text_pos_1 = (5, frame_height - 40)
    text_pos_2 = (5, frame_height - 5)

    rect_pos_1 = (0, frame_height)
    rect_pos_2 = (460, frame_height - 70)

    fourcc = cv2.VideoWriter_fourcc(*"mp4v")
    writer = cv2.VideoWriter(output_video, fourcc, fps, (frame_width, frame_height))

    while True:
        ret, frame = cap.read()
        if not ret:
            print("read to end of video", file=sys.stderr)
            sys.exit(1)

        frame_index += 1
        current_time = cap.get(cv2.CAP_PROP_POS_MSEC)
        current_time_str = milliseconds_to_time_str(current_time)

        cv2.rectangle(frame, rect_pos_1, rect_pos_2, (25, 25, 25), cv2.FILLED)

        text = f"{frame_index:05}/{total_frame_count}"
        cv2.putText(frame, text, text_pos_1, cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1)

        text = f"{current_time_str}/{total_video_time_str}"
        cv2.putText(frame, text, text_pos_2, cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1)

        writer.write(frame)
    writer.release()
    cap.release()
    cv2.destroyAllWindows()

标签:视频,frame,cap,cv2,水印,OpenCV,video,time,total
From: https://www.cnblogs.com/Annlix/p/18645934/add_video_watermark_use_opencv

相关文章

  • 人工智能短视频内容理解与生成技术在美团的创新实践7
     1.背景美团围绕丰富的本地生活服务电商场景,积累了丰富的视频数据。美团场景下的短视频示例上面展示了美团业务场景下的一个菜品评论示例。可以看到,视频相较于文本和图像可以提供更加丰富的信息,创意菜“冰与火之歌”中火焰与巧克力和冰淇淋的动态交互,通过短视频形式进......
  • 微信小程序/个人简历/地图/api 首页是个人简历的信息还包括一些功能/背景音乐(删除,更改
    微信小程序/个人简历/地图/api首页是个人简历的信息还包括一些功能/背景音乐(删除,更改)/个人视频介绍(删除,更改)/地图搜素/导航/直线距离/今日新闻本项目需要两个api需要自己申请添加腾讯地图api极速数据的新闻api申请之后到相应的js里面修改即可本项目功能非常多大家可以自......
  • OpenCV+VS2022——环境搭建竟如此简单
    目录1.OpenCV的下载2.VS环境配置3.测试环境是否配置成功废话不多说,马上手把手教大家如何在VS里搭建OpenCV的C++开发环境。1.OpenCV的下载首先,打开OpenCV下载页面,并点击图中的Windows,开始下载OpenCV的安装器,这是一个exe可执行文件,如下图所示:名字大概长这个样子:......
  • 外面收费498的AI美女短视频玩法是怎么变现的?(附详细实操教程)
    今天给大家分享一个可落地实操的项目–AI美女短视频玩法。AI和剪映搭配起来,做出那种美女短视频,然后多账号发布,在小红书抖音快手上发这些美女视频的笔记。一旦笔记火了,粉丝数就能快速涨上去,因为大家都爱看美女视频嘛,所以粉丝涨得特别快。等到了1000粉丝,咱们就可以找渠道变......
  • chrome播放webRTC的H265视频方法
    需求描述最近有需求实现浏览器直接播放摄像头视频鉴于Camera本身支持了rtsp流,本想web直接播放rtsp,但是还不行,搜了一下webRTC实现的效果和延迟会好一些。于是就使用了mediaMTX转了下rtsp的流,变为webRTC。随便写了个h5页面对视频进行播放,使用下面代码的话替换一下src地址即可点......
  • StableAnimator:复旦微软联手打造AI视频神器,静照秒变动态大片
    复​旦微软联手打造AI视频神器静照秒变动态大片复旦大学携手微软推出了全新工具——StableAnimator!这款创新技术能够将静态照片轻松转换为高质量视频,只需一张图片和动作序列,即可生成媲美好莱坞特效的效果。操作便捷,无需后期处理,感兴趣的朋友快来尝试吧!重磅!复旦联手微软推......
  • 网页直播/点播播放器EasyPlayer.js遇到播放RTMP视频时,画面显示异常是什么原因?
    流媒体作为数字时代信息传播的重要载体,正展现出前所未有的广阔前景。其凭借实时性、互动性和跨平台兼容性的独特优势,不仅在娱乐、教育、新闻等多个领域大放异彩,还深刻改变了人们的生活方式和信息获取习惯。随着技术的不断进步和应用场景的不断拓展,流媒体正以前所未有的速度蓬勃发......
  • 无插件直播流媒体音视频播放器EasyPlayer.js开发之框架的讲解说明
    随着流媒体技术的迅速发展,H5将会成为了网页音视频播放的主流标准。H5提供了更安全的浏览体验,支持更多的功能,如本地存储、设备兼容和实时连接。这些特性使得H5在提供流畅的用户体验和保障用户隐私方面具有明显优势。EasyPlayer播放器一贯秉承Easy系列小而精,接口简单功能强大的宗......
  • java基于springboot+vue的视频点播系统数据与分析python+nodejs+php-计算机毕业设计
    目录功能和技术介绍具体实现截图开发核心技术:开发环境开发步骤编译运行核心代码部分展示系统设计详细视频演示可行性论证软件测试源码获取功能和技术介绍该系统基于浏览器的方式进行访问,采用springboot集成快速开发框架,前端使用vue方式,基于es5的语法,开发工具Intelli......
  • 低功耗视频监控/太阳能监控在农业大棚领域应用时,需要考虑哪些方面?
    在农业大棚领域应用太阳能监控系统时,需要综合考虑系统的能源自给能力、环境适应性、监控覆盖范围、数据采集与分析能力、成本效益比以及维护便捷性等多个方面,以确保监控系统能够稳定运行,有效提升农业生产效率和作物质量。那么当太阳能监控在农业大棚领域应用时,需要考虑哪些方面......