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

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

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. Docker学习—Stack

    前言: 前一篇了解Docker使用Swarm集群部署方式,并创建服务到Swarm集群中:如果在集群部署过程中存在大量服务部署.编排那么该如何处理呢? 那么就需要了解Docker Stack了. 1.D ...

  2. java ipv6发邮件需要注意的点

    和ipv4发邮件一样,毕竟ip只是用来找地址的,v4 v6使用上基本没区别. 但有一点得注意:java ipv6采用发送RST包来通知邮件服务器断开连接,这样会导致客户端抛 MessagingExce ...

  3. flask中的return、过滤器详解

    之前吧一直学习flask的时候,一直不明白response是怎么产生,今天是明白了.retrun  哎呀,这个地方看着挺小心的东西, 蕴含的能量可不小啊.今天我详细总结总结. 先来写jinjia2语法 ...

  4. 使用k8s部署springboot+redis简单应用

    准备 本文将使用k8s部署一个springboot+redis应用,由于是示例,所以功能比较简单,只有设置值和获取值两个api. (1)设置值 (2)获取值 构建Web应用 (1)创建一个spring ...

  5. 【面试】关于get和post两种方法的不同。

    最近在面试题和笔试题中经常会看到这道题,所以打算系统的整理一下. 一般标准的答案是这样的. GET在浏览器回退时是无害的,而POST会再次提交请求(浏览器应该告知用户数据会被重新提交). GET产生的 ...

  6. CSP-S 2020 题解

    赛后我重拳出击,赛场上我却爆零.哎. 题解本人口胡.有错请各位大佬们指出. A. 儒略日 这题是大型模拟题. 介绍两种写法:一种代码量致死(赛 场 自 闭),一种是非常好写的. 写法 1 我在赛场的思 ...

  7. 精尽Spring MVC源码分析 - HandlerMapping 组件(一)之 AbstractHandlerMapping

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  8. 日期格式化:推荐使用SimpleDateFormat

    一.主题 日期格式化成字符串:SimpleDateFormat > DateFormatUtils 二.code public void DateFormat(){ SimpleDateForm ...

  9. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

  10. linux里用户权限:~$,/$,~#,/#的区别与含义

    $表明是非root用户登录,#表示是root用户登录,它们是终端shell的命令提示符几种常用终端的命令提示符 BASH:  root账户: # ,非root账户: $KSH:  root账户: # ...