ffmpeg视频总帧数获取,取某一帧的图像方法

devtools/2025/1/19 13:33:07/

FFmpeg的Static版本的bin文件夹中只有三个.exe文件,分别是:ffmpeg.exe,ffplay.exe和ffprobe.exe,各功能如下:

ffmpeg.exe音视频转码、转换器

ffplay.exe:简单的音视频播放器

ffprobe.exe:多媒体码流分析器

以下实现了基于ffmpeg.exe和ffprobe.exe的视频总帧数获取和取某一帧的图像方法,可根据需求进行扩展。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace VideoCheck
{public class CFFmpeg{string ffmpegPath = ""; string ffprobePath = "";public CFFmpeg(){if (System.IntPtr.Size == 4){ffmpegPath = Environment.CurrentDirectory + "\\ffmpeg\\x86\\ffmpeg.exe";ffprobePath = Environment.CurrentDirectory + "\\ffmpeg\\x86\\ffprobe.exe";}else if (System.IntPtr.Size == 8){ffmpegPath = Environment.CurrentDirectory + "\\ffmpeg\\x64\\ffmpeg.exe";ffprobePath = Environment.CurrentDirectory + "\\ffmpeg\\x64\\ffprobe.exe";}}const int SW_HIDE = 0;[DllImport("user32.dll")]static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);/// <summary>/// 获取视频有效总帧数/// </summary>/// <param name="videoPath"></param>/// <returns></returns>public int GetTotalFrameCnt(string videoPath){System.Diagnostics.Process process = new System.Diagnostics.Process();process.StartInfo = new System.Diagnostics.ProcessStartInfo(ffprobePath);process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;process.StartInfo.RedirectStandardOutput = true;process.StartInfo.UseShellExecute = false;//示例:ffprobe - v error - count_frames - select_streams v: 0 - show_entries stream = nb_read_frames - of default = nokey = 1:noprint_wrappers = 1 C: \Users\whf\Desktop\大和路Y430 - Y428.ASFstring args = " -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 " + "\"" + videoPath + "\"";process.StartInfo.Arguments = args.Replace("\\", "/");try{process.Start();while (process.MainWindowHandle == IntPtr.Zero){process.Refresh();}ShowWindow(process.MainWindowHandle, SW_HIDE);StringBuilder sb = new StringBuilder();while (!process.HasExited){sb.Append(process.StandardOutput.ReadToEnd());}string str = sb.ToString().Trim();int num = 0;bool ret = int.TryParse(str,out num);return num;}catch (Exception ex){return 0;}}/// <summary>/// 截取视频图片/// </summary>/// <param name="videoPath">视频路径</param>/// <param name="videoFrameIndex">视频帧号</param>/// <param name="outImagePath">图像输出路径</param>/// <returns></returns>public bool CatchImage(string videoPath,int videoFrameIndex, string outImagePath){System.Diagnostics.Process process = new System.Diagnostics.Process();process.StartInfo = new System.Diagnostics.ProcessStartInfo(ffmpegPath);process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;if (File.Exists(outImagePath))File.Delete(outImagePath);else{FileInfo fileInfo = new FileInfo(videoPath);if (!Directory.Exists(fileInfo.DirectoryName))Directory.CreateDirectory(fileInfo.DirectoryName);}int sec = (int)(videoFrameIndex / 25.0f);//-ss后跟的时间单位为秒 ,放前面可加快速度string args = " -y -ss " + sec+ " -i " + "\""+ videoPath +"\""+ " -frames 1 -f image2 " + "\"" + outImagePath+"\"";process.StartInfo.Arguments = args.Replace("\\","/");try{process.Start();process.WaitForExit();}catch(Exception ex){return false;};if (System.IO.File.Exists(outImagePath)){return true;}return false;}}
}

http://www.ppmy.cn/devtools/151820.html

相关文章

Rust 强制类型转换和动态指针类型的转换

在 Rust 中的强制类型转换&#xff08;Coercion&#xff09;语义&#xff0c;与 Java 或 C 中的子类到父类的转换有某些相似之处&#xff0c;但两者的实现机制和使用场景有很大的区别。 我们将从 Java/C 的子类到父类转换 和 Rust 的强制类型转换 的角度进行比较&#xff0c;帮…

Python毕业设计选题:基于django+vue的智能租房系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 租客注册 添加租客界面 租客管理 房屋类型管理 房屋信息管理 系统管理 摘要 本文首…

一次完整的tcpdump -XX输出报文详解

报文&#xff1a; 03:32:51.745623 IP (tos 0x0, ttl 64, id 65006, offset 0, flags [DF], proto TCP (6), length 94) 10.229.43.200.6471 > 10.229.43.200.55674: Flags [P.], cksum 0x6daa (incorrect -> 0x2e06), seq 1:43, ack 42, win 3635, options [nop,nop…

Goland项目内引入字符串标红的解决办法

当我在go项目内引入某个模块比如&#xff1a; import ( "log" "xxx.com/bird/models" ) 时&#xff0c;Goland会提示错误并标红这个引用&#xff0c;实际这个引用就走go.mod中配置着&#xff0c;但Goland就是不认&#xff0c;问了AI才知道解决办法如…

【NLP高频面题 - 高效微调篇】LoRA微调时有哪些可配置的参数?

【NLP高频面题 - 高效微调篇】LoRA微调时有哪些可配置的参数&#xff1f; 重要性&#xff1a;★★★ LoRA 微调示例&#xff1a; from peft import LoraConfig, get_peft_model# LoRA 配置 config LoraConfig(r16,lora_alpha16,target_modules["query", "va…

Dubbo泛化调用

本文记录下利用dubbo泛化调用实现网关server收http请求&#xff0c;然后转发给dubbo服务&#xff0c;然后收到dubbo响应的功能原理。 关键点1&#xff1a;dubbo泛化调用。可根据(注册中心地址、接口名&#xff0c;方法名&#xff0c;参数类型&#xff09;唯一确定一个dubbo服务…

软件测试—接口测试面试题及jmeter面试题

一&#xff0c;接口面试题 1.接口的作用 实现前后端的交互&#xff0c;实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑关系 3.接口测试必要性 1.可以发现很…

【HarmonyOS-开发指南】

HarmonyOS-开发指南 ■ DevEco Studio■ ArkTS■ ArkUI■ ArkCompiler■ DevEco Testing■ DevEco Device Tool■ DevEco Service ■ DevEco Studio 添加链接描述 ■ ArkTS 添加链接描述 ■ ArkUI ■ ArkCompiler ■ DevEco Testing ■ DevEco Device Tool ■ DevEco S…