使用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方法指定需要连接视频的绝对路径的集合,以及生成视频的绝对路径后即可。
注意,使用该方法连接视频是逆序连接,也就是最后路径的视频连接后在最前面。
使用ffmpeg实现视频连接相关推荐
- 使用ffmpeg合并视频文件的三种方法
ffmpeg合并视频的方法有三种.国内大多数仅介绍了其中之一.于是觉得有必要翻译一下.其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并 这种方式的适用场景是 ...
- FFmpeg:视频转码、剪切、合并、播放速调整
安装 去官网按提示安装即可,支持三大操作系统.唯一要吐槽的是,Ubuntu 14.04 等较新的版本,从默认软件列表里移除了 ffmpeg,转而支持 libav,可是 libav 又没弄好,很难用-- ...
- FFmpeg进阶:视频滤镜大全
在做视频特效的时候,很多特效其实不用自己写,FFmpeg的视频滤镜里面提供了很丰富的滤镜特效.这里翻译了一下FFmpeg官方文档的所有视频滤镜的介绍,供大家参考.由于很多地方概念比较生疏,翻译的可能不 ...
- FFMPEG 合并视频文件(无损)
FFMPEG 合并视频文件(无损) 前言 最近在做视频转码相关业务,但是片源商给了一些DVD的零散视频片段,需要自己去合并片段并进行业务转码,本篇文章主要记录视频合并的过程及常见的合并方式. 环境 F ...
- ffmpeg 给视频或者图片添加水印和马赛克的方法
可以使用 FFmpeg 给视频或图片添加水印和马赛克.以下是具体方法: 添加水印 如果需要给视频添加水印,可以使用 overlay 滤镜.该滤镜将两个输入叠加在一起,即将视频和水印画面结合在一起.以下 ...
- FFmpeg音视频开发实战5 iOS/Android/windows/Linux -陈超-专题视频课程
FFmpeg音视频开发实战5 iOS/Android/windows/Linux -159618人已学习 课程介绍 咨询QQ: 347181469. 本课程适合中,从事音视频,网络通 ...
- 视频教程-FFmpeg音视频开发实战6 iOS/Android/windows/Linux-其他
FFmpeg音视频开发实战6 iOS/Android/windows/Linux 先后就职于德国BOSCH,iBabyLabs等企业担任架构设计师,主程, 精通嵌入式Linux,iOS,Android ...
- ffmpeg解码视频存为BMP文件
ffmpeg解码视频存为BMP文件 分类: ffmpeg2011-07-28 12:13 8人阅读 评论(0) 收藏 举报 view plain #include <windows.h> ...
- ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤
FFmpeg给视频添加水印,根据官方文档的介绍可以知道FFmpeg在编译安装的时候还需要加 –enable-libfreetype.–enable-libfontconfig. --enable-li ...
最新文章
- SG 复习全部 (全部SG 总览)
- 全民IT时代到来了?学计算机很有前途?——淘宝2011校园招聘笔试感想
- 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
- [YTU]_2626( B 统计程序设计基础课程学生的平均成绩)
- Django 多数据库联用(看着不错还有源码可以下载)
- virt-manager 的桥接网络配置问题
- 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三
- docker 启动mysql root用户_Docker-Compose搭建Wordpress博客系统
- 漫画:什么是八皇后问题
- 记一次Vue全页面SSR深坑之旅 - 微弱的内存/CPU泄漏
- 【5分钟 Paper】Reinforcement Learning with Deep Energy-Based Policies
- fastdfs 配置文件详解
- ​观点|我离开AI行业的5个理由
- 微信小程序-Image 图片实现宽度100%,高度自适应
- 将adb命令打包成脚本
- 红队web打点信息收集
- ERD Commander 2005 使用教程
- 敏感词过滤及反垃圾文本的相关知识(欢迎收藏)
- STM32F1串口通信控制LED和MG90S
- 10.第七章 Brown运动(1)