C#调用FFmpeg操作音视频的实现示例

目录
  • 项目背景
  • FFmpeg介绍
  • FFmpeg相关教程
  • 博客示例源码
  • 下载FFmpeg.exe安装包
  • C#进程调用FFmpeg操作音视频

项目背景

  因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并,音频合并,音频与视频合并成视频这几个简单的音视频操作,还有些复杂的音视频操作后续有时间慢慢补上。

FFmpeg介绍

来源百度百科

  FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

  FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac等多平台。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 FFmpeg编码库可以使用GPU加速。

FFmpeg相关教程

开始之初你首先要了解FFmpeg是什么,有哪些常用的命令和实用的功能。

博客示例源码

https://github.com/YSGStudyHards/FFmpegAudioAndVideoMerge

下载FFmpeg.exe安装包

首先把下载下来的FFmpeg.exe放在你指定的目录文件夹中,方便C#进程调用。

ffmpeg.exe 安装包: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip(74MB)

C#进程调用FFmpeg操作音视频

namespace FFmpegAudioAndVideoMerge
{
    class Program
    {
        static void Main(string[] args)
        {
            var physicalPath = "E:\\FFmpegAudioAndVideoMerge\\FFmpegAudioAndVideoMerge\\files\\";

            //视频合并
            VideoCombine(physicalPath + "video1.mp4", physicalPath + "video2.mp4", physicalPath + "merageVideoyy.mp4");

            //音频合并
            var audioMergeList = new List<string>();
            audioMergeList.Add(physicalPath + "music1.mp3");
            audioMergeList.Add(physicalPath + "music2.mp3");
            audioMergeList.Add(physicalPath + "music3.mp3");
            AudioMerge(physicalPath, audioMergeList);

            //音频与视频合并成视频
            AudioAndVideoMerge(physicalPath);
        }

        #region 视频合并
        /// <summary>
        /// 视频合并
        /// </summary>
        /// <param name="video1">合并视频1</param>
        /// <param name="video2">合并视频2</param>
        /// <param name="saveFilePath">保存文件名</param>
        /// <returns></returns>
        public static void VideoCombine(string video1, string video2, string saveFilePath)
        {
            string strTmp1 = video1 + ".ts";
            string strTmp2 = video2 + ".ts";
            string strCmd1 = " -i " + video1 + " -c copy -bsf:v h264_mp4toannexb -f mpegts " + strTmp1 + " -y ";
            string strCmd2 = " -i " + video2 + " -c copy -bsf:v h264_mp4toannexb -f mpegts " + strTmp2 + " -y ";

            string videoMerge = " -i \"concat:" + strTmp1 + "|" +
                strTmp2 + "\" -c copy -bsf:a aac_adtstoasc -movflags +faststart " + saveFilePath + " -y ";

            //1、转换文件类型,由于不是所有类型的视频文件都支持直接合并,需要先转换格式
            CommandManager(strCmd1);
            CommandManager(strCmd2);

            //2、视频合并
            CommandManager(videoMerge);
        }
        #endregion

        #region 音频合并
        /// <summary>
        /// 音频合并
        /// </summary>
        public static void AudioMerge(string physicalPath, List<string> mergeFile)
        {
            //将多个音频混合成一个音频文件输出 http://www.ffmpeg.org/ffmpeg-all.html#amix

            //ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT

            //合并两个音频
            //ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex amerge -ac 2 - c:a libmp3lame -q:a 4 output.mp3

            //获取视频中的音频
            //ffmpeg -i input.mp4 -vn -y -acodec copy output.m4a

            //去掉视频中的音频
            //ffmpeg -i input.mp4 -an output.mp4

            // https://www.cnblogs.com/simadi/p/10649345.html
            // ffmpeg -i "concat:123.mp3|124.mp3" -acodec copy output.mp3
            // 解释:-i代表输入参数
            // contact: 123.mp3 | 124.mp3代表着需要连接到一起的音频文件 -acodec copy output.mp3 重新编码并复制到新文件中

            string mergeCommandStr = $"-i \"concat:{string.Join("|", mergeFile.ToArray())}\" -acodec copy {physicalPath}AudioMerge.mp3  -y";
            CommandManager(mergeCommandStr);
        }
        #endregion

        #region 音频与视频合并成视频
        /// <summary>
        /// 音频与视频合并成视频
        /// </summary>
        /// <param name="physicalPath">物理路径</param>
        public static void AudioAndVideoMerge(string physicalPath)
        {
            //1、视频文件中没有音频。
            //ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4
            //string mergeCommandStr = $"-i {physicalPath}video2.mp4 -i {physicalPath}music1.mp3 -c:v copy -c:a aac -strict experimental {physicalPath}output.mp4  -y";

            //video.mp4,audio.wav分别是要合并的视频和音频,output.mp4是合并后输出的音视频文件。
            //2、下面的命令是用audio音频替换video中的音频 ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a: 0 output.mp4
            string mergeCommandStr = $"-i {physicalPath}video3.mp4 -i {physicalPath}AudioMerge.mp3 -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 {physicalPath}AudioAndVideoMerge.mp4  -y";

            //3、c++音频视频合并(视频文件中没有音频的情况下)
            //"ffmpeg -i /tmp/mergeMp3/392118469203595327/392118469203595327.aac  -i /tmp/mergeMp3/392118469203595327/bg.mp4 -c copy -bsf:a aac_adtstoasc /tmp/mergeMp3/392118469203595327/392118469203595327.mp4 -y"
            //string mergeCommandStr3 = $"-i {physicalPath}video5.mp4  -i {physicalPath}AudioMerge.mp3 -c copy -bsf:a aac_adtstoasc {physicalPath}AudioAndVideoMerge1.mp4 -y";

            CommandManager(mergeCommandStr);
        }
        #endregion

        /// <summary>
        /// 执行
        /// C# Process进程调用 https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.process?view=net-5.0
        /// </summary>
        /// <param name="commandStr">执行命令</param>
        public static void CommandManager(string commandStr)
        {
            try
            {
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "D:\\FFmpeg\\bin\\ffmpeg.exe";//要执行的程序名称(属性,获取或设置要启动的应用程序或文档。FileName 属性不需要表示可执行文件。 它可以是其扩展名已经与系统上安装的应用程序关联的任何文件类型。)
                    process.StartInfo.Arguments = " " + commandStr;//启动该进程时传递的命令行参数
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardInput = false;//可能接受来自调用程序的输入信息  
                    process.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息   
                    process.StartInfo.RedirectStandardError = false;//重定向标准错误输出
                    process.StartInfo.CreateNoWindow = false;//不显示程序窗口
                    process.Start();//启动程序
                    process.WaitForExit();//等待程序执行完退出进程(避免进程占用文件或者是合成文件还未生成)*
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    
}
}

到此这篇关于C#调用FFmpeg操作音视频的实现示例的文章就介绍到这了,更多相关C# FFmpeg音视频内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-01-12

C# 调用FFmpeg处理音视频的示例

FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com/item/ffmpeg/2665727?fr=aladdin FFmpeg 应用非常广泛,可以用来播放本地视频甚至网络视频,查看音视频信息,还可以用于从视频中提取音频,转换音视频文件格式等等,本文主要介绍如何调用 FFmpeg 来查看音视频信息.从视频中提取音频.转换音视频格式等. 1. 调用FF

android采用FFmpeg实现音视频合成与分离

上一篇文章谈到音频剪切.混音.拼接与转码,也详细介绍cMake配置与涉及FFmpeg文件的导入: android端采用FFmpeg进行音频混合与拼接剪切.现在接着探讨音视频的合成与分离. 1.音频提取 从多媒体文件中提取音频,关键命令为"-acodec copy -vn",其中"-acodec copy"是采用音频编码器拷贝音频流,"-vn"是去掉video视频流: /** * 使用ffmpeg命令行进行抽取音频 * @param srcFile

Javacv使用ffmpeg实现音视频同步播放

最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放.采用的同步方法是视频向音频同步. 程序和源码 具体的思路如下: (1)首先介绍ffmpeg是如何捕捉视频文件的图像和声音的 FFmpegFrameGrabber fg = new FFmpegFrameGrabber("a video file path or a url); 得到帧捕捉器对象后,调用它的grab()方法就会返回捕捉到的Frame对象.这个Frame可以是视频帧

java调用ffmpeg实现转换视频

最近由于项目需要把不同格式的视频转换为ts流,故研究了一下ffmpeg.在网上找了很多资料,主要参考了Java+Windows+ffmpeg实现视频转换功能. 期间也加了几个qq群,咨询了各大高手,其中在代码中关于ffmpeg的命令就是来自其中一个qq群里面的大神. 下载相关文件 ffmpeg地址,我下载是windows 64位static版本. xuggler下载地址 下面的代码我上传到了github,需要的可以下载下来看看. 步骤: 1.研究java如何调用外部程序 2.研究ffmpeg转换

PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件

配置php.ini文件 复制代码 代码如下: file_uploads = on ;//是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;//文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 upload_max_filesize = 1024m ;//望文生意,即允许上传文件大小的最大值.默认为2M,我们设置为1G post_max_size = 1024m ;//指通过表单POST给PHP的所能接收的最大值,我们也设置为1G ma

Java 使用 FFmpeg 处理视频文件示例代码详解

目前在公司做一个小东西,里面用到了 FFmpeg 简单处理音视频,感觉功能特别强大,在做之前我写了一个小例子,现在记录一下分享给大家,希望大家遇到这个问题知道解决方案. FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的. FFmpeg在Linux平

java调用ffmpeg实现视频转换的方法

本文实例讲述了java调用ffmpeg实现视频转换的方法.分享给大家供大家参考.具体分析如下: 这里环境我是在windows平台下测试的... 需要在e:\下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4个文件.   还要在e:\input下放各种文件名为a的以下各种视频文件:还要e:\output:java程序执行后能得到一个a.flv的已转换的文件. ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov

详解java调用ffmpeg转换视频格式为flv

详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面 这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv,格式!经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能! 格式转换主要原理就是先用java调用ffmpeg的exe文件

php 调用ffmpeg获取视频信息的简单实现

ffmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序,包含了libavcodec,保证高可移值性和编解码质量. 本文将介绍使用php调用ffmpeg获取视频信息,调用ffmpeg首先需要服务器上安装了ffmpeg,安装方法很简单,可自行搜索. 代码如下: <?php // 定义ffmpeg路径及命令常量 define('FFMPEG_CMD', '/usr/local/bin/ffmpeg -i "%s" 2>&1'); /** *

PHP调用ffmpeg对视频截图并拼接脚本

PHP脚本调用ffmpeg对视频截图并拼接,供大家参考,具体内容如下 目前支持MKV,MPG,MP4等常见格式的视频,其他格式有待测试 12P 一张截图平均生成时间  1.64s     100个视频,大概需要2分半左右 9P  一张截图平均生成时间  1.13s      100个视频,大概需要2分钟左右 6P  一张截图平均生成时间  0.86s      100个视频,大概需要1分半左右 3P  一张截图平均生成时间  0.54s      100个视频,大概需要1分钟左右 <?php d

Java通过调用FFMPEG获取视频时长

FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的. 由此看来FFmpeg很强大,很多主流的音频.视频处理软件都使用了FFmpeg. FFmpeg下载下来解压,cmd进入到FFmpeg.exe目录中,即可在命令行下进行各种操作,查看视频信息命令:f