• 生成命令行程序使用脚本


    场景

    最近工作中需要经常使用ffmpeg一类的命令行程序,为了避免过多重复操作,于是思考了下编写命令程序脚本的几种方式,包括c#,python,bat,powershell,shell。

    C#

    /// <summary>
    /// 使用 process 调用程序
    /// 对指定视频转码
    /// </summary>
    private static void Ffmpeg()
    {
        using (var p = new Process())
        {
            // 想要运行命令/程序名/程序绝对路径
            // ffmpeg 已添加至 path
            p.StartInfo.FileName = @"ffmpeg";
            p.StartInfo.Arguments = "-i 1.mp4 -c:v libx264 -c:a aac -y 1.flv";
            // true 就无法重定向输出或报错
            // http://stackoverflow.com/questions/5255086/when-do-we-need-to-set-useshellexecute-to-true
            p.StartInfo.UseShellExecute = false;
            // ffmpeg 比较特殊,所有信息都从Error出
            p.StartInfo.RedirectStandardError = true;
            //p.StartInfo.RedirectStandardOutput = true;
            p.Start();
            using (var reader = p.StandardError)
            {
                while (!reader.EndOfStream)
                    Console.WriteLine(reader.ReadLine());
            }
            // 等待进程
            p.WaitForExit();
        }
    }
    

    python

    1. python中可以使用fabric这个强大的工具,官方实现是使用python2,不过可使用pip install fabric3下载它的python3实现。(python3 下使用pip install fabric 也会正常下载,不过无法使用)
    2. fabric 基础使用:
      1. fabric中一个函数对应一个任务
      2. 文件名默认命名为fabfile,否者要使用-f file加载
      3. 使用 fab fun_name

    fabfile.py:

    from fabric.api import local
    import json
    
    def flv():
    	""" 获取视频长度 """
        data = local('ffprobe -v quiet -print_format json -show_format -show_streams {0}'.format('1.flv'), capture=True)
        info = json.loads(data.stdout)
        print(info['format']['duration'])
    

    fab flv

    bat

    1. 批处理可以在win中快速编写简单命令脚本

       REM @echo off
       REM 批量切割视频
       for %%c in (*.mp4) do (    
           ffmpeg -i %%c -ss 1 -t 1 -v quiet -y %%~nc.flv
           )
      

    powershell

    1. powershell是win上类bash的shell程序,它提供了比批处理更强大的能力,并且现在已开源,微软也提供了官方的跨平台实现

    2. 第一次执行xx.ps1脚本,可能会报权限错误,在管理员权限的powershell中执行 set-ExecutionPolicy RemoteSigned即可,参照张善友大神的博文

    3. powershell的功能非常强大,同时也具有面向对象思维

       # 获取当前目录所有flv时长
       function FlvInfo ($video)
       {
           $pattern = ".*?(?<Size>d+).*?"
           $line = ffprobe -v quiet -print_format json -show_format  $video | Where-Object {$_ -like '*size*'}
           $result = $line -match $pattern
           $size = $Matches.Size
           Write-Output "$video size: $size"
       }
       
       foreach ($item in Get-ChildItem -Filter "*.flv*") {
           FlvInfo $item.Name
       }
      

    shell

    1. shell 是linux下的神兵利器,得益于WSL,我们在Win10下也能自由的使用Shell来完成日常操作

       #!/bin/bash
       for video in `ls |grep mp4` 
       do
           ffmpeg -i $video -c:v copy -c:a copy -y ${video:0:-4}.flv
       done
      

    总结

    使用c#,python等方式调用命令行程序可以简化批量处理大量重复、复杂和流程化的操作,而批处理,powershell,shell也可以快速简单地减少命令使用,总的来说要根据具体场景选择袭击喜欢的方式吧。

  • 相关阅读:
    如何利用azMan (Authorization Manager) 实现 rolebased的安全验证机制
    如何处理源dump文件的mscordacwks.dll文件与调试机上的版本不一致问题而无法使用extension cmd的问题
    UI thread client callback和UI thread WCF Service一起工作时死锁的形成原因及解决方法
    如何在 IIS 6.0 上配置托管的 Web 应用程序时使用 SPN(包括Network service ,domain acount, NLB, host header等各种情况)
    WCF中各种Transaction的分类及其相关参数的设置
    利用windbg调试class type,value type以及MethodTable等强化C#的基本概念
    如何自定义Attribute class并将其应用到相应的class
    谷歌浏览器F12调试页面学习
    上班族致富之道
    折半插入排序
  • 原文地址:https://www.cnblogs.com/clockwork/p/6296759.html
Copyright © 2020-2023  润新知