zoukankan      html  css  js  c++  java
  • 临时2017-6-19 00:02:03

    说明(2017-6-19 00:02:18):

    视频转PPT,与github有点冲突,先把代码存起来:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO;
    using System.Windows.Threading;
    
    namespace _10视频转换
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            //先定义一个字典,存储图片名字和时间
            private Dictionary<int, string> imageAndTime = new Dictionary<int, string>();
            //定义一个泛型存放时间,用于拖动进度条时前后比较
            List<int> imageTimes = new List<int>();
            //private string imagePath = @"E:AppServwwwgithubMyWork	runkVideoToAudioVideoToAudioinDebug";
            private string imagePath = @"F:MyWorkMyWork	runkVideoToAudioVideoToAudioinDebugimg";
            //音乐总时间
            private double totalTime;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
    
    
            /// <summary>
            /// 主窗体加载啦
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                //获取目录下所有图片名字列表并计算时间,存入字典
                GetImages();
                //显示图片
                //存储所有时间
                foreach (var item in imageAndTime)
                {
                    imageTimes.Add(item.Key);
                }
                //测试时间存进来没有
                //foreach (var item in imageTimes)
                //{
                //    Console.WriteLine(item);
                //}
                //string imageName = null;
                //string imagePath = @"E:AppServwwwgithubMyWork	runkVideoToAudioVideoToAudioinDebug" + imageName;
                //image1.Source = new BitmapImage(new Uri(@"E:AppServwwwgithubMyWork	runkVideoToAudioVideoToAudioinDebug1.jpg", UriKind.RelativeOrAbsolute));
                image1.Source = new BitmapImage(new Uri(imagePath + imageAndTime.Values.First(), UriKind.RelativeOrAbsolute));
    
                //大爷的!直接窗体加载就能自动播放!
                myMusic.Play();
    
            }
    
    
    
    
    
    
            /// <summary>
            /// 定义计时器,WPF居然没有timer这个控件!
            /// </summary>
            DispatcherTimer timer = new DispatcherTimer();
            /// <summary>
            /// 悲剧的手写timer事件! 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void timer_tick(object sender, EventArgs e)
            {
                //游标跟随播放时间移动
                //totalTime = myMusic.NaturalDuration.TimeSpan.TotalSeconds;
                if (myMusic.Position.TotalSeconds == totalTime)
                {
                    myMusic.Stop();
                    //播放完,游标还没跳到开始,按钮就变成“播放”了,阻断进程也不行。
                    //System.Threading.Thread.Sleep(2000);
                    btnPlayOrPause.Content = "播放";
                }
                else
                {
                    //进度条位置等于音乐播放到的位置
                    slider1.Value = myMusic.Position.TotalSeconds;
                    //显示进度时间,后期要进行计算,符合时间格式
                    lbTime.Content = "00:" + Math.Floor(myMusic.Position.TotalSeconds);
                }
    
                //图片跟随播放时间变换
                int bingoTime = (int)Math.Floor(slider1.Value);
                if (imageAndTime.ContainsKey(bingoTime))
                {
                    image1.Source = new BitmapImage(new Uri(imagePath + imageAndTime[bingoTime], UriKind.RelativeOrAbsolute));
                }
                //foreach (var item in imageAndTime)
                //{
                //if (item.Key == Math.Floor(slider1.Value))
                //    {
                //        image1.Source = new BitmapImage(new Uri(imagePath + item.Value, UriKind.RelativeOrAbsolute));
                //    }
                //}
            }
    
    
    
            /// <summary>
            /// 播放器加载啦
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void myMusic_MediaOpened(object sender, RoutedEventArgs e)
            {
                //myMusic.Source = new Uri(@"F:MyWorkMyWork	runkVideoToAudioVideoToAudioinDebugLoveStory.mp3", UriKind.RelativeOrAbsolute);
                //获取歌曲总时长
                totalTime = myMusic.NaturalDuration.TimeSpan.TotalSeconds;
                slider1.Maximum = totalTime;
                //下面3行是抄的,大意为:设置计时器时间间隔为1秒,把上面的timer_tick方法添加进timer.Tick事件,计时器启动
                timer.Interval = TimeSpan.FromSeconds(1);
                timer.Tick += new EventHandler(timer_tick);
                timer.Start();
                Console.WriteLine(totalTime);
            }
    
    
    
            /// <summary>
            /// 获取文件夹里所有图片名,暂时使用字符串截取,后期加上正则识别。
            /// 换了一个方法,直接获得文件名。
            /// 使用字典存储图片名和时间,返回这个字典。
            /// </summary>
            private void GetImages()
            {
    
                //string imagePath = @"E:MyWorkMy10视频转换inDebug";
                //string[] files = Directory.GetFiles(imagePath, "*.jpg");
                //List<string> imageNames = new List<string>();
                //foreach (var file in files)
                //{
                //    imageNames.Add(file.Substring(file.Length-10,10));
    
                //}
                //foreach (var imageName in imageNames)
                //{
                //    Console.WriteLine(imageName);
                //}
                //下面的方法可以直接获取文件名,不用正则或字符串处理。
                DirectoryInfo folder = new DirectoryInfo(imagePath);
                FileInfo[] imageNames = folder.GetFiles("*.jpg");
                //获取秒数,存入imageTimes集合。后来发现不好,采用了字典。
                //List<int> imageTimes = new List<int>();
                //foreach (FileInfo file in imageNames)
                //{
                //    if (file.Name.Length == 10)
                //    {
                //        int min = Convert.ToInt32(file.Name.Substring(0, 2));
                //        int sec = Convert.ToInt32(file.Name.Substring(2, 2));
                //        imageTimes.Add(min * 60 + sec);
                //    }
                //}
    
                //测试,输出每个图片文件名的秒数
                //foreach (var imageTime in imageTimes)
                //{
                //    Console.WriteLine(imageTime);
                //}
                //需要把图片名和对应时间作为键值对存入json,例如{"001580.jpg":15, "010425":64}
                //算了用字典吧!
                //Dictionary<string, int> imageAndTime = new Dictionary<string, int>();
                foreach (var imageName in imageNames)
                {
                    //筛选一下,10个字符的才是图片名字的正确格式
                    if (imageName.Name.Length == 10)
                    {
                        int min = Convert.ToInt32(imageName.Name.Substring(0, 2));
                        int sec = Convert.ToInt32(imageName.Name.Substring(2, 2));
                        int imageTime = min * 60 + sec;
                        imageAndTime.Add(imageTime, imageName.Name);
                    }
                }
                //return imageAndTime;
                //输出字典测试一下
                //foreach (var item in imageAndTime)
                //{
                //    Console.WriteLine(item.Key);
                //    Console.WriteLine(item.Value);
                //}
    
            }
    
    
    
            /// <summary>
            /// 拖动进度条,改变播放时间,保留一句代码,拖动时有用。
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                myMusic.Position = TimeSpan.FromSeconds(slider1.Value);
                ////拖动进度条的时候,判断该显示哪张图片,两个时间之间{"001580.jpg":15,"001974.jpg":19}
    
    
                //foreach (var item in imageAndTime)
                //{
                //    if (item.Value == Math.Floor(slider1.Value))
                //    {
                //        image1.Source = new BitmapImage(new Uri(imagePath + item.Key, UriKind.RelativeOrAbsolute));
                //    }
                //    //此处有问题,提示索引不能为负或超出索引。slider_valuechange事件,是不是自己动也算?不仅仅是拖动?
                //    //else
                //    //{
                //    //    for (int i = 0; i < imageTimes.Count; i++)
                //    //    {
                //    //        if (Math.Floor(slider1.Value) < imageTimes[i])
                //    //        {
                //    //            MessageBox.Show(imageTimes[i - 1].ToString());
                //    //        }
                //    //    }
                //    //}
    
                //}
                //slider1.Value = myMusic.Position.TotalSeconds;
                //myMusic.Position = slider1.Value;
                //slider1.AddHandler();
            }
    
            /// <summary>
            /// 鼠标在slider上按下,处理播放进度的正确方法。
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void slider1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                Point p = Mouse.GetPosition(slider1);
                int pX = Convert.ToInt32(p.X);
                //MessageBox.Show(pX.ToString());
                slider1.Value = pX / slider1.Width * slider1.Maximum;
                myMusic.Position = TimeSpan.FromSeconds(slider1.Value);
                //拖动进度条的时候,判断该显示哪张图片,两个时间之间{"001580.jpg":15,"001974.jpg":19}
    
                //Dictionary<string, int> imageAndTime的格式为{"001580.jpg":"15", "001974.jpg":"19"}
    
    
                //不需要在点击的时候判断是否正好等于图片的时间,在timer里已经判断了。
                //if (item.Value == Math.Floor(slider1.Value))
                //{
                //    image1.Source = new BitmapImage(new Uri(imagePath + item.Key, UriKind.RelativeOrAbsolute));
                //}
                //只需要判断范围
                for (int i = 1; i < imageTimes.Count; i++)
                {
                    //i要从1开始,不然i-1会超出索引
                    if ((Math.Floor(slider1.Value) < imageTimes[i]) && (Math.Floor(slider1.Value) > imageTimes[i - 1]))
                    {
                        image1.Source = new BitmapImage(new Uri(imagePath + imageAndTime[imageTimes[i - 1]], UriKind.RelativeOrAbsolute));
    
                        //foreach (var item in imageAndTime)
                        //{
                        //    if (item.Value == imageTimes[i - 1])
                        //    {
                        //        image1.Source = new BitmapImage(new Uri(imagePath + item.Key, UriKind.RelativeOrAbsolute));
                        //    }
                        //}
                    }
                    else if (Math.Floor(slider1.Value) < imageTimes[0])
                    {
                        image1.Source = new BitmapImage(new Uri(imagePath + imageAndTime.Values.First(), UriKind.RelativeOrAbsolute));
                    }
                }
    
    
            }
    
    
            /// <summary>
            /// 播放和暂停按钮
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnPlayOrPause_Click(object sender, RoutedEventArgs e)
            {
                //要将loadedBehavior和unloadedBehavior设为manual手动
                //如果设为开始就自动播放,播放和暂停按钮就不管用了。已解决!
                if (btnPlayOrPause.Content.ToString() == "播放")
                {
                    myMusic.Play();
                    btnPlayOrPause.Content = "暂停";
                }
                else
                {
                    myMusic.Pause();
                    btnPlayOrPause.Content = "播放";
    
                }
    
            }
    
    
    
            /// <summary>
            /// 音量条
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void slider2_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                //貌似音量最高也就10了
                myMusic.Volume = slider2.Value;
            }
    
    
    
    
    
        }
    }

     XAML:

    <Window x:Class="_10视频转换.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid Height="285" Name="grid1" Width="503">
            <!--<Image Height="86" HorizontalAlignment="Left" Margin="68,168,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="377" Source="bindebug1.jpg"/>-->
            <Image Height="107" HorizontalAlignment="Left" Margin="12,10,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="474" />
            <MediaElement Height="48" HorizontalAlignment="Left" Margin="40,123,0,0" Name="myMusic" VerticalAlignment="Top" Width="271" MediaOpened="myMusic_MediaOpened" UnloadedBehavior="Manual" DataContext="{Binding}" LoadedBehavior="Manual" Source="F:MyWorkMyWork	runkVideoToAudioVideoToAudioinDebugLoveStory.mp3" />
            <Button Content="暂停" Height="31" HorizontalAlignment="Left" Margin="40,231,0,0" Name="btnPlayOrPause" VerticalAlignment="Top" Width="49" Click="btnPlayOrPause_Click" />
            <Slider Height="25" HorizontalAlignment="Left" Margin="40,186,0,0" Name="slider1" VerticalAlignment="Top" Width="365" ValueChanged="slider1_ValueChanged" PreviewMouseLeftButtonDown="slider1_PreviewMouseLeftButtonDown" />
            <Label Height="24" HorizontalAlignment="Left" Margin="421,188,0,0" Name="lbTime" VerticalAlignment="Top" Width="65" Content="00:00" />
            <Slider Height="23" HorizontalAlignment="Left" Margin="340,238,0,0" Name="slider2" VerticalAlignment="Top" Width="100" ValueChanged="slider2_ValueChanged" Value="5" Maximum="20" />
        </Grid>
    </Window>
  • 相关阅读:
    使用python自带的http server共享文件
    vim常用快捷键与快捷操作
    wordpress 安装中文插件提示:To perform the requested action, WordPress needs to access your web server. Please enter your FTP cr
    python async异步编程,await后接task(三)
    虚拟机下ubuntu使用df命令查看磁盘空间小于实际空间
    python线程池
    使用Redis连接错误处理It was not possible to connect to the redis server(s);to create a disconnected multiple
    Sqlite数据库设置密码小工具
    [转]netcore一键部署到linux服务器以服务方式后台运行
    C#3种常见的定时器(多线程)
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/7045978.html
Copyright © 2011-2022 走看看