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

embedded/2025/1/19 1:40:10/

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/embedded/155100.html

相关文章

设置完端口转发后,本机可以ping通公网设备,但公网设备无法ping通本机内网ip

设置端口转发后&#xff0c;本机可以ping通公网设备&#xff0c;但公网设备无法ping通本机内网IP&#xff0c;通常与以下原因有关&#xff1a; 1. 端口转发仅针对特定端口 端口转发的作用&#xff1a;端口转发仅将特定端口的流量&#xff08;如TCP/UDP&#xff09;从公网IP转发…

【数模学习笔记】插值算法和拟合算法

声明&#xff1a;以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料&#xff0c;仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…

Java(面向对象进阶——抽象类)

抽象方法、抽象类 练习 package day10.抽象类和抽象方法;public abstract class animals {private String name;private int age;public animals(){}public animals(String name,int age){this.namename;this.ageage;}public String getName() {return name;}public void setN…

【物联网】keil仿真环境设置 keilV5可以适用ARM7

文章目录 一、ARM指令模拟器环境搭建1. keil软件2. Legacy Support 二、Keil仿真环境设置1. 创建一个项目2. 编译器介绍(1)arm-none-eabi-gcc(2)arm-none-linux-gnueabi-gcc(3)arm-eabi-gcc(4)grmcc(5)aarch64-linux-gnu-gcc 3. 安装编译器(1)设置调试 一、ARM指令模拟器环境搭…

SDL2基本的绘制流程与步骤

SDL2(Simple DirectMedia Layer 2)是一个跨平台的多媒体库,它为游戏开发和图形应用提供了一个简单的接口,允许程序直接访问音频、键盘、鼠标、硬件加速的渲染等功能。在 SDL2 中,屏幕绘制的流程通常涉及到窗口的创建、渲染目标的设置、图像的绘制、事件的处理等几个步骤。…

Formality:参考设计/实现设计以及顶层设计

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482​​​ Formality存在两个重要的概念&#xff1a;参考设计/实现设计和顶层设计&#xff0c;本文就将对此进行详细阐述。参考设计/实现设计是中两个重要的全局概念&am…

C# 多线程 Parallel 并行

Task 版本的TPL 任务并行库中 除了使用task 任务来处理线程的手段 还有一个扩展的 要点 Parallel并行 因为现在PC 基本上 都是采用多核多线程,什么意思 就是 相当于有多个CPU 每个cpu可以有多个线程在同时处理 比如4核8线程 那就是说 有4个cpu核心 而且可以有8个线程并行 同一…

Nacos: 一个动态服务发现与配置管理平台

Nacos: 一个动态服务发现与配置管理平台 引言 在微服务架构日益普及的今天&#xff0c;服务之间的调用和配置管理变得越来越复杂。为了简化这一过程并提高开发效率&#xff0c;阿里巴巴推出了Nacos——一个易于使用的动态服务发现、配置管理和服务管理平台。 Nacos是什么&am…