操作系统: Mac 10.15.2

作者: DisenQF

QQ: 610039018

一、FFMPEG环境安装

1.1 更新brew源

由于 brew 命令安装软件的时候,先后会查找brew.git、homebrew-core.git、homebrew-bottles等软件源,那么我们可以这个仓库的源替换成Alibaba的,则在安装软件时,则会加速。

1.1.1 更新brew.git

cd "$(brew --repo)"
git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git 

如果恢复之前的源,则执行如下命令:

git remote set-url origin https://github.com/Homebrew/brew.git

1.1.2 更新homebrew-core.git

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git 

原仓库的地址是: https://github.com/Homebrew/homebrew-core.git

1.1.3 更新homebrew-bottles

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile 

如果还原之前的,则通过vi编辑器,打开.bash_profile文件,将HOMEBREW_BOTTLE_DOMAIN删除即可。

1.2 安装ffmpeg

在github中有两个相关的仓库,即homebrew-ffmpeg和varenc/homebrew-ffmpeg,此次使用第一个仓库,具体安装如下:

brew tap homebrew-ffmpeg/ffmpeg
brew install homebrew-ffmpeg/ffmpeg/ffmpeg
brew options homebrew-ffmpeg/ffmpeg/ffmpeg

提示】HomeBrew临时下载的文件目录~/Library/Caches/Homebrew/downloads,如果在安装的过程下载某一个文件特别慢,可以执行Ctrl+C退出安装,然后使用专业的下载工具(迅雷),当下载完成后,可以找到相关的文件,并将名称修改成下载文件名即可。如以下donwloads文件目录下的文件:

0b4dcf92e1664a17fefc4c0f7993a9943849d88144a7a22c4b5458271c1527ea--pip-19.3.1.tar.gz
0cd4162bd88b80d7d824536c0dfb4d9b6432556a96c75308368491218b766b44--ffmpeg-4.2.2.tar.xz
4f03f7d12fc06e90f55a39f67ee01efd978fe4d084982c0c906baf012e214451--Python-3.7.5.tar.xz

如果安装成功了,可以查看ffmpeg的命令帮助信息,命令如下:

ffmpeg -h

二、安装Python环境

2.1 安装Python3

brew install python3

安装成功之后,可以执行`python -v`命令测试Python的版本。

默认安装的路径是/Library/Frameworks/Python.framework/Versions/3.7

然后再确认一下pip3是否安装,它是Python的依赖包管理工具命令,命令是`pip3 -V`

2.2 安装ffmpeg-python

pip3 install ffmpeg-python

在Python脚本中需要通过ffmpeg模块获取视频的媒体信息,如时长等。

三、准备相关资源

3.1 片头片尾视频

一般情况下,片头片尾视频的格式都是mp4(H264/H263),需要将mp4文件统一转化为mpg格式,其命令如下:

ffmpeg -i start.mp4 -qscale:v 1 start.mpg

3.2 水印字体

如果为合并后的视频增加文字水印,则需要选择合适的字体文件,并将字体文件与python的程序脚本放在同一目录下,如下列表:

run_sep.py
end.mpg
start.mpg
f1.ttf

如上所示, f1.ttf则为字体文件资源。这是一个空心字体的彩云体。

如果水印使用logo.png类似的图片,则将这个图片也放在如上的目录下。

3.3 目标视频资源

将所需要转换的mp4文件放在同一个目录,执行python程序脚本时,指定这个目录和分隔视频的大小即可。分隔规则如15-20分钟,如果这个视频小于30分钟,则不会分隔。

【注意】确保文件名不带有空格,因为在Python程序的脚本中,需要执行mac下的ffmpeg命令。

四、ffmpeg相关命令

4.1 分隔视频

ffmpg -i xxxx.mp4 -ss 00:15:00  -t 00:15:00 -vcodec copy -acodec copy xxx-out.mp4

相关参数说明:

  • -i 表示input输入的视频源

  • -ss 表示起始时间,如00:15:00 即0时15分0秒开始

  • -t 表示结束时长, 如00:15:00,即从-ss开始,分隔出15分钟

  • -vcodec/-acodec 表示视频转码与音频转码方式,使用copy表示复制,表示不进行压缩处理。

  • xxx-out.mp4 表示分隔之后的视频存储位置。

4.2 合成视频

4.2.1 创建合成描述文件

如文件名为merge.txt,内容如下:

file start.mpg
file  Scrapy/7375ef1c9b7f559e17de206ded7aed27.mpg
file end.mpg
【注意】文件中不能带有中文名称,所以存放视频资源的文件目录必须修改为英文。

4.2.2 合成视频命令

ffmpeg -f concat -i merge.txt -c copy xxxx-merge.mpg -y

如上命令所示中xxxx-merge.mpg即是合成后的视频资源名。

4.3 文字水印

ffmpeg -i xxx.mp4 -vf "drawtext=fontfile=f1.ttf: text=\'千锋人工智能学院\':x=(w-text_w)-50:y=100:fontsize=50:fontcolor=blue:shadowy=2" -b:v 3000k -s 1280*720 xxx-water.mp4

在执行此命令,如果报字体相关的错误时(drawtext),则需要安装freetype。安装命令如下:

brew install freetype
brew reinstall ffmpeg --with-freetype

可以通过如下命令查询是否已安装依赖包,命令如下:

brew info ffmpeg

4.4 LOGO水印

4.4.1 右下角位置

ffmpeg -i xxx.mp4 -i logo.png -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -s 1280*720 output-water.mp4

参数说明:

  • -filter_complex: 滤镜组合

    • main_w:视频宽度

    • main_h : 视频高度

    • overlay_w: 图片水印宽度

    • overlay_w: 图片水印宽度

  • -s 1280*720 指定目标视频的size屏幕尺寸,即720P格式。当然原视频的分辨率是高于它的。

4.4.2 左下角位置

指定x和y参数即可,命令如下:

ffmpeg -i xxx.mp4 -i logo.png -filter_complex 'overlay=x=10:y=main_h-overlay_h-10'  -s 1280*720 output-water.mpg

4.5 视频格式转换

主要是mp4和mpg互换转换,在转换时,主要通过-qscale:v后的值,1即是转成mpg, 2则转成mp4。

4.5.1 mp4转mpg

ffmpeg -i xxx.mp4 -qscale:v 1 xxxx.mpg

4.5.2 mpg转mp4

ffmpeg -y -i xxxx-merge.mpg -qscale:v 2 xxx.mp4

五、Python编码

先创建run_sep.py文件,按如下步骤进行增加内容。

5.1 导包

from sys import argv
import os
import re
import subprocessimport ffmpeg
from hashlib import md5

5.2 封装执行命令函数

def shell_cmd(cmd):ternimal = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)for info in ternimal.communicate():try:print(info.decode())except:break

5.3 单个文件处理

def process_file(file_path, out_file_path=None):# file_path 为完整的文件路径dir_name , file_name= os.path.split(file_path)file_name_, ext = os.path.splitext(file_name)temp_file_path = os.path.join(dir_name, file_name_)+'-temp.mp4'if out_file_path is None:out_file_path = os.path.join(dir_name, file_name_)+'-qf.mp4'file_name_md5 = os.path.join(dir_name,md5(file_name.encode()).hexdigest())# 加水印water_cmd = f'ffmpeg -i {file_path} -vf "drawtext=fontfile=f1.ttf: text=\'千锋人工智能学院\':x=(w-text_w)-50:y=100:fontsize=50:fontcolor=blue:shadowy=2" -b:v 3000k -s 1280*720 {temp_file_path}'print(water_cmd)shell_cmd(water_cmd)# 将带水印的视频文件转成 mpg文件mpg_convert_cmd = f'ffmpeg -i {temp_file_path} -qscale:v 1 {file_name_md5}.mpg'print(mpg_convert_cmd)shell_cmd(mpg_convert_cmd)# 合并片头片尾with open('merge.txt', 'w') as f:f.write('file start.mpg\n')f.write(f'file  {file_name_md5}.mpg\n')f.write('file end.mpg')merge_cmd = f'ffmpeg -f concat -i merge.txt -c copy {file_name_md5}-merge.mpg -y'print(merge_cmd)shell_cmd(merge_cmd)# mpg转换mp4convert_mgp_mp4_cmd = f'ffmpeg -y -i {file_name_md5}-merge.mpg -qscale:v 2 {out_file_path}'print(convert_mgp_mp4_cmd)shell_cmd(convert_mgp_mp4_cmd)# 删除临时文件rm_cmd = f'rm -f {file_name_md5}*'print(rm_cmd)shell_cmd(rm_cmd)

5.4 批量文件处理

def process_dir():sep_size = int(argv[2])  # 分隔的视频的时长(分钟)for mp4_file_name in filter(lambda x: x.endswith('.mp4'), os.listdir(file_path)):mp4_file_path = os.path.join(file_path, mp4_file_name)info = ffmpeg.probe(mp4_file_path)time_ = float(info['streams'][0]['duration'])# 折成15分钟一个,计算折分的次数n = int(time_ // (sep_size * 60) + (1 if time_ % (sep_size * 60) > 0 else 0))for i in range(0, n):if i == 0:end_ = '00:15:00'elif i < n:start_ = str(i * sep_size // 60).rjust(2, '0') + ':' + str(i * sep_size % 60).rjust(2, '0') + ':00'cmd = '-t ' + end_ if i == 0 else '-ss ' + start_ + ' -t ' + end_ if i < n - 1 else '-ss ' + start_out_file_path, ext = os.path.splitext(os.path.join(file_path, mp4_file_name))out_file_path_1 = out_file_path + '-' + str(i + 1) + ext  # 分隔的文件名,输出的文件名temp_file_name = file_path + "/" + md5(out_file_path_1.encode()).hexdigest()temp_file_path = temp_file_name + ".mp4"full_cmd = 'ffmpeg ' + cmd + f' -i {mp4_file_path}  -vcodec copy -acodec copy  ' + out_file_path_1print(full_cmd)shell_cmd(full_cmd)process_file(mp4_file_path)

批量操作文件时,即是将指定的目录中所有视频查找出来,根据分隔规则来分隔单个视频进行处理。

获取视频文件信息的ffmpeg.probe(mp4_file_path)代码则返回字典对象,获取时长使用info['streams'][0]['duration']方式来获取。

5.5 程序入口

if __name__ == '__main__':file_path = argv[1]if os.path.isdir(file_path):process_dir()else:process_file(file_path)

六、自动化运行

如对 scrapy目录下所有mp4文件按15分钟分隔、水印和加片头片尾,则执行如下命令即可:

python3 run_sep.py  /Users/apple/Desktop/mp4/scrapy  15

如果没有问题的话,程序则开始自动执行了。

基于FFMPEG+Python实现大视频分隔+水印+合并片头片尾相关推荐

  1. 基于FFmpeg H264 + G711A 音视频裸流合并 MP4文件 ( G711A 转 AAC)

    https://blog.csdn.net/haiyangyunbao813/article/details/101788264

  2. android全平台基于ffmpeg解码本地MP4视频推流到RTMP服务器

    音视频实践学习 android全平台编译ffmpeg以及x264与fdk-aac实践 ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器 android全平台编译ffm ...

  3. 【DIY】FFmpeg Joiner – 多段视频「无损合并」小工具 [Windows]

    http://subscribe.mail.10086.cn/subscribe/readAll.do?columnId=280&itemId=6082779 FFmpeg Joiner – ...

  4. 基于python实现去除视频的水印

    我们再搬运视频的时候常常会遇到视频有水印的问题 如下 下面就通过python来实现对视频水印的去除 在pycharm新建一个项目,创建image,video目录其他不用 必要条件 在终端下载相关依赖包 ...

  5. 基于 ffmpeg + Webassembly 实现前端视频帧提取

    作者:jordiwang  https://juejin.im/post/6854573219454844935 现有的前端视频帧提取主要是基于 canvas + video 标签的方式,在用户本地选 ...

  6. 基于ffmpeg和libvlc的视频剪辑、播放器

    以前研究的时候,写过一个简单的基于VLC的视频播放器.后来因为各种项目,有时为了方便测试,等各种原因,陆续加了一些功能,现在集成了视频播放.视频加减速.视频剪切,视频合并(增加中)等功能在一起.有时候 ...

  7. Qt实现 基于ffmpeg拉流播放视频

    1.前言 ffmpeg作为开源库,具备跨平台性,被广泛使用于各大视频软件和网站,在视音频开发中占有极其重要的地位. Qt同样支持跨平台,因此结合qt+ffmpeg制作跨平台视频播放器是比较合适的做法. ...

  8. 音视频开发之旅(34) - 基于FFmpeg实现简单的视频解码器

    目录 FFmpeg解码过程流程图和关键的数据结构 mp4通过FFmpeg解码YUV裸视频数据 遇到的问题 资料 收获 一.FFmpeg解码过程流程图和关键的数据结构 FFmpeg解码涉及的知识点比较多 ...

  9. 基于FFmpeg 实现RTSP, 音视频编解码,视频流添加文字,音视频合成MP4

    前言: 最近闲这没事,整理了一下之前开发过的音视频编解码库,主要基于ffmpeg,实现音视频的编解码.视频流添加文字,音视频同步到MP4等功能.有需要的小伙伴可以参考参考,如果写的有什么不对的地方,欢 ...

  10. FFmpeg命令(五)、视频去掉水印

    视频去掉水印 去掉视频的水印 相关的语法 去掉视频的水印 比如去掉某音下载的视频的水印,下载的视频是720*1280,前4秒水印在视频的左上角,右4秒水印在视频的右下角 这时输入两次命令,首先去掉左上 ...

最新文章

  1. 厉害了!不重启JVM,替换掉已经加载的类
  2. FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式
  3. 人工智能到来的时代,你曾经瞧不起的职业,可能会非常吃香!
  4. 爬虫获取不到网页完整源码_你的第一只网络爬虫
  5. 教我兄弟学Android逆向
  6. 程序员最常说的那些口头禅
  7. 【剑指offer】62、圆圈中最后剩下的数字
  8. 遮挡摄像头 判断_3秒过安检、89个摄像头!探秘三亚沙滩手球邀请赛的“黑科技”...
  9. 如何在windows2008/2012上安装启明星系统。
  10. HttpCanary使用指南——静态注入器
  11. 深入理解二进制 算法必备底层知识
  12. Android触摸屏校对,android实现触摸屏校准
  13. 扑克牌排序(结构体)
  14. 大连计算机学校放假了,大连高校寒假排行榜出炉!没想到今年假期最短的竟然是这所学校!...
  15. C语⾔的标识符以及规范
  16. 使用python requests 爬取妹子图网站图片
  17. pyquery url初始化
  18. php 环比计算公式,详情
  19. 淘宝天猫商家运营,宝贝标题如何突出卖点,标题编写方法小技巧
  20. 编程:判断一个数是否是水仙花数

热门文章

  1. linux 环境下设置Kettle的转换,作业定时执行简单操作
  2. 数据挖掘导论——综合实验
  3. 云画质助手iApp源码
  4. 零代码实现接口自动化测试-RF框架实践
  5. 数模比赛经验分享(美赛分享)
  6. 2022张宇考研基础30讲 第八讲 一元函数积分学的概念与计算
  7. axis wsdl2java_信步漫谈之Axis2—wsdl2java工具使用
  8. SoureInsight 打开STM32的Kell 工程
  9. Oracle P6培训系列:10增加作业并估算工期
  10. 读掘金小册组件精讲总结2