原文  http://blog.csdn.net/u011740475/article/details/38868757

最近项目需要实现一个视频连接功能,即将一些小的视频片段连接成一个视频,项目开发用的是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方法指定需要连接视频的绝对路径的集合,以及生成视频的绝对路径后即可。

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

使用ffmpeg实现视频连接相关推荐

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

    ffmpeg合并视频的方法有三种.国内大多数仅介绍了其中之一.于是觉得有必要翻译一下.其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并 这种方式的适用场景是 ...

  2. FFmpeg:视频转码、剪切、合并、播放速调整

    安装 去官网按提示安装即可,支持三大操作系统.唯一要吐槽的是,Ubuntu 14.04 等较新的版本,从默认软件列表里移除了 ffmpeg,转而支持 libav,可是 libav 又没弄好,很难用-- ...

  3. FFmpeg进阶:视频滤镜大全

    在做视频特效的时候,很多特效其实不用自己写,FFmpeg的视频滤镜里面提供了很丰富的滤镜特效.这里翻译了一下FFmpeg官方文档的所有视频滤镜的介绍,供大家参考.由于很多地方概念比较生疏,翻译的可能不 ...

  4. FFMPEG 合并视频文件(无损)

    FFMPEG 合并视频文件(无损) 前言 最近在做视频转码相关业务,但是片源商给了一些DVD的零散视频片段,需要自己去合并片段并进行业务转码,本篇文章主要记录视频合并的过程及常见的合并方式. 环境 F ...

  5. ffmpeg 给视频或者图片添加水印和马赛克的方法

    可以使用 FFmpeg 给视频或图片添加水印和马赛克.以下是具体方法: 添加水印 如果需要给视频添加水印,可以使用 overlay 滤镜.该滤镜将两个输入叠加在一起,即将视频和水印画面结合在一起.以下 ...

  6. FFmpeg音视频开发实战5 iOS/Android/windows/Linux -陈超-专题视频课程

    FFmpeg音视频开发实战5 iOS/Android/windows/Linux -159618人已学习 课程介绍          咨询QQ: 347181469. 本课程适合中,从事音视频,网络通 ...

  7. 视频教程-FFmpeg音视频开发实战6 iOS/Android/windows/Linux-其他

    FFmpeg音视频开发实战6 iOS/Android/windows/Linux 先后就职于德国BOSCH,iBabyLabs等企业担任架构设计师,主程, 精通嵌入式Linux,iOS,Android ...

  8. ffmpeg解码视频存为BMP文件

    ffmpeg解码视频存为BMP文件 分类: ffmpeg2011-07-28 12:13 8人阅读 评论(0) 收藏 举报 view plain #include <windows.h> ...

  9. ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤

    FFmpeg给视频添加水印,根据官方文档的介绍可以知道FFmpeg在编译安装的时候还需要加 –enable-libfreetype.–enable-libfontconfig. --enable-li ...

最新文章

  1. SG 复习全部 (全部SG 总览)
  2. 全民IT时代到来了?学计算机很有前途?——淘宝2011校园招聘笔试感想
  3. 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
  4. [YTU]_2626( B 统计程序设计基础课程学生的平均成绩)
  5. Django 多数据库联用(看着不错还有源码可以下载)
  6. virt-manager 的桥接网络配置问题
  7. 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三
  8. docker 启动mysql root用户_Docker-Compose搭建Wordpress博客系统
  9. 漫画:什么是八皇后问题
  10. 记一次Vue全页面SSR深坑之旅 - 微弱的内存/CPU泄漏
  11. 【5分钟 Paper】Reinforcement Learning with Deep Energy-Based Policies
  12. fastdfs 配置文件详解
  13. ​观点|我离开AI行业的5个理由
  14. 微信小程序-Image 图片实现宽度100%,高度自适应
  15. 将adb命令打包成脚本
  16. 红队web打点信息收集
  17. ERD Commander 2005 使用教程
  18. 敏感词过滤及反垃圾文本的相关知识(欢迎收藏)
  19. STM32F1串口通信控制LED和MG90S
  20. 10.第七章 Brown运动(1)

热门文章

  1. 《Effective C++》 总结篇(杂项讨论)
  2. 马克思资本论视角下的资本-记录
  3. 考研遇上这些奇葩室友!好烦啊!
  4. python商品打折问题_python初学者-商品折扣问题
  5. html页面输出json数据,带格式,带中文
  6. 领导力五力模型指什么
  7. 智能座舱更看重「性能冗余」,4家中国供应商领跑高通两代平台
  8. Go语言:字节流读写(io.Reader/io.Writer)的示例之redis读写
  9. Kotlin HashMap remove失效 get失效问题
  10. 在Mac上如何轻松下载来自浏览器的软件或内容