将视频文件的每一帧都拆分成一个独立的文件(提取文件中的所有关键帧)

python代码将视频分割为一帧一帧的图片 python代码将视频分割为一帧一帧的图片 import cv2 def video2frame(videos_path, frames_save_path, time_interval): vidcap = cv2.VideoCapture(videos_path) success, image = vidcap.read() count = 0 while success: success, image = vidcap.read() 阅读详情

将某一个视频文件的每一帧都拆分出来保存成一个独立的文件,如果需要修改I帧,则可以通过FFmpeg修改文件的GOP大小,命令行如下:

ffmpeg -i video.mp4 -g 10 gop10.mp4

再提取之前需要先做一件事,那就是需要将视频文件改为ES流:

ffmpeg -i gop10.mp4 -vcodec copy -an -f rawvideo -vbsf h264_mp4toannexb es.raw

这个时候就可以用代码将文件拆分出来了,代码如下:(我用的是海思的算法)


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int GetVideoFrame(FILE *fp, char **pBuf, int &nBufLen)
{
	bool bLoopSend = false;
	bool bFindStart = false;
	bool bFindEnd = false;
	long s32UsedBytes = 0;
	long iStart = 0;
	char *pu8Addr = NULL;
	int i = 0;
	int MaxCount = 1024 * 512;
	static long framePos = 0;
	int frameLen = 0;

	if (fp == NULL)
	{
		return -2;
	}

	char *pu8Buf = (char *)malloc(MaxCount);
	if (pu8Buf == NULL)
	{
		free(pu8Buf);
		pu8Buf = NULL;


		if (fp != NULL)
		{
			fclose(fp);
			fp = NULL;
		}

		return -2;
	}
	fseek(fp, framePos, SEEK_SET);
	frameLen = fread(pu8Buf, 1, MaxCount, fp);

	if (frameLen == 0)
	{
		framePos = 0;
		fseek(fp, framePos, SEEK_SET);
		frameLen = fread(pu8Buf, 1, MaxCount, fp);
		if (frameLen == 0)
		{
			nBufLen = 0;
			free(pu8Buf);
			pu8Buf = NULL;



			if (fp != NULL)
			{
				fclose(fp);
				fp = NULL;
			}
			return -1;
		}
	}
	else  if (frameLen == -1)
	{
		nBufLen = -1;
		free(pu8Buf);
		pu8Buf = NULL;


		if (fp != NULL)
		{
			fclose(fp);
			fp = NULL;
		}
		return -1;
	}

	for (i = 0; i < frameLen - 8; i++)
	{

		int tmp = pu8Buf[i + 3] & 0x1F;
		if (pu8Buf[i] == 0 && pu8Buf[i + 1] == 0 && pu8Buf[i + 2] == 1 &&
			(
			((tmp == 5 || tmp == 1) && ((pu8Buf[i + 4] & 0x80) == 0x80)) ||
				(tmp == 20 && (pu8Buf[i + 7] & 0x80) == 0x80)
				)
			)
		{
			iStart = i;
			bFindStart = true;
			i += 8;
			break;
		}
	}
	for (; i < frameLen - 8; i++)
	{
		int tmp = pu8Buf[i + 3] & 0x1F;
		if (pu8Buf[i] == 0 && pu8Buf[i + 1] == 0 && pu8Buf[i + 2] == 1 &&
			(
				tmp == 15 || tmp == 7 || tmp == 8 || tmp == 6 ||
				((tmp == 5 || tmp == 1) && ((pu8Buf[i + 4] & 0x80) == 0x80)) ||
				(tmp == 20 && (pu8Buf[i + 7] & 0x80) == 0x80)
				)
			)
		{
			bFindEnd = true;
			break;
		}
	}
	if (i > 0)
		frameLen = i;
	if (!bFindStart)
	{
		printf(" can not find start code! \n");
	}
	else if (!bFindEnd)
	{
		frameLen = i + 8;
	}

	pu8Addr = pu8Buf;
	memcpy(*pBuf, pu8Addr, frameLen);

	nBufLen = frameLen;

	framePos = framePos + frameLen;

	free(pu8Buf);
	pu8Buf = NULL;
	return 0;
}

int EncodeH264File()
{
	while (1)
	{
#if 1
		static int fnum = 0;
		fnum++;
		static FILE *fp = NULL;
		FILE *fps = NULL;
		char fname[10];
		static int nIndex = 0;
		sprintf(fname, "%d.h264", fnum);
		fps = fopen("es.raw", "rb");
		if (!fps)
		{
			//continue;
			return -1;
		}
#if 0//20180814 wll
		nIndex++;
		char *str = "test.h264";
		if (nIndex == 1)
#endif
		{
			fp = fopen(fname, "wb");
			if (!fp)
			{
				//continue;
				return -1;
			}
		}
		char *str = (char *)malloc(1024 * 512);
		int bufLen = 0;
		GetVideoFrame(fps, &str, bufLen);
		fwrite(str, bufLen, 1, fp);
#if 0//20180814 wll
#else
		fclose(fp);
		fp = NULL;
#endif
#endif
	}
}


int main(int argc, char *argv[])
{
	EncodeH264File();
	
	system("pause");
	return 0;
}

直接vs直接运行就可以了,我拆分出来的如下:

如上图就是我拆分出来的,上面哟的那个红色标记出来的是关键帧,因为我设置的GOP为10,所以每10帧就会有一个关键帧

 

Wireshark插件实战:从RTP数据包无损提取H.264视频流 网络协议分析是网络工程师和音视频开发者的核心技能之一,它通过解析数据包的结构和传输机制,帮助理解数据在网络中的流动过程。其技术原理在于对TCP/IP协议栈各层封装的解码,能够精准定位网络故障、优化传输性能。在流媒体和实时通信领域,这项技术具有极高价值,可用于诊断视频卡顿、分析码流质量、进行协议调试等。具体到视频传输场景,RTP协议负责承载实时编码的H.264视频数据,确保其通过网络可靠传输。本文聚焦于一个典型应用:利用Wireshark及其命令行工具tshark,结合Python脚本处理,从捕获的网络数据包 阅读详情

相关推荐

OpenCV视频帧提取实战指南

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由英特尔公司于1999年启动,并于2000年首次公开发布,如今已发展为全球计算机视觉领域最广泛使用的库之一。VideoCapture类是OpenCV库中用于视频处理的一个核心类,它提供了从视频文件、摄像头或者网络流等视频源中捕获帧的功能。VideoCapture类不仅支持常见的视频格式,也兼容一些较为罕见的格式,为开发者提供了极大的便利。

weixin_42584586的博客 673

代码片段---使用ffmpeg从h264文件中提取出一帧一帧数据

d盘有一个test.264文件,我们需要从这个h264文件中提取出一帧一帧的数据,所以直接采用ffmpeg来做。 #include <iostream> #include <stdio.h> #include <string.h> #include <errno.h> #ifdef __cplusplus extern "C" { #endif #include <libswscale/swscale.h> #include <liba

jinking01的专栏 2681

ffmpeg实现视频切割

用ffmpeg实现视频切割,不涉及编解码,做得不够完美的地方是,没有从关键帧开始切割,所以有可能切割点会花,以后改善

ffmpeg将一整段视频截成n段

在cmd命令窗口先做实验截取一段,可行 ffmpeg -ss 0 -t 120 -accurate_seek -i yibuzhiyao.mp4 -codec copy divide_videos/001.mp4 在python代码中使用循环将一段视频截成10段分别保存 import os from PIL import Image # 如果没有该库,请 pip install PIL import numpy # 如果没有该库,

不要回答的博客 2117

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5098

CYUSB3065配置CMOS

按照OG02B10的时序电路,在通过SCCB配置CMOS之前,需要三个电源上电,Xshutdown高电平和配置时钟电路。找到手册的第6章SCCB(跟IIC很像),可以看到SCCB的地址与SID引脚有关,这个需要到硬件原理图上确认下。这是Cypress的一个支持MIPI和UVC的模块,有例程支持OV5640,现在要替换替换成OG02B10。寄存器参数需要找到厂家的FAE,由他们提供,OG02B10的资料已经上传。(2)参考得宏的电路,时钟由主控提供,目前程序未实现。这里有两个重要参数需要搞定,摄像头的。

qq_40773212的博客 2948

使用ffmpeg提取视频帧

任务:需要把一个视频文件的每一帧提取出来,每帧存储成单独的文件。

展翅的空间 2万+

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 553

opencv将视频按帧率分割为图片 C++

```cpp //视频分帧 #include <opencv2/opencv.hpp> #include <tchar.h>? #include <stdio.h> ? #include <iostream> ? #include <math.h> ? #include <ostream>? using namespace std; using namespace cv; void main() { //类VideoCapt.

qq_44264934的博客 1433

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

机器人在果园内行巡检仿真(2D雷达、realsense相机)

DiffBot是一种具有两个轮子的自主差动驱动机器人。它的主要处理单元是一个运行Ubuntu Mate 20.04和ROS 1 (ROS Noetic)中间件的Raspberry pi4b。该存储库包含ROS驱动包、真实机器人的ROS控制硬件接口和模拟DiffBot的配置。修改配置文件orchard_world.launch。

如果想成为中心,那么就到中心去吧。 1312

ffmpeg提取视频所有帧

可以使用 ffmpeg 命令行工具提取视频中的所有帧。命令格式如下: ffmpeg -i input.mp4 -vf fps=1/60 frames/frame%d.jpg 其中,-i 后面是输入视频文件名,-vf fps=1/60 表示每秒提取 60 帧,frames/frame%d.jpg 表示输出的帧文件保存在 frames 文件夹中,文件名格式为 frame1.jpg, frame2.j...

weixin_35755823的博客 4574

【RT-DETR有效改进】利用EMAttention加深网络深度提高模型特征提取能力(特征选择模块)

本文给大家带来的改进机制是EMAttention注意力机制,它的核心思想是,重塑部分通道到批次维度,并将通道维度分组为多个子特征,以保留每个通道的信息并减少计算开销。EMA模块通过编码全局信息来重新校准每个并行分支中的通道权重,并通过跨维度交互来捕获像素级别的关系。本文改进是基于ResNet18、ResNet34、ResNet50、ResNet101,文章中均以提供,本专栏的改进内容全网独一份深度改进RT-DETR非那种无效Neck部分改进,

Snu77的博客 3171

ffmpeg 将拆分的数据合成一帧_FFMPEG 视频分割和合并

ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4-ss 指定从什么时间开始-t 指定需要截取多长时间-i 指定输入文件这个命令就是从00秒开始裁剪到00+30=30秒结束,总共30秒的视频。这个命令执行很快,因为只是原始数据的拷贝,中间没有什么编码和解码的过程。执行这个命令后你能得到ou...

weixin_39926311的博客 560

PyTorch生成式人工智能——VQ-VAE详解与实现

VQ-VAE (Vector Quantised-Variational AutoEncoder) 的核心思想就是将 VAE 的连续潜变量离散化。它通过学习一个码本 (Codebook) 来实现这一点,码本是一个包含有限个嵌入向量的字典。模型不是直接输出一个连续的潜在向量,而是从码本中找出与编码器输出最接近的嵌入向量来代替它。本节首先详细讲解 VQ-VAE 的技术原理,然后使用 PyTorch 从零开始实现 VQ-VAE 模型。

盼小辉丶的博客 3337

全志 camera: 4路AHD摄像头转MIPI

TP2815 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 MIPI 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 9098

ffmpeg 将拆分的数据合成一帧_ffmpeg 视频分割与合并

ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4-ss 指定从什么时间开始-t 指定需要截取多长时间-i 指定输入文件这个命令就是从00秒开始裁剪到00+30=30秒结束,总共30秒的视频。这个命令执行很快,因为只是原始数据的拷贝,中间没有什么编码和解码的过程。执行这个命令后你能得到ou...

weixin_39828331的博客 551

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python对视频进行分帧保存图片

原文地址 直接上程序,注释说明 import cv2 import os from application.processbar.progressbar import bar3 # 我自己写的进度条模块,见参考文献 # 传入视频全路径,自动在视频路径下生成同名文件夹,将图片保存在里面 def video2img1(pathv): file_name = pathv.split(os.se...

BBJG_001的博客 4013

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ffmpeg 将拆分的数据合成一帧_FFmpeg 转码 压缩 剪切 合并 分割 水印 moov前置 分帧图片...

转码最简单命令如下:ffmpeg -i out.ogv -vcodec h264 out.mp4ffmpeg -i out.ogv -vcodec mpeg4 out.mp4ffmpeg -i out.ogv -vcodec libxvid out.mp4ffmpeg -i out.mp4 -vcodec wmv1 out.wmvffmpeg -i out.mp4 -vcodec wmv2 out...

weixin_34296646的博客 479

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

claude-real-video:基于场景感知的视频关键帧提取与智能去重方案

你有没有试过把一段视频丢给大模型,让它帮你总结内容或回答画面里的问题?结果往往是:ChatGPT 只读了字幕文本,根本没看画面;Claude 压根不接受视频文件;即便是原生支持视频的 Gemini,默认也是按「每秒 1 帧」固定采样,快速切换的镜头很容易漏掉。 换句话说,大多数 AI 工具并不真正“看”视频。它们只是机械地处理视频文件,却无法理解画面的真正变化。最近 GitHub 上一个叫 claude-real-video 的开源项目给出了一个更聪明的本地方案:它不按固定间隔截帧,而是只在场景发生切换时才

weixin_33770878的博客 377

MinerU支持视频帧解析吗?动态内容提取可行性验证

本文探讨了利用星图GPU平台自动化部署OpenDataLab MinerU智能文档理解镜像,以解析视频内容的可行性。通过将视频拆解为关键帧,该镜像可高效提取其中的文字信息,例如自动从会议录屏或教学视频中生成文字摘要,为视频内容分析提供了一种轻量级解决方案。

weixin_42581003的博客 225

免重编码剪视频|LosslessCut 无损剪辑:不重压一帧也能切出高光片段

两段两小时的 GoPro 旅行视频,放进传统编辑器里,导出进度条会在 1% 的位置爬很久很久。LosslessCut 对同一个文件做无损剪辑,几秒钟就能把 30 秒的高光片段抽出来,因为转封装的方式根本不碰原始视频数据。 ## 它到底是怎么做到的 普通剪辑软件导出时要重新编码:把视频数据全部解压再重新压缩,画质每经一轮都会损失一点,速度也慢。LosslessCut 走的是另一条路:只把原始的音

gitblog_00175的博客 234

短视频去重原理------哈希值检测---基础---重要

1 从图片的某几个点提取出一些特征,比如在坐标(10,10)提取一个颜色,然后在坐标(100,100)提取一个颜色,这样提取5个颜色,如果这5个点的颜色是完全一样的,那么就认为是同一个图片。然而,直接使用传统的哈希算法(比如 MD5)来对整个视频进行哈希计算并不常见,因为视频文件的大小通常非常大,且需要处理的不仅是文件本身,还有文件中的内容。总体来说,视频哈希值去重技术的核心是通过算法将视频转换为一种可以计算的数字形式,再利用这些数字形式对视频内容进行比较,以判断其是否为重复或相似内容。

1635

MP4文件格式的解析,以及MP4文件的分割算法

http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime。以前研究的时候就花了一番的功夫,尤其是如何把它完美的融入到视频点播应用中,更是费尽了心思,主要问题是处理mp4文件庞大的“媒体头”。当然,流媒体点播也可以采用flv格式来做,flv也可以封装H.264视

a19576的专栏 655
上一篇: windows 10 /windows server 2016 /windows server 2019下安装WSL(windows下Linux子系统)
下一篇: windows下vs如何将一个控制台程序改成服务(借助NTService类实现)
RuningPigNO1
博客等级 码龄10年 22粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RuningPigNO1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值