小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗?

小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令:

ffmpeg -i 小白.flv -vcodec copy -an -f mp4 quiet.mp4

一个只有视频图像的文件就诞生了。

声画分离,这当然只是ffmpeg命令的一个应用场景。

那么,FFmpeg是什么呢?

来看看百度百科的解释:

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

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

小程用自己的话,再来翻译一下:

FFmpeg是一个开源项目,一直有人在加新功能、优化、改bug。这个项目,可以进行音视频的录制、编码、流化、解码、效果处理、重采样等一系列的操作......

基本上,有音视频功能的应用,都跟FFmpeg扯上关系,比如暴风影音、QQ影音、mplayer、格式工厂等等。

小白:我可不管谁在用,我只要自己能用就行。

小程:那FFmpeg的开源协议LGPL跟耻辱柱,你也不想听了?

小白:LGPL?老公漂亮?

开源项目都制定自己的开源协议,这里我不细说了,你觉得有必要的话可以去搜索了解。

本文的重点在于,介绍如何使用ffmpeg命令(FFmpeg程序),实现一些常用的音视频操作功能,比如在视频上添加文字或水印。

我的开发环境是mac,以下的介绍都默认在mac系统上操作,但FFmpeg命令基本是平台无差别的。

生成FFmpeg程序有两个办法,一个是使用源码编译生成,另一个是直接安装,我分别介绍这两种方法。

(一)源码编译出FFmpeg,并实现水印添加

这个办法是下载FFmpeg源码下来,再编译生成FFmpeg程序。如果想使用FFmpeg来组装自己的程序,这个办法是必经之路。

我这里介绍怎么用ffmepg命令来给视频添加文字或水印,为了实现这个功能,在编译FFmpeg时需要增加特定的参数设置。由此可见,为了满足不同的需求,可以调整编译FFmpeg的编译选项。

小白:把文字写到视频上?还不简单,你要什么颜色,我有彩色笔。

小程:我是说,在视频帧上加入文字,不是让你在屏幕上画个大叉!

在视频帧上加入文字,可选择的办法有几个,比如可以找一找“编辑视频加广告”、或视频大师之类的工具,也可以写程序来实现(比如提取出所有帧,再对图片处理,再整合所有图片),这里介绍的是直接用ffmpeg命令来实现。

这时,需要使用FFmpeg的drawtext滤镜来实现添加字幕。

滤镜,可以理解为视频的编辑功能(视频效果处理),是FFmpeg强大的功能之一。

先下载FFmpeg的源码

git clone git://source.ffmpeg.org/ffmpeg.git FFmpeg

在FFmpeg目录下面,可以看到FFmpeg的编译配置程序configure。

(1)支持滤镜filter

要保证ffmpeg程序支持filter,否则ffmpeg在使用drawtext时,会看到这样的提示:

这时,查看FFmpeg配置后(即执行./configure后)生成的头文件config.h(如果配置过就会有这个文件),可以看到:

#define CONFIG_DRAWTEXT_FILTER 0

这是还没有打开drawtext滤镜的表现。

那怎么样让ffmpeg程序支持filter呢?

首先,需要安装yasm,如果当前的macos没有这个执行程序的话(可以用wihch yasm 来查看一下)。yasm是一个汇编编译器,我会在FFmpeg编译给移动平台使用时再介绍一下yasm,现在直接安装即可:

brew install yasm

你如果不了解brew的话,可以搜索homebrew进行了解。

安装yasm后,就可以配置FFmpeg,让它支持filter(drawtext依赖于libfreetype):

./configure --enable-libfreetype --enable-avfilter

这时,在配置输出中(执行./configure),可以看到:

而此时,config.h中是这样:

#define CONFIG_DRAWTEXT_FILTER 1

接着,编译出ffmpeg工具即可:

make

小程不建议执行make install来安装到系统,因为在介绍第二种安装ffmpeg程序的办法时,会给系统安装一个ffmpeg。所以,只执行make在当前目录生成ffmpeg即可。

查一下ffmpeg程序,有没有支持到drawtext滤镜:

./ffmpeg -filters

可以看到,已经有这一项:

(2)使用drawtext滤镜

以一个视频为例,在没有加字幕前,这个视频是这样的:

使用ffmpeg命令,这样加上字幕:

左右滚动的字幕:

./ffmpeg -i ~/Desktop/hello.mp4 -b:v 500K -vf drawtext="fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=0xaaff00:fontsize=18:shadowy=0:\x='if(gte(t,2), (main_w-mod(t*50,main_w)), NAN)':y=(main_h-line_h-10):text='关注广州小程,提升专业技能。'" hello.mp4

固定位置的字幕(这里加了两行):

./ffmpeg -i ~/Desktop/hello.mp4 -b:v 500K -vf "drawtext=fontfile=/Library/Fonts/华文黑体.ttf:fontcolor=yellow:fontsize=20:shadowy=0:x=(w-tw)/2-30:y=(main_h-line_h-50):text="关注广州小程",drawtext=fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=0xaaff00:fontsize=18:shadowy=0:x=(w-tw)/2-30:y=(main_h-line_h-20):text='提升专业技能'" hello1.mp4

把上面加了字幕的mp4文件,转换成gif(因为很多网站支持gif上传而不支持视频),比如:

./ffmpeg -i hello.mp4 -b:v 10K -s 200x200 hello.gif

然后看一下这两个效果,一个是滚动文字,另一个是固定文字:



小程简单讲解一下命令中的参数,请参考下图的注解:

另外注意一下,x与y参数指定了位置,是可以变化的值;

如果需要输出多行文字,则可以使用多个drawtext字段;

如果觉得文字的颜色不好调整,那可以考虑给文字加上背景框,试一下这些参数:

box --是否使用背景框,默认为0

boxcolor --背景框的颜色

borderw --背景框的阴影,默认为0

bordercolor --背景框阴影的颜色

以上是在视频上绘制字幕,如果想在视频上绘制图片,包括动态的gif图,怎么处理呢?

视频添加图片:

./ffmpeg -i ~/Desktop/2.mp4 -acodec copy -b:v 800K -vf "movie=in.png[watermark];[in][watermark]overlay=main_w-100:main_h-100[out]" out4-1.mp4

其中:

movie --水印图片

overlay --三个参数,[距视频原图左边的距离,距上边的距离,是否透明],对于视频,最后一个参数不能使用

视频添加动态水印(gif):

./ffmpeg -y -i ~/Desktop/v.mp4 -ignore_loop 0 -i hello.gif -ss 0 -t 9 -filter_complex overlay=main_w-138:0:1 v-3.mp4

由于无法上传视频,这里就不展示效果了。至此,小程介绍了如何在视频上添加文字、图片及gif动态水印。

接着介绍的是直接安装FFmpeg的办法。

(二)直接安装FFmpeg,并做一些常规操作

直接安装FFmpeg库,比如在mac机上,直接用brew来安装。如果你的系统自带ffmpeg,那就不必了。

这样安装FFmpeg:

sudo brew link x264

brew install ffmpeg

如果之前已经安装过FFmpeg,那要留意提示,是否新安装的FFmpeg有link成功。如果没有成功也是可以使用的,只是要找对文件来运行。如果不想干扰到原来安装的ffmpeg,也可以起个别名来使用,比如新安装目录是:/usr/local/Cellar/ffmpeg/2.6.2/bin,则在~/.bash_profile中增加一项:alias f26='/usr/local/Cellar/ffmpeg/2.6.2/bin/ffmpeg',便可以使用f26来调动新安装的FFmpeg。

安装办法可能变化的,遇到问题不要慌,按错误提示,具体问题具体分析。

安装完成后,这样查看一下ffmpeg的信息:

ffmpeg -version

可以看到,默认安装下,已经支持lamemp3、x264、librtmp第三方库等。

安装完ffmpeg,就可以做一些常规操作了。有什么常规操作呢,提取、合成、转码、录制,等等,这些操作都可以使用ffmpeg命令来完成。

那么问题就来了,这么多命令与参数,能记得住吗?不能。所以一方面可以自行记录一些常用的命令,另一方面需要知道在哪里查看命令与参数。所有命令与参数的使用都可以在这个地址查到: https://ffmpeg.org/ffmpeg.html ,或者更具体一点的比如: https://ffmpeg.org/ffmpeg.html#Advanced-Audio-options

小程在这里简单列举几个,你应该根据自己的需求来查看适当的命令。

提取视频流:

ffmpeg -i xx.flv -vcodec copy -an output.h264

提取音频流:

ffmpeg -i fx_flash22298734.flv -acodec copy -vn audio.aac

提取音轨(音频流):

ffmpeg -i 后来_MQ.m4a -map 0:0 0.wav

ffmpeg -i 后来_MQ.m4a -map 0:1 1.wav

提取声道:

ffmpeg -i "TFBOYS - 是你.mp3" -map_channel 0.0.0 1.aac -map_channel 0.0.1 2.aac

合成音频与视频:

ffmpeg -i 1.mp4 -i 1.wav -vcodec copy mix_test.mp4

转码:

ffmpeg -i 22298734.flv -vcodec mpeg4 -s 320*240 -an -f m4v test.mp4

保存rtmp流在本地:

ffmpeg -i "rtmp://xxx.com/live/hks live=1" -vcodec copy -acodec copy out.flv

以上介绍了直接安装FFmpeg,并使用ffmpeg命令的内容。


好了,总结一下,本文介绍了如何生成ffmpeg命令程序的办法,包括通过源码编译与直接安装的办法。同时,也演示了使用ffmpeg命令来给视频添加字幕或图像(包括动态图像)的操作,以及列举了可能常用的ffmpeg命令。有缘再见,see you。

多媒体开发(4):在视频上显示文字或图片--ffmpeg命令的更多相关文章

  1. 用STM32玩OLED(显示文字、图片、动图gif等)

    目录 用STM32玩OLED(显示文字.图片.动图gif等) 1. 显示字符串 2. 显示中文 3. 显示图片 4. 显示动图 5. 总结测试 用STM32玩OLED(显示文字.图片.动图gif等) ...

  2. 【深度学习】使用opencv在视频上添加文字和标记框

    深度学习识别出视频的物体之后,需要在视频上画框标记出来. 接下来介绍如何使用python在视频上画框和文字 #!/usr/bin/env python # -*- coding:utf-8 -*- i ...

  3. Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. 多媒体开发(6):滤镜实现各种图片效果 | Video-Filters | avfilter | 变色

    之前讲过使用FFmpeg的drawtext滤镜(把图片或文字加到视频上),而实际上,FFmpeg的滤镜很强大,远不止加字幕或加图片的功能.滤镜是很有趣的,可以把图片变模糊.变色.缩放旋转,等等. 本文 ...

  5. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  6. MFC上显示摄像头JPEG图片数据的两种方法

    其一是借助opencv,其二是利用流对象. 方法一: CvMat *mat; ,,CV_8UC1); ,,CV_8UC1,JPEGBuf); /*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像 ...

  7. Android手势识别 Camera 预览界面上显示文字 布局注意事项(merge布局)

    通常在Surfaceview作为预览视频帧的载体,有时需在上面显示提示文字.曾经我弄的都好好的.今天忽然发现叠加的TextView不管咋弄都出不来文字了,跟Surfaceview一起放在FrameLa ...

  8. css实现在图片上显示文字

    一. 准备工作 1. 点击此下载 相关的文件 二. 浏览器中运行 play-img.html 文件,即可显示效果 三. 效果图

  9. 在QLabel上同时显示文字和图片的方法

    有两种方法. 1.打开UI文件,在界面右键单击QLabel对象,选改变多信息文本 选择图片再确定,左侧问号就是图片. 2.直接在QLabel写富文本 <html><head/> ...

随机推荐

  1. 如何自动化你的Excel导入导出(Java)?

    GitHub | 中文 | English | 博客 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择用Apache P ...

  2. PyQt(Python+Qt)学习随笔:Designer中属性设置界面的属性字体使用粗黑体的含义

    老猿Python博文目录 老猿Python博客地址 使用了好几个月的Designer,今天才发现属性编辑界面的属性名有的为粗而黑,有的则不是,如图: 稍微测试了一下,发现是对属性值进行过调整,不再是缺 ...

  3. flask中migrate和scipt进行连用

    近期态度消极了,并且还忙着学php,所以可能flask框架的进度不会像之前那么快了.但是还是要保证跟之前高的质量滴.

  4. 冲刺Day4

    每天举行站立式会议照片: 昨天已完成的工作: 1.登录注册前端与后端的交互 2.订单模块的部分代码 3.用户模块的部分代码 今天计划完成的工作: 成员 任务 高嘉淳 继续完善用户模块的功能 覃泽泰 继 ...

  5. jq中$(function(){})和js中window.onload区别

    先看下执行代码: $(function(){   console.log("jq");}) $(function(){   console.log("jq1") ...

  6. 一个小时学会用 Go 编写命令行工具

    前言 最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼"真香". 但现阶段相对来说还是 Python 写的 ...

  7. 将ACCESS 的数据库中的表的文件 导出了EXCEL格式

    将ACCESS 的数据库中的表的文件 导出了EXCEL格式 '''' '将ACCESS数据库中的某个表的信息 导出为EXCEL 文件格式 'srcfName ACCESS 数据库文件路径 'desfN ...

  8. kylin的实现原理

    摘自https://blog.bcmeng.com/post/kylin-cube.html#kylin%E7%9A%84%E9%A2%84%E8%AE%A1%E7%AE%97%E6%98%AF%E5 ...

  9. druid数据源yml配置

    application.yml配置 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:33 ...

  10. 自顶向下redis4.0(4)时间事件与expire

    redis4.0的时间事件与expire 目录 redis4.0的时间事件与expire 简介 正文 时间事件注册 时间事件触发 expire命令 删除过期键值 被动删除 主动删除/定期删除 参考文献 ...