FFMPEG给视频加时间戳水印
项目中需要给视频添加时间戳,理所当然最好用的办法是ffmpeg。在找到正确的做法前,还被网上的答案timecode给水了一下(水的不轻,在这里转了2天),大概是这样写的:
ffmpeg -i wildlife.wmv -vf "drawtext=fontfile=arial.ttf: text='fuck': timecode='09\:57\:00\:00': r=25: \x=(w-tw)/1.5: y=h-(20*lh):fontcolor=white: box=1: boxcolor=0x00000000@1" -an -y out.wmv
转了一大圈,最后找到了答案, 在Ubuntu14.04LTS下面的使用过程:
#安装官方库提供的版本,.X的版本
sudo apt-get install ffmpeg #添加时间戳的命令, 这串命令在实际应用中是用java生成的,然后使用process执行这个命令
ffmpeg -i "/input/input-video.mp4" -vf "drawtext=expansion=strftime: basetime=$(date +%s -d '2016-12-19 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=11:fontcolor=white:box=1:x=10:y=10:boxcolor=black@0.5:" -strict - -y "/output/output-video.mp4"
其中:
-i: 指定输入文件,这里使用的视频编码是H264, 音频编码是AAC
-vf: 视频滤镜,使用了drawtext滤镜,basetime是视频时间戳的初始值,text是显示时间的格式,fontsize后面一串是关于水印的颜色、字体、背景等设置
-strict -2:AAC的解码在2.x版本是试验性功能,需要加这个参数
-y: 覆盖已经存在的输出文件
最后一段是输出文件
问题来了:源视频的参数变化卡死了FFMPEG进程
这样相安无事的使用了一段时间,直到有一天发现服务器上的FFMPEG卡在那不动了,CPU占用率90%多。问了一下,录制视频的客户端确实改了一些东西,主要是视频码率和画面大小,音频参数没有改。先看看是什么导致卡死了,通过调整一些参数的方法,定位到了是音频导致卡死的(音频参数没动过,所以没法解释清楚为什么,只能猜是视频的变化影响了音频,反正MP4容器里面的东西一窍不通)。
ffmpeg -i "/input/input-video.mp4" -vf "drawtext=expansion=strftime: basetime=$(date +%s -d '2016-12-19 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=11:fontcolor=white:box=1:x=10:y=10:boxcolor=black@0.5:"-an -y "/output/output-video.mp4"
和原始命令不同的地方就是-strict -2换成了-an, -an表示不处理音频。这个时候视频又能正确的被处理了(只是没有声音)。问题是找到了,找来找去也没找到解决办法。
没招了,升级版本试试
先去Ubuntu16.04的系统上试了试,使用系统仓库的版本是2.8,也有同样的问题。
去官网看了看,官网都3.2了。果断去找3.2的版本,在官网找了Ubuntu14的PPA版本,按照他们的步骤装好了一试,报错:大概意思就是drawtext过滤器不存在,删了一些参数,发现aac的解码器也没有。大致的意思就是有一些依赖库没有自动装。看了看没找到怎么装,也不知道具体依赖库有哪些,放弃。
没办法了,只能试试手动编译了。
#安装文档的步骤删了一些不要的库
sudo apt-get update
sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev \
libsdl1.-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev #要h264的库
sudo apt-get install libx264-dev #要aac的库
sudo apt-get install libfdk-aac-dev #configure,编译目的路径也懒得改了,最好还是改了,不然到时候ffmpeg安装到了~/bin目录下
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libtheora \
--enable-libvorbis \
--enable-libx264 \
--enable-nonfree PATH="$HOME/bin:$PATH" make make install make distclean #更新一下profile,ffmpeg加入到了PATH
source ~/.profile
重新运行了一下加水印的命令,ffmpeg又能正常工作了。
完整编译过程:http://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#CompilationInstallation
ffmpeg为视频添加时间戳 - 手动编译ffmpeg的更多相关文章
-
(原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究
使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究 Author:lihaiping1603@aliyun.com Create:2019-09-04 最近对ffmpeg给视频文件添加字幕效果 ...
-
使用ffmpeg给视频添加跑马灯效果(滚动字幕)
直接上命令 从左往右滚 ffmpeg -i input.mp4 -vf "drawtext=text=string1 string2 string3 string4 string5 stri ...
-
FFmpeg 向视频中添加文字
原文地址:http://www.cnblogs.com/wanggang123/p/6707985.html FFmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文 ...
-
NET 2.0(C#)调用ffmpeg处理视频的方法
另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...
-
Java使用FFmpeg处理视频文件指南
Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...
-
linux下编译ffmpeg 引入外部库x264
Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure ...
-
Java使用FFmpeg处理视频文件的方法教程
这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...
-
VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时
之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...
-
ffmpeg处理视频与声音
1.ffmpeg将mp4分解成多张jpg图片 要在游戏中播放视频,引擎竟然不支持.琢磨了一下,干脆将视频图片提取出来,然后用Animation动画类来播放这些图片,这样也能实现播放视频的效果.还是ff ...
随机推荐
-
tomcat:there is no resources that can be added or removed from server
原因: 1.不是web project 解决方式:project-->property--project facet 新建或者修改 2. 版本不兼容 升级tomcat版本
-
shell判断条件是否存在
1. shell判断文件,目录是否存在或者具有权限 2. #!/bin/sh 3. 4. myPath="/var/log/httpd/" 5. myFile="/var ...
-
J2EE项目应用开发过程中的易错点
场景一 实体类型与数据库类型不一致,在进行条件查询过程中不走索引 分析 字段值类型和数据库定义的字段类型不一致时,MySQL就会在内部做数据转化, 它的处理行为就会和我们期望的有些不一样,当我们使用整 ...
-
JSONP(跨域请求) —— 一种非官方跨域数据交互协议
1.JSONP的作用 由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源,为 了实现跨域请求,可以通过script标签实现跨域请求,然后再服务器端输出JSON数 ...
-
SQL SERVER 中如何将NULL转换为0
select isnull(fieldname,0) from tablename 如果字段fieldname的值是null,则结果是0
-
[背景分离] 识别移动物体基于高斯混合 MOG
使用很easy, frame 就是当前帧, foreground 是取得的, binary 型背景, 0.03是学习速率能够依据实际调整. cv::BackgroundSubtractorMOG ...
-
Java EE基础之JSP
从本篇文章开始,我会用文章记录下我在学习Java EE过程中的一些笔记和感悟,至于还没有更新结束的Java SE还是会继续写的,只是我觉得一直写语法很枯燥,自己也没法继续下去,所以带着点web学习,会 ...
-
C++11 学习 间隔更新中
1.*this 返回执行它的的对象的引用,this返回的是地址,这涉及C++对象模式有可能是对象的首地址,有可能是首地址加上虚表的长度, 一般是*this ,有不同意见的可以提出来讨论 2.初始化列表 ...
-
SQL游标使用及实例
declare my_cursor cursor scroll dynamic for select * from t_msg open my_cursor declare @name sysname ...
-
shell脚本判断安装包位置及类型
Log() { LogFile=/tmp/``.log LogDate=$(date +"%F %T") echo -e "\n\n||| ${LogDate} ||| ...