当前位置: 首页 > news >正文

视频调整帧率、分辨率+音画同步

# python data_utils/pre_video/multi_fps_crop_sync.pyimport cv2
import os
from tqdm import tqdm
import subprocess# 加载人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')def contains_face(frame):gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5)return len(faces) > 0def crop_center(frame, crop_width, crop_height):height, width = frame.shape[:2]start_x = width//2 - crop_width//2start_y = height//2 - crop_height//2return frame[start_y:start_y+crop_height, start_x:start_x+crop_width]def extract_audio(input_path, audio_path):subprocess.run(['ffmpeg', '-y', '-i', input_path, '-vn', '-acodec', 'copy', audio_path])def merge_video_audio(video_path, audio_path, output_path):# 使用ametadata滤镜将音频的时间戳与视频流的时间戳对齐subprocess.run(['ffmpeg', '-y', '-i', video_path, '-i', audio_path,'-filter_complex', "[0:v][0:a]ametadata=mode=video:video_input=0:video_stream=0[a]",'-map', '0:v', '-map', '[a]','-c:v', 'copy', '-c:a', 'aac',output_path])def process_video(path, out_path, fps=25):print(f'[INFO] ===== process video from {path} to {out_path} =====')# 创建VideoCapture对象cap = cv2.VideoCapture(path)# 检查是否成功打开视频if not cap.isOpened():print("Error opening video file")returnframe_rate = cap.get(cv2.CAP_PROP_FPS)total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取视频的总帧数frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频的宽度frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取视频的高度print("原视频帧率=", frame_rate, "fps")print("原视频帧数=", total_frames)print("原视频尺寸=", frame_width, "x", frame_height)if frame_rate != fps:cap.set(cv2.CAP_PROP_FPS, fps)frame_rate = fps# 创建VideoWriter对象fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(out_path, fourcc, fps, (512, 512))frame_count = 0# 创建一个tqdm进度条pbar = tqdm(total=total_frames, ncols=70, unit='frame')while cap.isOpened():ret, frame = cap.read()if ret:if contains_face(frame) and frame_count % (frame_rate // fps) == 0:frame = crop_center(frame, 512, 512)out.write(frame)frame_count += 1pbar.update(1)  # 更新进度条else:breakpbar.close()  # 关闭进度条cap.release()out.release()print(f'[INFO] ===== processed video =====')# 打开处理后的视频,获取总帧数、帧率和视频尺寸cap_out = cv2.VideoCapture(out_path)total_frames_out = int(cap_out.get(cv2.CAP_PROP_FRAME_COUNT))frame_rate_out = cap_out.get(cv2.CAP_PROP_FPS)frame_width = int(cap_out.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(cap_out.get(cv2.CAP_PROP_FRAME_HEIGHT))print(f'处理后的视频帧率: {frame_rate_out} fps')print(f'处理后的视频帧数: {total_frames_out}')print(f'处理后的视频尺寸: {frame_width}x{frame_height}')cap_out.release()def process_video_with_audio(input_path, output_path):audio_path = output_path.replace('.mp4', '_audio.aac')output_with_audio_path = output_path.replace('.mp4', '_with_audio.mp4')# 分离音频extract_audio(input_path, audio_path)# 处理视频process_video(input_path, output_path)# 重新同步并合并音频和视频merge_video_audio(output_path, audio_path, output_with_audio_path)# 删除临时文件os.remove(output_path)os.remove(audio_path)return output_with_audio_pathif __name__ == "__main__":for i in tqdm(range(1, 75), desc="Processing videos"):input_path = f"data/{i}/{i}.mp4"output_path = f"data/{i}/{i}_fc.mp4"if not os.path.isfile(input_path):print(f"文件 {input_path} 不存在.")continuefinal_output_path = process_video_with_audio(input_path, output_path)print(f"处理后的视频已保存至 {final_output_path}")

对于音视频不同步的问题,尤其是在使用ffmpegadelay滤镜时,如果只是简单地调整延迟,可能会因为视频和音频流的时间戳没有精确对齐而导致最终输出的视频中音画不同步。为了更精确地实现音视频同步,我们可以采取以下步骤:

  1. 提取视频流的时间戳:从原始视频中提取视频流的时间戳,这样我们就可以知道每个视频帧应该在什么时间点出现。

  2. 提取音频流的时间戳:同样地,从原始音频中提取音频流的时间戳,了解音频数据包的时间位置。

  3. 调整音频流的时间戳:根据需要提前或延后的时间,调整音频流的时间戳,使得它与视频流的时间戳对齐。

  4. 使用ffmpeg重新封装:将调整过时间戳的音频流与视频流重新封装在一起,确保时间戳的对齐。

然而,直接在Python中操作音视频流的时间戳可能比较复杂,通常推荐的方式是在ffmpeg中使用[0:v][0:a]ametadata=mode=video:video_input=0:video_stream=0[a]这样的滤镜链,来确保音频流的时间戳与视频流的时间戳对齐。

以下是修改后的merge_video_audio函数,使用ffmpegametadata滤镜来尝试更好地同步音视频:

def merge_video_audio(video_path, audio_path, output_path):# 使用ametadata滤镜将音频的时间戳与视频流的时间戳对齐subprocess.run(['ffmpeg', '-y', '-i', video_path, '-i', audio_path,'-filter_complex', "[0:v][0:a]ametadata=mode=video:video_input=0:video_stream=0[a]",'-map', '0:v', '-map', '[a]','-c:v', 'copy', '-c:a', 'aac',output_path])

但请注意,ametadata滤镜并不总是能完美解决所有不同步问题,特别是当音频和视频的编码器或解码器有时间基(timebase)差异时。在这种情况下,你可能需要更深入地理解ffmpeg的时间基概念以及如何正确地设置它们,或者使用更复杂的滤镜链来确保时间戳的一致性。

另外,上述代码中并没有直接处理时间戳的调整,而是依赖于ffmpeg的滤镜来试图自动对齐音视频的时间戳。如果视频和音频流的时间基不同,或者存在其他复杂的时间偏移,你可能需要手动计算和调整时间戳,这通常涉及到更复杂的ffmpeg命令行技巧或使用专门的音视频处理库。

相关文章:

视频调整帧率、分辨率+音画同步

# python data_utils/pre_video/multi_fps_crop_sync.pyimport cv2 import os from tqdm import tqdm import subprocess# 加载人脸检测模型 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)def contains_face(frame):gray …...

【深度学习】关于模型加速

模型转为半精度的会加快推理速度吗 将模型转为半精度(通常指16位浮点数,即FP16)确实可以加快推理速度,同时还能减少显存(GPU内存)的使用。以下是一些关键点: 加快推理速度的原因 减少计算量&a…...

Python中time模块用法示例详解

前言 仅供个人学习用,如果对各位朋友有参考价值,给个赞或者收藏吧 ^_^ 一、time模块介绍 time模块是Python中处理时间相关操作的核心工具,提供了时间获取、格式化、转换、延迟以及计时等多种功能。 总的来说time模块中时间可以有3种格式&…...

解决POST请求中文乱码问题

解决POST请求中文乱码问题 1、乱码原因2、解决方法3、具体步骤 💖The Begin💖点点关注,收藏不迷路💖 在Web开发中,处理POST请求时经常遇到中文乱码问题,这主要是由于服务器在接收到POST请求的数据后&#x…...

Axure-黑马

Axure-黑马 编辑时间2024/7/12 来源:B站黑马程序员 需求其他根据:visio,墨刀 Axure介绍 Axure RP是美国Axure Software Solution给公司出品的一款快速原型大的软件,一般来说使用者会称他为Axure 应用场景 拉投资使用 给项目团…...

Centos解决服务器时间不准的问题

CentOS 系统时间老是自己变化可能有以下几个原因: 硬件时钟问题:服务器的硬件时钟可能出现故障或不准确。 时区设置错误:如果时区设置不正确,可能导致显示的时间与实际期望的时间不符。 系统服务异常:与时间同步相关…...

摸鱼大数据——Kafka——Kafka的shell命令使用

Kafka本质上就是一个消息队列的中间件的产品,主要负责消息数据的传递。也就说学习Kafka 也就是学习如何使用Kafka生产数据,以及如何使用Kafka来消费数据 topics操作 注意: 创建topic不指定分区数和副本数,默认都是1个 分区数可以后期通过alter增大,但是…...

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。 安装 Brasero 在大多数 Ubuntu 版本中&#xff0c…...

QT之嵌入外部第三方软件到本窗体中

一、前言 使用QT开发,有时需要调用一些外部程序,但是单独打开一个外部窗口有的场合很不合适,最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序,一个主程序托n个子程序,为了方便管理将各个程序独立&#xf…...

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一:修改Tomcat配置(推荐)方法二:使用URLEncoder和URLDecoder(不推荐用于GET请求乱码)方法三:String类编解码(不直接解决乱…...

弥合人类与人工智能的知识差距:AlphaZero 中的概念发现和迁移(1)

文章目录 一、摘要二、简介三、相关工作3.1 基于概念的解释3.2 强化学习中生成解释3.3 国际象棋与人工智能 四、什么是概念?五、发掘概念5.1 挖掘概念向量5.1.1 静态概念的概念约束5.1.2 动态概念的概念约束 5.2 过滤概念 一、摘要 人工智能(AI&#xff…...

cpp的cbp

.cbp 文件是 Code::Blocks 的项目文件。Code::Blocks 是一个开源的跨平台集成开发环境(IDE),主要用于 C、C 以及 Fortran 编程。.cbp 文件包含有关项目的所有配置信息,包括文件路径、编译选项、链接器设置等。 以下是 .cbp 文件的…...

jQuery 选择器

jQuery 选择器 jQuery 是一个快速、小巧且功能丰富的 JavaScript 库。它使得 HTML 文档遍历和操作、事件处理、动画和 AJAX 等操作更加简单,适用于各种浏览器。jQuery 的核心特性之一是其强大的选择器引擎,它允许开发者通过 CSS 选择器语法轻松地选取和操作 DOM 元素。本文将…...

Linux系统编程-进程控制相关操作详解

进程(Process)是计算机科学中一个基本的概念,特别是在操作系统领域中非常重要。它指的是在系统中正在运行的一个程序的实例。每个进程都是系统资源分配的基本单位,是程序执行时的一个实例。以下是关于进程的详细解释: …...

分布式I/O从站的认知

为什么需要分布式I/O从站? 当PLC与控制机构距离过远时,远距离会带来信号干扰,分布式I/O从站只需要一个网络线缆连接。 ET200分布式I/O从站家族 体积紧凑、功能强大。 ET200SP ET200M ET200S ET200iSP ET200 AL ET200pro ET200 eco PN 通讯协议…...

【python】PyQt5顶层窗口相关操作API原理剖析,企业级应用实战分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

流程图编辑框架LogicFlow-vue-ts和js

LogicFlow官网https://site.logic-flow.cn/LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批配…...

goaccess分析json格式日志

一.安装使用yum安装,yum install goaccess 二.主要介绍格式问题 1.nginx日志格式如下: log_format main escapejson {"time_local":"$time_local", "remote_addr":"$remote_addr", "r…...

游戏AI的创造思路-技术基础-决策树(1)

决策树,是每个游戏人必须要掌握的游戏AI构建技术,难度小,速度快,结果直观,本篇将对决策树进行小小解读~~~~ 目录 1. 定义 2. 发展历史 3. 决策树的算法公式和函数 3.1. 信息增益(Information Gain&…...

OPenCV实现直方图均衡化----20240711

# 直方图均衡化import cv2 import numpy as np import matplotlib.pyplot as plt# 读取彩色图像 img = cv2.imread("./pictures/Lena.jpg")# 检查图像是否加载成功 if img is None:print("Could not open or find the i...

React上下文菜单常见问题解答:解决10个典型使用难题

React上下文菜单常见问题解答:解决10个典型使用难题 【免费下载链接】react-contextmenu Project is no longer maintained 项目地址: https://gitcode.com/gh_mirrors/re/react-contextmenu React-contextmenu 是一个强大的 React 上下文菜单组件库&#xf…...

抖音下载神器:如何免费批量下载无水印视频、音乐和图片

抖音下载神器:如何免费批量下载无水印视频、音乐和图片 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

接口测试入门:从Postman到Python自动化实战指南

1. 别再被“接口测试”四个字吓退——它其实比你想象中更像点外卖很多人第一次听说“接口测试”,脑子里立刻浮现出一串密密麻麻的HTTP请求、满屏curl命令、Postman里层层嵌套的JSON Body,还有动不动就报错的401、500、404……然后默默关掉网页&#xff0…...

5分钟掌握Excel MCP Server:无需安装Excel的终极数据处理方案

5分钟掌握Excel MCP Server:无需安装Excel的终极数据处理方案 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server 在数据驱动的现代工作中&…...

保姆级教程:在Ubuntu 22.04上用Netplan搞定Bond+VLAN+Bridge混合网络(附H3C交换机配置)

企业级网络架构实战:Ubuntu 22.04下BondVLANBridge混合部署指南 在虚拟化环境和云计算基础设施中,网络架构的可靠性和灵活性至关重要。本文将深入探讨如何在Ubuntu 22.04系统上,通过Netplan配置工具实现Bond(链路聚合)…...

微信小程序 健身服务与轻食间平台系统健身减肥系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能模块技术实现亮点商业模式差异化优势项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 微信…...

LCD人体秤嵌入式方案全解析:从传感器到低功耗设计

1. 项目概述:从“称重”到“健康管理”的智能跨越“电子秤方案——LCD人体秤方案”这个标题,乍一看似乎只是关于一个简单的称重工具。但在这个全民关注健康、数据驱动生活的时代,一台现代的人体秤早已超越了“称体重”的单一功能。它集成了传…...

工业电伴热系统安全防护:微型热保护器选型、安装与维护全解析

1. 工业电伴热保温套与热保护器:一个被低估的安全基石在工业现场,尤其是化工、石油、食品加工这些对温度敏感或存在防冻需求的行业,管道和储罐的伴热保温是维持生产连续性的生命线。想象一下,一条输送高凝点原油的管道&#xff0c…...

河北邯郸职称评审的方式有哪几种?

1、以考代评以考代评就是指有些专业技术岗位可以通过参加考试而不是递交繁琐的材料来获得专业技术职务资格。只要顺利通过国家指定的科目考试,你就可以获得专业技术资格,省去了各种审核流程的烦恼。2、只评不考只评不考是目前zui常见、适用范围zui广的一…...

别再瞎找了!AI论文写作软件2026最新测评与推荐

2026年真正好用的AI论文写作软件,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...