FFmpeg 和 MP4Box 几个命令_mp4box和ffmpeg-程序员宅基地

技术标签: 其他  

----------------------------FFmpeg-----------------------------

1、转码:

1. ffmpeg -i 1.mp4 -vcodec h264 "output.mp4"

2. ffmpeg -i [input.file] -c:v libx264 output.mp4

2、压缩:

1. ffmpeg -i  input.mp4 -r 10 -b:a 32k output.mp4

2. ffmpeg -i "1.wav" -b:a 64k -acodec mp3 -ar 44100 -ac 1 "1.mp3"

命令参数解释: -i "1.wav"表示输入,后面的文件名必须要用双引号; -b:a 64k表示音频的码率为64kb/s,即8kB/s; -acodec mp3表示设定声音编解码器为mp3; -ar 44100表示设定采样率为44100; "1.mp3"表示输出保存的文件名。

3、移动moov:

ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4 

批量处理:

for /R %v IN (*.mp4) do ( ffmpeg -i %v -vcodec h264  "path\%~nv.mp4")

也可以写一个脚本放到待转码视频的目录中,脚本代码如下,变量v前面比命令行多一个“%”:

for /R %%v IN (*.mp4) do ( ffmpeg -i %%v -vcodec h264  "path\%%~nv.mp4")

3.1 改变分辨率

ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4

4、视频剪辑:

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi

-ss代表开始时间 -t持续时间

5、音频剪辑:

ffmpeg -i source_mp3.mp3 -ss 00:01:12 -t 00:01:42 -acodec copy output_mp3.mp3

 6、分离视频流:

ffmpeg -i input_file -vcodec copy -an output_file_video

  将视频拿出来,不包含音频

 7、分离音频流:

ffmpeg -i input_file -acodec copy -vn output_file_audio

   将音频拿出来,不包含视频

 8、改变视频速率:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
0.5代表变为原来2倍速度,播放一段视频需要的时间为原来0.5倍。所以当这个值>1时就是减慢视频播放速度。
改变视频中音频sulv
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
为原来2倍,这个值在0.5到2之间,可以使用"atempo=2.0,atempo=2.0"这种串联的形式增加播放速率到4倍

 9、获取缩略图:

从指定时间开始,连续对1秒钟的视频进行截图:

ffmpeg -y -i input.mp4 -ss 00:05:25 -t 00:00:01 output_%3d.jpg

只截取一帧:

ffmpeg -ss 01:03:05 -i input -vframes 1 -q:v 2 output.jpg

 -vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)。

10.  覆盖(画中画)

覆盖, 语法:overlay[=x[:y],   所有的参数都是可选,默认值都是0

 举例

Logo在左上角:  ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

右上角:      ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w  pair2.mp4

左下角:                ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h  pair2.mp4

右下角:                ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h  pair2.mp4

删除logo,  语法:-vf delogo=x:y:w:h[:t[:show]]

    x:y 离左上角的坐标

    w:h  logo的宽和高

    t: 矩形边缘的厚度默认值4

    show:若设置为1有一个绿色的矩形,默认值0.

  ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0

删除水印:ffmpeg -i 1.png -strict -2 -vf delogo=230:492:165:103:0  "new.png"

添加图片水印:  ffmpeg -i inputfile -vf  "movie=masklogo,scale= 60: 30[watermask]; [in] [watermask] overlay=30:10 [out]" outfile

参数说明:

marklogo:添加的水印图片;

scale:水印大小,水印长度*水印的高度;

overlay:水印的位置,距离屏幕左侧的距离*距离屏幕上侧的距离;mainW主视频宽度, mainH主视频高度,overlayW水印宽度,overlayH水印高度

11. 添加文本

语法:drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]

常用的参数值

  x:离左上角的横坐标  y: 离左上角的纵坐标  fontcolor:字体颜色  fontsize:字体大小  text:文本内容

  textfile:文本文件  t:时间戳,单位秒  n:帧数开始位置为0  draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数

简单用法

1、在左上角添加Welcome文字

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom

2、在中央添加Good day

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"

3、设置字体颜色和大小

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

动态文本

用 t (时间秒)变量实现动态文本

1、顶部水平滚动

ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"

2、底部水平滚动

ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"

3、垂直从下往上滚动

ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“

4.实现右上角显示当前时间?

  动态文本

    在右上角显示当前时间 localtime

    ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“

   每隔3秒显示一次当前时间

    ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"

 

 

12. 图片处理

  图片支持: FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。

截取一张图片使用 –ss(seek from start)参数:  ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg

从视频中生成GIF图片:  ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif

转换视频为图片(每帧一张图):  ffmpeg -i clip.avi frame%4d.jpg

图片转换为视频:  ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4

       比如:图片名称全部是自然数, 001, 002, 003这样的3位数字,数字一定要是连续的否则会中断。文件存放在D:\pic下面

      ffmpeg -f image2 -i D:\pic\%03d.jpg my.mp4

      指定编码格式:

      ffmpeg -f image2 -i D:\pic\%03d.jpg -vcodec libx264 my.mp4

     指定输出帧率:

     ffmpeg -f image2 -i D:\pic\%03d.jpg -vcodec libx264 -r 10  my.mp4

    指定码率:

     ffmpeg -f image2 -i D:\pic\%03d.jpg -vcodec libx264 -r 10 -b 200k  my.mp4

 

裁剪:  ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png

填充:  ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

翻转:  ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg

     ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg

旋转:  ffmpeg -i image.png -vf transpose=1 image_rotated.png

覆盖:  ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png 

     ffmpeg -f lavfi -i smptebars smpte.png 

     ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2  rgb_smpte.png

 

13.其他高级技巧

屏幕录像

  显示设备名称:  ffmpeg -list_devices 1 -f dshow -i dummy

  调用摄像头:     ffplay -f dshow  -i video="Integrated Camera"

  保存为文件:     ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4

添加字幕subtitles:  语法 –vf subtitles=file,   ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4

视频颤抖:  ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)

色彩平衡:  ffplay -i jidu.mp4 -vf curves=vintage

色彩变幻:  fplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“

彩色转换黑白:  ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"

设置音频视频播放速度:

  3倍视频播放视频:       ffplay -i jidu.mp4 -vf setpts=PTS/3

  ?速度播放视频:     ffplay -i jidu.mp4  -vf setpts=PTS/(3/4)

  2倍速度播放音频:  ffplay -i speech.mp3 -af atempo=2

截图

  每隔一秒截一张图:  ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png

  每隔20秒截一张图:  ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图

  ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png

马赛克视频

  用多个输入文件创建一个马赛克视频:

    ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv

 

Logo动态移动

2秒后logo从左到右移动:  ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0

2秒后logo从左到右移动后停止在左上角:  ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0

每隔10秒交替出现logo:  ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4
 

FFMpeg合并视频方法 

先创建一个文本文件filelist.txt,然后用for循环输出以下内容:

file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'

然后:

ffmpeg -f concat -i filelist.txt -c copy output.mkv

注意:使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt 中转义.

 

FFmpeg对视频进行切片

切本地文件命令:ffmpeg -i test.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts

切网络地址命令:ffmpeg -i rtmp://127.0.0.1/myapp/test1 -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts

 

-------------------------------------------MP4Box------------------------------------------
mp4box -dash 5000 -rap -no-frags-default -profile onDemand source.mp4#video source.mp4#audio

处理后可用dash.js播放

分离音频:

mp4box -add input.mp4#audio -new output.aac

分离视频:

mp4box -add input.mp4#video -new output.mp4

合并音视频:

mp4box -add input.mp4 -add input.m4a output.mp4

合并视频:

mp4box -cat input1.mp4 -cat input2.mp4 -new output.mp4

更过MP4Box用法查看官方手册(英文)MP4Box

通过谷歌翻译后(中文)中文翻译

---------------------PHP 调用FFmpeg----------------------

默认环境为windows

第一种方法:直接调用exec 需开启相关权限

下载ffmpeg.exe放在网站根目录,实测不用配置环境变量即可使用

一个截取视频封面的例子

$from = "./Public/media/movie/1.mp4";//视频目录
$name = "1.png";//图片名称
$to = "./Public/media/pic/";//图片存放路径
$str = "ffmpeg -i " . $from . " -y -f mjpeg -ss 10 -t 1 -s 250x160 " . $to . $name;//ffmpeg命令
exec($str, $output);//执行命令

第二种方法:调用PHP-FFMpeg类

具体方法可查看此博客 and 此博客

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MZ911118/article/details/84326613

智能推荐

为什么在web项目中的pom.xml文件中给servlet-api依赖添加provided_pom.xml servlet apach-程序员宅基地

文章浏览阅读908次。转载:https://blog.csdn.net/qq_42449963/article/details/105232795_pom.xml servlet apach

一文梳理金融风控建模全流程(Python)-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏31次。一、信贷风控简介 信贷风控是数据挖掘算法最成功的应用之一,这在于金融信贷行业的数据量很充足,需求场景清晰及丰富。信贷风控简单来说就是判断一个人借了钱后面(如下个月的还款日)会不会按期还钱。更专业来说,信贷风控是还款能力及还款意愿的综合考量,根据这预先的判断为信任依据进行放贷,以此大大提高了金融业务效率。与其他机器学习的工业场景不同,金融是极其厌恶风险的领域,其特殊性在于非..._建立一个量化风险预测模型。这是某金融机构的普惠贷款以及不良表现的数据

chatgpt赋能python:Python的sorted函数:介绍和使用方法_python的sorted如何提高比较精度-程序员宅基地

文章浏览阅读98次。在Python中,sorted()函数是一个内置函数。它可以用来对各种类型的数据集合进行排序。sorted()函数根据给定的键或值对数据进行排序,并返回排序后的结果。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体。_python的sorted如何提高比较精度

tampermonkey油猴+chrome,在浏览器中运行自己写的js脚本_油猴能篡改js-程序员宅基地

文章浏览阅读2.6w次,点赞3次,收藏12次。前言最近再看犀牛书《JavaScript权威指南》,当中的小例子我发现自己没法调试它zzz,于是就想到把它嵌入到浏览器里面,主要是使用的油猴再加上自己的js脚本环境tampermonkey v4.6 油猴 ubuntu 18 chrome油猴添加脚本 点击这边的添加脚本,然后在界面的脚本页面中输入自己的脚本代码,就可以了。测试代码// ==UserSc..._油猴能篡改js

我的朋友佩德罗破解版下载|我的朋友佩德罗(My Friend Pedro)免安装绿色中文破解版下载_我的朋友佩德罗下载-程序员宅基地

文章浏览阅读3.9k次。点击下载来源:我的朋友佩德罗(My Friend Pedro)免安装绿色中文破解版我的朋友佩德罗(My Friend Pedro)是由Devolver Digital发行的一款款新颖有趣的第三人称射击游戏,玩家在游戏中获得更加强大的实力,轻松的击杀敌人。游戏开始,你会在香蕉的指引下开始杀手生涯,使用匕首、手枪、机枪等武器,通过跳跃、翻滚、减缓时间等动作,躲避敌人的射击,并将其消灭。整个游戏连贯..._我的朋友佩德罗下载

使用mJS进行物联网嵌入式脚本和开发的新方法-程序员宅基地

文章浏览阅读584次。在上一篇文章中 ,我谈到了IoT(物联网)以及将物理对象(“物”)连接到Internet。 我已经讨论了Mongoose OS (一种用于IoT的开源操作系统)如何使新手和专业开发人员都能轻松地使用JavaScript编程微控制器。 您可能想知道为什么使用JavaScript,以及JavaScript引擎如何装入微控制器的有限内存中。 有许多旨在将脚本编写在微控制器上的项目,其中包括其他J..._mjs javascript

随便推点

人脸识别 | AI产品经理需要了解的CV通识(二)-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏4次。前言:本文作者@jasmine,是我们“AI产品经理大本营”成员,下面是她分享的第4篇文章,欢迎更多有兴趣“主动输出”的朋友们一起加入、共同进步:) 最近整理了CV方向的一些产品基础知识,我上一篇文章《看AI产品经理如何介绍“计算机视觉”(基于实战经验和案例)》算是这个系列的第一篇;本文是本系列下的第二篇,主要针对人脸识别进行梳理。后续还会有多目标跟踪、OCR等方向的内容。希望大家能从这个系列收获_关于人脸识别,qa质检

用ajax向后台传递数组乱码解决方法-程序员宅基地

文章浏览阅读1.3k次。var result = ['1','2','3'];$.ajax({type: "GET",url:"http://xxxxxxxx",data:{ groups:result, },dataType:'json', success: function (Json) { console.log("success")

bitmap算法 --位图算法_位图算法的实验思路-程序员宅基地

文章浏览阅读322次。bitmap算法 --位图算法位图不是像素图片,而是内存中连续的二进制位(bit),用于对大量整型数据做去重和查询例题:给定一块10bit的内存空间,想要依次插入整型数4,2,1,3解法:10bit每一位的的值为0,当插入4时,此时下标 4 的位置,bit值置为1,剩下三个数类似。。。应用:例:一个用户对应多个标签解法:思路逆转。一个标签对应多个用户1、建立用户名和用户ID的映射..._位图算法的实验思路

librealsense2及pyrealsense2安装_ubuntu安装librealsense2-程序员宅基地

文章浏览阅读5.8k次,点赞5次,收藏32次。librealsense2及pyrealsense2安装环境:重新安装的Ubuntu16.04,什么都没有 emmmmm1.安装包官方文档:https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md(1)sudo apt-key adv --keyserver keys.gnupg..._ubuntu安装librealsense2

java.lang.ArithmeticException: Rounding necessary-程序员宅基地

文章浏览阅读2.3w次,点赞2次,收藏3次。可能原因:对BigDecimal对象设置了精度,但是没有设置取舍方式,会报错java.lang.ArithmeticException: Rounding necessary。@Testpublic void testDecimal() { String str = "3.33333"; BigDecimal decimal = new BigDecimal(str); try {..._java.lang.arithmeticexception: rounding necessary

[论文笔记]端到端视觉定位 DA4AD: End-to-End Deep Attention-based Visual Localization for Autonomous Driving 2020_predicted iddt per position-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏11次。百度自动驾驶部门注意力机制在视觉重定位任务中的应用,端到端网络,可用于明显外观变化的场景,cm级精度,优于基于激光雷达的定位方法。本文使用CNN以及注意力机制训练描述子与关键点,与数据库图像做匹配然后解算相机位姿。构建特征金字塔,使用全卷积网络 独立 提取密集特征。构建定位地图: attentive keypoints + features + 3D coordinates, 3D 坐标来自于激光雷达根据先验位姿找到附近的三维点,在先验位姿附近多次采样,根据这些位姿将三维点投影到当前图像中进._predicted iddt per position