使用ffmpeg实现视频连接

最近项目需要实现一个视频连接功能,即将一些小的视频片段连接成一个视频,项目开发用的是C#语言。

最终决定使用ffmpeg。

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

更多关于ffmpeg介绍看http://baike.baidu.com/view/856526.htm?fr=aladdin

以前也没有接触过ffmpeg,首先去官网现在windows平台的ffmpeg。

下载地址:http://ffmpeg.zeranoe.com/builds/

其中有三个版本,适用于不同情况。下载完成后解压其目录结构如下:

运行ff-prompt批处理命令,在其中输入相应的指令即可完成操作。

连接视频的命令如下:

ffmpeg -i "1.mp4" -qscale 6 "inputfile_01.mpg"
ffmpeg -i "2.mp4" -qscale 6 "inputfile_02.mpg"
copy /b "inputfile_01.mpg"+"inputfile_02.mpg" "inputfile_all.mpg"
ffmpeg -i inputfile_all.mpg -qscale 6 outputfile.mp4
del "inputfile_01.mpg"
del "inputfile_02.mpg"
del "inputfile_all.mpg"

上述命令只能连接两个视频的连接,因为在程序中无法事先确定视频数量,因此采用list集合来存储需要连接视频绝对路径,然后使用循环方式连接视频,具体代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Collections;
using System.Threading;

namespace MP4
{
    class BatDemo
    {
        public void saveVedio(IList list, string name)
        {
            /*
             * 初始命令的定义
             * conert将集合中的第一个视频转换成mpg格式
             * conert1将集合中第二个视频转换成mpg格式
             * merge将前两个转换的mpg格式视频合并成一个名为inputfile.mpg视频
             * delstart删除第一个转换视频
             * delsecond删除第二个转换视频
             * convertany将剩下的视频依次转换为mpg格式
             * mergeany将转换后的视频与inputfile.mpg合并
             * delany将剩下的转换视频依次删除
             * convertfinish将最终生成的mpg视频转换成mp4格式
             */
            string batPath = @"e:\ffmpeg\ff-prompt.bat";
            string conert = "ffmpeg -i \"" + list[0] + "\" -qscale 6 \"inputfile_01.mpg\"";
            string conert1 = "ffmpeg -i \"" + list[1] + "\" -qscale 6 \"inputfile_02.mpg\"";
            string merge = "copy /b \"inputfile_01.mpg\"+\"inputfile_02.mpg\" \"inputfile1.mpg\"";
            string delstart = "del \"inputfile_01.mpg\"";
            string delsecond = "del \"inputfile_02.mpg\"";
            RunBat(batPath, conert);
            Thread.Sleep(300);
            RunBat(batPath, conert1);
            Thread.Sleep(300);
            RunBat(batPath, merge);
            Thread.Sleep(300);
            RunBat(batPath, delstart);
            Thread.Sleep(300);
            RunBat(batPath, delsecond);
            Thread.Sleep(300);
            string tempName = "inputfile1.mpg";
            for (int i = 2; i < list.Count-1; i++)
            {
                tempName = "inputfile" + i+".mpg";
                string deltemp = "inputfile" + (i - 1 )+ ".mpg";
                //生成的下一个mpg与上一个合成的mpg文件不能重名,否则造成覆盖。
                string convertany = "ffmpeg -i \"" + list[i] + "\" -qscale 6 \"inputfile_01.mpg\"";
                RunBat(batPath, convertany);
                Thread.Sleep(300);
                string mergeany = "copy /b \"inputfile_01.mpg\"+\""+deltemp+"\" \""+tempName+"\"";
                RunBat(batPath, mergeany);
                Thread.Sleep(300);
                RunBat(batPath, delstart);
                Thread.Sleep(300);
                string delany = "del \""+deltemp+"\"";
                RunBat(batPath, delany);
                Thread.Sleep(300);
            }
            string final = "ffmpeg -i \"" + list[list.Count-1] + "\" -qscale 6 \"inputfile_final.mpg\"";
            string mergefinal = "copy /b \"inputfile_final.mpg\"+\""+tempName+"\" \"inputfilefinal.mpg\"";
            string convertTomp4 = "ffmpeg -i inputfilefinal.mpg -qscale 6 " + name;
            RunBat(batPath, final);
            Thread.Sleep(300);
            RunBat(batPath, mergefinal);
            Thread.Sleep(300);
            RunBat(batPath, convertTomp4);

        }
        /// <summary>
        /// 调用指定的命令
        /// </summary>
        /// <param name="batPath"></param>
        /// <param name="cmd"></param>
        public void RunBat(string batPath,string cmd)
        {
            Process pro = new Process();
            FileInfo file = new FileInfo(batPath);
            pro.StartInfo.WorkingDirectory = file.Directory.FullName;
            pro.StartInfo.FileName = batPath;
            pro.StartInfo.CreateNoWindow = false;
            pro.StartInfo.UseShellExecute = false;
            pro.StartInfo.RedirectStandardInput = true;
            pro.StartInfo.RedirectStandardOutput = true;
            pro.Start();
            pro.StandardInput.WriteLine(cmd);
        }
    }
}

通过调用该类的saveVedio方法指定需要连接视频的绝对路径的集合,以及生成视频的绝对路径后即可。

注意,使用该方法连接视频是逆序连接,也就是最后路径的视频连接后在最前面。

时间: 2024-10-11 10:56:51

使用ffmpeg实现视频连接的相关文章

使用ffmpeg合并视频文件的三种方法

ffmpeg合并视频的方法有三种.国内大多数仅介绍了其中之一.于是觉得有必要翻译一下.其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并 这种方式的适用场景是:视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的.换句话说,其实可以直接用cat或者copy之类的命令来对视频直接进行合并.很多文章介绍了这种方法,但适用性却没有提及.这并不是一个通用的方法.典型的命令示例如下: ffmpeg -i concat:"intermediate1

php使用ffmpeg向视频中添加文字字幕

这篇文章主要介绍了PHP使用ffmpeg给视频增加字幕显示的方法,实例分析了php操作ffmpeg给视频增加字母的技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 本文实例讲述了PHP使用ffmpeg给视频增加字幕显示的方法.分享给大家供大家参考.具体实现方法如下: <?php $dir = './'; // set to current folder if ($handle = opendir($dir)) { while(false!== ($file = readdir($handle)

【有意思的BUG】视频连接超时

最近遇到了一个BUG,但是它的出现又存在概率,所以挺有意思的. BUG的现象是:视频在播放过程中(已播放进度<已加载进度),首先出现了缓冲的动画效果其次呈现雪花背景并且抛出异常"视频连接超时" .或者首先出现了缓冲的动画效果其次视频返回从头播放. 定位到BUG的原因是:某1台服务器存在不稳定的因素,导致视频播放过程中出现了中断.(也就是外部原因)(不过外部原因对服务造成影响的大小是否可以在代码层面优化?可以补充和思考) 具体说说---- 当我们访问1个视频网站,打开了某1个视频,

使用ffmpeg转换视频格式

命令: ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y outfile 说明: infile:要转换的文件路径 outfile:转换到的文件路径 参考:http://ferreousbox.iteye.com/blog/163865 ffmpeg下载:http://dl.pconline.com.cn/download/53703.html 使用ffmpeg转换视频格式,布布扣,b

C#使用FFmpeg 将视频格式转换成Gif图片示例

一.本次使用参数说明 /* * 参数说明: * -i 源文件位置 * -y 输出新文件,是否覆盖现有文件 * -s 视频比例 4:3 320x240/640x480/800x600 16:9 1280x720 ,默认值 'wxh',和原视频大小相同 * -f 等同'-formats',定义的可支持的文件格式'ffmpeg-formats',更多参考:https://ffmpeg.org/ffmpeg-formats.html * -vframes 数字类型,指定视频输出帧数 * -dframes

ffmpeg显示视频

项目最近需要实现播放视频功能,这个在上家公司就做过.虽然跟之前的场景不一样,有以前的功底还是很快可以解决,事实也确实如此.在使用DShow处理完视频分割与合并后,继续使用DShow显示视频,很快即完成.然而在播放dvr录制的视频文件时,发现播放帧率不对,分析发现是dvr存储的视频文件不是按标准格式进行存储(使用ffplay效果还好点,media player根本没法播放),于是重写代码. 先简要说明一下项目:client是delphi开发的GUI程序,视频所有操作功能都由mfc dll实现,这个

ffmpeg为视频添加时间戳 - 手动编译ffmpeg

FFMPEG给视频加时间戳水印 项目中需要给视频添加时间戳,理所当然最好用的办法是ffmpeg.在找到正确的做法前,还被网上的答案timecode给水了一下(水的不轻,在这里转了2天),大概是这样写的: ffmpeg -i wildlife.wmv -vf "drawtext=fontfile=arial.ttf: text='fuck': timecode='09\:57\:00\:00': r=25: \x=(w-tw)/1.5: y=h-(20*lh):fontcolor=white: b

ffmpeg处理视频与声音

1.ffmpeg将mp4分解成多张jpg图片 要在游戏中播放视频,引擎竟然不支持.琢磨了一下,干脆将视频图片提取出来,然后用Animation动画类来播放这些图片,这样也能实现播放视频的效果.还是ffmpeg处理图像同能最强大,用到关键几步如下: 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流ffmpeg -i input_file -acodec copy -vn output_file_aud

使用ffmpeg 对视频截图,和视频转换格式

//执行CMD命令方法 public static void CmdProcess(string command)//调用CMD        {            //实例化一个进程类            Process process = new Process();            process.StartInfo.FileName = "cmd.exe"; //将cmd的标准输入和输出全部重定向到.NET的程序中            process.StartI