首页 > 其他分享 >winform 循环播放当前目录下的图片及视频

winform 循环播放当前目录下的图片及视频

时间:2024-10-29 14:59:11浏览次数:3  
标签:当前目录 list FormBorderStyle System private new using 播放 winform

采用vlc Xabe.FFmpeg

插件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Xabe.FFmpeg;

namespace PicShow
{
    public partial class Form1 : Form

    {
        int rateSpeed = 3000;
        private List<string> videoFiles = new List<string>();
        private List<string> list = new List<string>();
        private string[] imageFiles;       // 存储图片文件路径
        private int currentIndex = 0;      // 当前显示的图片索引
        private Thread rotateThread;       // 轮播线程


        public Form1()
        {
            InitializeComponent();
        }
        //窗体调用事件
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Width = this.Width;
            pictureBox1.Height = this.Height;
            //this.DesktopBounds = Screen.AllScreens[1].Bounds;
            //将当前窗体显示在第二个显示器上
            this.FormBorderStyle = FormBorderStyle.None;
            if (Screen.AllScreens.Count() > 0)
            {
                this.DesktopBounds = Screen.AllScreens[0].Bounds;
            }

            string operatorValue;
            try
            {
                //读取切换间隔时间
                StreamReader sr = new StreamReader("config.ini", Encoding.GetEncoding("utf-8"));
                if (sr.Peek() >= 0)
                {
                    operatorValue = sr.ReadLine();
                    rateSpeed = int.Parse(operatorValue);
                }
                sr.Close();
            }
            catch (Exception ex)
            {
            }

            StartRotate();
            timer1.Start();
        }



        void StartRotate()
        {
            // 读取指定文件夹下的所有图片
            string folderPath = Directory.GetCurrentDirectory(); ;
            try
            {
                rotateThread = new Thread(async () =>
                {
                while (true)
                {
                    imageFiles = Directory.GetFiles(folderPath, "*.*", SearchOption.TopDirectoryOnly);
                    //获取当前目录下的图片和视频文件,保存到list 列表中;
                    GetVideoFiles(folderPath);
                    if (list.Count == 0)
                    {
                        MessageBox.Show("当前目录下没有图片、视频可显示,请添加图片后再运行!", "提示");
                        Application.Exit();
                        return;
                    }
                    // 显示下一张图片或视频 
                    //currentIndex = (currentIndex + 1) % list.Count;
                    for (int i = 0; i < list.Count; i++)
                    {
                        int t = list[i].Length; ;
                        string fileFormat = list[i].Substring(list[i].Length - 3, 3);
                        if (fileFormat == "jpg" || fileFormat == "png")
                        {
                            this.Invoke(new Action(() =>
                                {
                                    pictureBox1.Visible = true;
                                    vlcControl1.Visible = false;
                                }));
                            this.Invoke(new Action(() =>
                            {
                                pictureBox1.Image = Image.FromFile(list[i]);
                            }));
                            // 等待 ***秒后切换图片
                            Thread.Sleep(rateSpeed);

                        }

                        if (fileFormat == "mp4" || fileFormat == "avi")
                        {
                            // 取视频总时长
                            IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(list[i]);
                            var videoDuration = mediaInfo.VideoStreams.First().Duration;
                            //TimeSpane 格式转换为double
                            double videoLength = videoDuration.TotalSeconds * 1000;
                            //取视频时间长度
                            this.Invoke(new Action(() =>
                            {
                                pictureBox1.Visible = false;
                                vlcControl1.Visible = true;
                            }));
   
                vlcControl1.SetMedia(new System.IO.FileInfo(list[i]));
                vlcControl1.Play();
                Thread.Sleep((int)videoLength);
            }
                        }
        list.Clear();

                    }
});
rotateThread.IsBackground = true;
rotateThread.Start();
            }
            catch (Exception ex)
{
    MessageBox.Show("当前目录没有可显示的图片视频!\r\n" + ex.Message.ToString(), "提示");
    Application.Exit();
}
        }

        private void pictureBox1_Click(object sender, EventArgs e)
{

}
//双击图片显示窗体边框
private void pictureBox1_DoubleClick(object sender, EventArgs e)
{
    if (this.FormBorderStyle == FormBorderStyle.None)
    {
        this.FormBorderStyle = FormBorderStyle.FixedSingle;
    }
    else
    {
        this.FormBorderStyle = FormBorderStyle.None;
        this.DesktopBounds = Screen.AllScreens[1].Bounds;
    }
}

#region 内存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    if (Environment.OSVersion.Platform == PlatformID.Win32NT)
    {
        //FrmMian为我窗体的类名
        Form1.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
    }
}
#endregion

private void timer1_Tick(object sender, EventArgs e)
{
    ClearMemory();
}

/// <summary>
  /// C#获取指定目录下多种指定类型文件
  /// </summary>
  /// <param name="filePath">路径</param>
private void GetVideoFiles(string filePath)
{
    DirectoryInfo di = new DirectoryInfo(filePath);
    FileInfo[] afi = di.GetFiles("*.*");
    string fileName;


    for (int i = 0; i < afi.Length; i++)
    {
        fileName = afi[i].Name.ToLower();
        if (fileName.EndsWith(".jpg") || fileName.EndsWith(".png") || fileName.EndsWith(".mp4") || fileName.EndsWith(".avi"))
        {
            list.Add(fileName);
        }
    }
}

private void vlcControl1_VlcLibDirectoryNeeded(object sender, Vlc.DotNet.Forms.VlcLibDirectoryNeededEventArgs e)
{

}

private void vlcControl1_VlcLibDirectoryNeeded_1(object sender, Vlc.DotNet.Forms.VlcLibDirectoryNeededEventArgs e)
{
    var currentAssembly = Assembly.GetEntryAssembly();
    var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;
    if (currentDirectory == null)
    {
        return;
    }
    if (IntPtr.Size == 4)
    {
        e.VlcLibDirectory = new DirectoryInfo(Path.GetFullPath(@".\libvlc\win-x86"));
    }
    else
    {
        e.VlcLibDirectory = new DirectoryInfo(Path.GetFullPath(@".\libvlc\win-x64"));
    }
}

        private void vlcControl1_DoubleClick(object sender, EventArgs e)
        {
            if (this.FormBorderStyle == FormBorderStyle.None)
            {
                this.FormBorderStyle = FormBorderStyle.FixedSingle;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.None;
                this.DesktopBounds = Screen.AllScreens[1].Bounds;
            }
        }
    }



}

 

标签:当前目录,list,FormBorderStyle,System,private,new,using,播放,winform
From: https://www.cnblogs.com/lrzy/p/18513282

相关文章

  • c# 取视频播放时长
    最近做一个自动播放指定目录中图片及视频的程序,图片指定显示10秒,视频文件播放时需取得视频的时长(可能是图片播放采用了线程的原因);最终实现方法1、通过Nuget安装 Xabe.FFMpeg2、引用usingXabe.FFmpeg; 3、实现代码,视频播放采用了vlcif(fileFo......
  • java+vue计算机毕设电影播放平台的设计与实现【开题+程序+论文+源码】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字媒体内容已成为人们日常生活中不可或缺的一部分。电影作为一种重要的文化娱乐形式,其观看方式也经历了从传统影院到在线......
  • 转: winform播放视频 c#
    转:https://www.cnblogs.com/dysjwang/p/180847951、添加VLC插件2在FORM窗口中,添加VlcControl控件 3、在vlcControl控件的VlcLibDirectoryNeeded事件中编写如下代码:varcurrentAssembly=Assembly.GetEntryAssembly();varcurrentDirectory=newFileInf......
  • ESP32 使用 MAX98357 调用ESP-A2DP库播放蓝牙音乐
    ESP32-A2DP 库github链接:https://github.com/pschatzmann/ESP32-A2DP 硬件:ESP32+MAX989357+喇叭代码:(注意将其中的I2S引脚定义为自己的MAX98357相连接的引脚)最佳实践:在VSCode的PlatformIO的Library,查找ESP32-A2DP,然后将其安装进工程中。 #include"ESP_I2S.h"......
  • 前端方案:播放的视频加水印或者文字最佳实践
    前言:很多时候,视频的转码工作在后端,我们前端是拿到可以播放的链接进行播放即可。但是总是会出现一些定制化的需求,比如在视频的某个区域贴上水印、标识或者文字。这个时候大部分是由前端来操作的。直接去修改播放器里的东西,不仅难度系数较高,而且危险。毕竟动那种高度集成的东西......
  • java+vue计算机毕设纯音乐播放网站【开题+程序+论文+源码】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,音乐已成为人们日常生活中不可或缺的一部分。纯音乐,以其独特的旋律和氛围,不仅能够舒缓压力、激发灵感,还能在特定情境下营造......
  • FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
    ​ijkplayer是Bilibili公司(简称B站)基于FFmpeg3.4研发并开源的国产播放器,它可运行于Android和iOS系统,既支持播放本地视频文件,也支持播放网络上的流媒体链接。之前的文章《Linux编译ijkplayer的Android平台so库》介绍了如何编译获得App工程所需ijkplayer的so文件,接下来还要把官方......
  • Cortex-A53高端智能影音融合播放系统
    1.1项目背景及目标        随着信息技术的飞速发展,多媒体数据已成为人们日常生活和工作的重要组成部分,用户对于音视频播放软件的需求日益增长。然而,目前市面上的多媒体播放器在功能、性能、用户体验等方面存在较大差异,许多播放器无法满足用户多样化的播放需求。为了填......
  • 媒体播放器应用程序的解码器如下:使用 DISM 集成 HEVC 视频扩展应用;要使用 DISM 集成 H
    WMPLegacyandtheMediaPlayer Appare 100%differentsoftware'sandshareexactlyzerocodebetweenthem.MycodecsoftwaresupportsWMPbecauseitcanuseDirectshowcodecsbuttheMediaPlayerAppusesMediaFoundationCodecswhichare distributed......
  • 在 PowerShell 中使用 dir | % { $_.CreationTime } 可以列出当前目录中所有文件和文
    在PowerShell中使用dir|%{$_.CreationTime}可以列出当前目录中所有文件和文件夹的创建时间。这里的%是ForEach-Object的简写,$_表示当前对象。如果你想要以更友好的格式输出这些创建时间,可以使用以下命令:powershellCopyCodedir|ForEach-Object{$_.CreationTi......