当前位置: 首页 > 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...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...