Total Pageviews

Thursday, 15 April 2021

免费开源的视频/音频格式转换和压缩/编辑软件FFmpeg

 

使用 ffmpeg 缩放、裁剪、剪辑视频


我们平时使用手机拍摄的视频一般都在1080p及以上,在实际应用中,比如共享给朋友等,可能需要处理一下会比较方便。下面列出几个 ffmpeg 常用的处理视频方法.

缩小视频

假设原始视频尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以缩小到 480p:
$ ffmpeg -i a.mov -vf scale=853:480 -acodec aac -vcodec h264 out.mp4
各个参数的含义:
  • -i a.mov 指定待处理视频的文件名
  • -vf scale=853:480 vf 参数用于指定视频滤镜,其中 scale 表示缩放,后面的数字表示缩放至 853×480 px,其中的 853px 是计算而得,因为原始视频的宽高比为 16:9,所以为了让目标视频的高度为 480px,则宽度 = 480 x 9 / 16 = 853
  • -acodec aac 指定音频使用 aac 编码。注:因为 ffmpeg 的内置 aac 编码目前(写这篇文章时)还是试验阶段,故会提示添加参数 “-strict -2” 才能继续,尽管添加即可。又或者使用外部的 libfaac(需要重新编译 ffmpeg)。
  • -vcodec h264 指定视频使用 h264 编码。注:目前手机一般视频拍摄的格式(封装格式、文件格式)为 mov 或者 mp4,这两者的音频编码都是 aac,视频都是 h264。
  • out.mp4 指定输出文件名
上面的参数 scale=853:480 当中的宽度和高度实际应用场景中通常只需指定一个,比如指定高度为 480 或者 720,至于宽度则可以传入 “-1” 表示由原始视频的宽高比自动计算而得。即参数可以写为:scale=-1:480,当然也可以 scale=480:-1

 裁剪视频

有时可能只需要视频的正中一块,而两头的内容不需要,这时可以对视频进行裁剪(crop),比如有一个竖向的视频 1080 x 1920,如果指向保留中间 1080×1080 部分,可以使用下面的命令:
$ ffmpeg -i a.mov -strict -2 -vf crop=1080:1080:0:420 out.mp4
其中的 crop=1080:1080:0:420 才裁剪参数,具体含义是 crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸,x:y 表示裁剪区域的左上角坐标。比如当前这个示例,我们只需要保留竖向视频的中间部分,所以 x 不用偏移,故传入0,而 y 则需要向下偏移:(1920 – 1080) / 2 = 420
视频缩放和裁剪是可以同时进行的,如下命令则为将视频缩小至 853×480,然后裁剪保留横向中间部分:
$ ffmpeg -i IMG_4940.MOV -strict -2 -vf scale=853:480,crop=480:480:186:0 out.mp4

剪辑视频

如果有一段很长的视频只需保留其中的一段,可以使用下面命令对视频进行剪辑。
$ ffmpeg -i a.mov -ss 00:00:21 -t 00:00:10 -acodec aac -vcodec h264 -strict -2 out.mp4
其中 -ss 00:00:21 表示开始剪辑的位置(时间点),-t 00:00:10 表示剪辑的长度,即 10 秒钟。
当然一段视频是可以在一个命令里同时进行剪辑、缩放、裁剪的,只需把相关的参数合在一起即可.
-----------------

使用H264编码转换视频

H264(即MPEG4 AVC)是目前比较流行的视频编码格式,相对MPEG2编码而言,在画质大致相同的情况下能将视频大小再压缩到50%~25%,即如果一个MPEG2(如DVD)视频大小是1GB,用H264编码能缩小到250MB左右。另外H264编码的视频还能直接在浏览器(如Chrome)和移动设备(如iPhone、Android手机)上直接播放。
如果你有一堆家庭视频(旧款的家用DV一般是MPEG2格式)想刻录到光盘保存,或者有一堆手机不直接支持的格式的视频想在手机上播放,那么用H264编码转换和压缩它们是一个不错的选择。
mencoder 是一个很方便的视频编码程序,它几乎支持所有的视频格式,而且参数丰富、速度快。
首选你需要安装 mencoder 程序(下面分别是 Archlinux, Fedora, Ubuntu下的安装方式):
$ sudo pacman -S memcoder
$ sudo yum install mencoder
$ sudo apt-get install mencoder
然后就可以查看你当前系统支持哪些视频和音频编码器,以及支持哪些封装格式了:
$ mencoder -ovc help
$ mencoder -oac help
$ mencoder -of help
如果看到有x264视频编码器、有mp3lame音频编码器、以及有mp4封装格式,那么就可以开始下面的编码转换了,否则你可能需要安装相应的音频和视频编码器,一般安装 ffmpeg 组件就会同时附带这些编码器。
压缩一段MPEG2视频:
$ mencoder m001.mpg -o m001.mp4 -oac mp3lame -ovc x264 -of lavf -vf lavcdeint
上面命令中的 m001.mpg 和 m001.mp4 分别是输入和输出文件名,-oac 用于指定音频编码器,-ovc 指定视频编码器, -of 指定输出文件封装方式,lavf表示输出文件封装方式由输出的文件名(的扩展名)决定(比如m001.mp4表示用mp4封装,m001.avi表示用avi封装),最后 -vf lavcdeint 参数用于去除视频中的拉丝条纹(锯齿纹),如果没有的话不要这个参数也可以。
h264的编码过程比较耗时,比如 AMD 四核2.8G的编码速度大概是 30fps,大概是视频正常播放所需的时间。
如果待编码转换的视频文件很多,则最好写一个批量处理的脚本:
#!/bin/bash
find . -type f ( -name "*.mpg" -o -name "*.mpeg" )|while read line;do
echo $line
mencoder $line -o ${line}.mp4 -oac mp3lame -ovc x264 -of lavf -vf lavcdeint
done
执行上面的脚本会将当前目录里所有后缀名为“mpg”和“mpeg”的视频编码为H264格式。
最后,除了mencoder之外,还可以使用ffmpeg来编码.
-----------------

转换mp4、x264、h.264

FFmpeg是Ubuntu下强大的视频、音频编解码工具。 x264可以编码出高质量的h.264视频,iPad必须要h.264编码或mpeg-4编码的视频才能正常播放。
由于版权方面尚未确定,虽然全国很多网站都在使用h.264编码,但将来很有可能会被版权问题所困扰,所以Ubuntu官方源默认是不提供h.264编码的,这就需要我们手工编译安装FFmpeg的h.264支持,使之能够编码出mp4文件。
Ubuntu下安装、使用和升级FFmpeg的方法如下.
1、安装支持包
#libmp3lame
sudo apt-get remove libmp3lame-dev
sudo apt-get install nasm
wget http://downloads.sourceforge.net/project/lame/lame/3.98.4/lame-3.98.4.tar.gz
tar xzvf lame-3.98.4.tar.gz
cd lame-3.98.4
./configure --enable-nasm --disable-shared
make
sudo checkinstall --pkgname=lame-ffmpeg --pkgversion="3.98.4" --backup=no --default --deldoc=yes
#卸载现有的 x264、libx264-dev、FFmpeg
sudo apt-get remove ffmpeg x264 libx264-dev
#安装所有的 FFmpeg 和 x264 支持包
sudo apt-get update
sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libvpx-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev
2、安装x264
cd
git clone git://git.videolan.org/x264.git
cd x264
./configure
make
sudo checkinstall --pkgname=x264 --pkgversion "2:0.`grep X264_BUILD x264.h -m1 | cut -d\' \' -f3`.`git rev-list HEAD | wc -l`+git`git rev-list HEAD -n 1 | head -c 7`" --backup=no --deldoc=yes --fstrans=no --default
3、安装FFmpeg
cd
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab
make
sudo checkinstall --pkgname=ffmpeg --pkgversion "4:SVN-r`LANG=C svn info | grep Revision | awk \'{ print $NF }\'`" --backup=no --deldoc=yes --fstrans=no --default
hash x264 ffmpeg ffplay
4、安装qt-faststart(可选)
这是个重要的x264再编码工具, 它的作用是使得视频不必等待下载完成即可开始播放。
使用方法:
qt-faststart input.foo output.foo
安装方法:
cd ~/ffmpeg
make tools/qt-faststart
sudo checkinstall --pkgname=qt-faststart --pkgversion "4:SVN-r`LANG=C svn info | grep Revision | awk \'{ print $NF }\'`" --backup=no --deldoc=yes --fstrans=no --default install -D -m755 tools/qt-faststart /usr/local/bin/qt-faststart
5、基本安装完成,你可以保留 ~/x264、~/ffmpeg目录以便将来升级时使用。
6、升级 FFmpeg 和 x264
sudo apt-get remove ffmpeg x264 libx264-dev libvpx
cd ~/x264
make distclean
git pull 
cd ~/ffmpeg
make distclean
svn update
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab
make
sudo checkinstall --pkgname=ffmpeg --pkgversion "4:SVN-r`LANG=C svn info | grep Revision | awk \'{ print $NF }\'`" --backup=no --deldoc=yes --fstrans=no --default
hash x264 ffmpeg ffplay
7、使用 FFmpeg and x264
容易的输出高质量视频的方法是使用FFmpeg中libx264的预设模式。预设模式的使用可以参考FFmpeg x264 encoding guide。 你可以手工调整一些选项 (例如窗口大小: -s 640×480) 。 另外你可以参考 libx264 预设模式在线列表或再 /usr/local/share/ffmpeg 目录中查找帮助。
One-pass CRF (Constant Rate Factor) 使用预设模式:slow. One-pass CRF是经常使用的常规编码方式. 调整 -crf 可以改变输出质量. 数字越小输出质量越高同时输出尺寸越大. 可使用的数字范围是:18 ~ 28:
ffmpeg -i input.avi -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre slow -crf 22 -threads 0 output.mp4
Two-Pass encode 使用预设模式: fast. 想要精确设置目标编码率、文件大小的时候会使用到这个编码模式:
ffmpeg -i input.avi -pass 1 -vcodec libx264 -vpre fast_firstpass -b 512k -bt 512k -threads 0 -f rawvideo -an -y /dev/null && ffmpeg -i input.avi -pass 2 -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre fast -b 512k -bt 512k -threads 0 output.mp4
iPod/iPad 640×480,使用预设值: slow 和 ipod640:
ffmpeg -i input.avi -acodec libfaac -aq 100 -ac 2 -vcodec libx264 -vpre slow -vpre ipod640 -crf 26 -map_meta_data 0:0 -vf scale=640:-1 -threads 0 output.mp4
flv视频转换为mp4视频:
ffmpeg -i source.flv -f avi -vcodec mpeg4 output.mp4
合并视频文件:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
或用mencoder合并视频文件:
mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi video3.avi
截取一张352×240尺寸大小的,格式为jpg的图片:
ffmpeg -i source.avi -y -f image2 -t 0.001 -s 352x240 output.jpg
把视频的前11帧转换成一个动画图片(Animated Gif):
ffmpeg -i source.avi -vframes 11 -y -f gif output.gif
在视频的第8.01秒处截取 352*240 的缩略图:
ffmpeg -i source.avi -y -f image2 -ss 08.010 -t 0.001 -s 352x240 output.jpg
转换 yuv 文件:
ffmpeg -s cif -vcodec mpeg4 -i paris.yuv paris.avi
说明:
    -s 指定帧大小 cif 为 352x288,qcif 为 176x144,4cif 为 704x576
    -vcodec 指定采用的编码器
    -i 指定输入文件
输出 raw YUV420P 文件:
ffmpeg -i paris.avi paris0.yuv
将一段视频输出为图片序列:
ffmpeg -i 1.avi cat%d.png -vcodec png
说明:
    -vcodec mjpeg
    -vcodec ppm
ffmpeg -i 1.avi cat%04d.jpg -vcodec mjpeg -ss 0:1:2 -t 0:0:1
说明:将1.avi视频 1分02秒 处开始,持续1秒长的视频输出为jpg的序列
ffmpeg -vcodec mjpeg -i 1.flv test%02d.jpg -ss 0:0:2 -t 0.001
说明: -t 表示持续时间为0.001秒,这个命令相当于截取开始2秒处的一幅jpeg的图片
多输入,单输出:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
单输入,多输出:
ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0
说明:-map file:stream_index 指定哪一个输入流用于输出流,顺序对应
DVD 转 mpeg4:
ffmpeg -i snatch_1.vob -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 -acodec mp2 -ab 128 snatch.avi
说明:
    压制高品质mp4的参考参数:
    \'-mbd rd -flags +4mv+trell+aic -cmp 2 -subcmp 2 -g 300 -pass 1/2\'
   可以试试: \'-bf 2\', \'-flags qprd\', \'-flags mv0\', \'-flags skiprd\'
编码 mpeg1/mpeg2:
ffmpeg -i 1.avi -vcodec mpeg2video 2.mpg
 说明:
    注意mpeg2的codec为 mpeg2video
    其他codec可以使用 ffmpeg -formats 查看
    压制高品质mp1/mp2的参考参数:
        \'-mbd rd -flags +trell -cmp 2 -subcmp 2 -g 100 -pass 1/2\'
   注意,加 \'-g 100\' 可能会使某些解码器没法解码
   可以试试: \'-bf 2\', \'-flags qprd\', \'-flags mv0\', \'-flags skiprd\'
编码为 flv:
ffmpeg -i 1.avi -ab 56 -ar 22050 -b 500 -r 15 1.flv
X 屏幕录像
FFmpeg 捕获 X11 的显示内容:
ffmpeg -f x11grab -i :0.0 /tmp/out.mpg
说明:
    0.0 是 X11 服务器 display.screen 格式的编号 , 可从环境变量的设置中获取。
ffmpeg -f x11grab -i :0.0+10,20 /tmp/out.mpg
说明:
    0.0 是 X11 服务器 display.screen 格式的编号 , 可从环境变量的设置中获取。
    10 、 20 分别是捕获窗口的x、y偏移量。
音视频采集:
ffmpeg -f audio_device -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
说明:使用FFmpeg捕获前视频源必须有效激活 。
FFmpeg截图参数:
ffmpeg -i xxx.xxx -y -f image2 -ss 8 -t 0.001 -s 350x240 xxx.jpg
FFmpeg 加水印 参数:
ffmpeg -i inputfile.xxx -tagpict ":220:210" -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320x240 outputfile.flv
水印参数说明:
-tagpict ":220:210"
(在ffmpeg所在目录中寻找0002.mjpg、mask.mjpg两个用作水印处理的图片文件,然后在指定的坐标,比如此处的:220:210,把水印在转码过程中添加到视频文件的每一桢上)
ffmpeg -i input.wmv -vhook \'vhook_path/watermark.so -f logo.png -x -10 -y -10 -w 4 -h 4\' output.mpg
ffmpeg -i input.flv -vhook \'/usr/lib/vhook/watermark.so -f
logo.gif -m 0 -t ffffff\' -ab 96 -b 8000k output.flv
AviSynth加水印:
首先ffmpeg/Mencoder编译时需要–enable-avisynth; 
转换参数:ffmpeg -y -i 1.avs -b 320k rmvb-avs.flv
avs编写格式:
video = DirectShowSource("rmvb.rmvb",15).BilinearResize(320,240)
logo = ImageSource("logo2.jpg")
logomask = ImageSource("mask2.jpg")
overlay(video,logo,mask=logomask)
常用选项:
-i filename 输入文件
-f fmt 强迫采用格式fmt
-y 覆盖输出文件
-ss position 搜索到指定的时间处开始 [-]hh:mm:ss[.xxx]的格式也支持
-b bitrate 设置比特率,缺省200kb/s
-r fps 设置帧频 缺省25
-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
    sqcif 128X96 qcif 176X144 cif 352X288 4cif 704X576
-vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-g gop_size 设置图像组大小
-intra 仅适用帧内编码
-bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道 缺省为1
-an 不使能音频纪录
-acodec codec 使用codec编解码
-benchmark 为基准测试加入时间
-hex 倾倒每一个输入包.
ffmpeg site:
http://git.ffmpeg.org/
------------------------------

利用ffmpeg在linux下将mp3文件转换为wma

现在网络朝宽带网发展越来越快了,但服务器托管环境要变化还是要很多的¥,所以能节省一分就是一分。在网络上音频文件通常使用mp3格式存储,mp3格式音质可以压得比较好,但体积稍嫌有些大,而压低了音质的话就比较难听,而且也压得还不够小。wma文件在这点上相比mp3优化很多。经测试,使用24k码率下,5MB的mp3文件可压到1MB左右的wma,在我这样的烂耳朵下虽然分得出音质的胜负,但还尚能听。如果有朋友要做一个翻唱或乱录音的网站,那么把文件压成wma格式就合适不过了。

在网上搜了几十页,都是讲述如何将wma转换为mp3的,零星有几个mp3转wma的例子,可惜都是windows下的版本,有些还需要花钱。

于是干脆祭出ffmpeg,ffmpeg相信很多处理媒体文件的朋友都用过,是非常之强大,不但可以处理流行的flv等格式,我之前一直用来转换视频格式(asf、3gp、rm……)到wmv的,wmv既然能转,那么wma当然也一定能!

在网上搜寻一阵,找到了ffmpeg转wma的执行命令:

ffmpeg -y -ab 24 -ar 22050 -acodec wmav2 -i test.mp3 test.wma

其中-y参数是指直接覆盖存在文件而不用确认;-ab参数是码率;-ar参数采样率;-acodec是指定压缩格式;-i是指输入的文件;最后在敲上输出的文件就可以了。

对文件字节数影响最大的就是码率,wma文件最小的码率就是24k,不能再小了,唉,我还想用12k一试呢。

于是在命令行运行该命令,没有能成功,因为我两年前编译的这个ffmpeg并没有能支持wma。

于是到ffpeg的源码目录下(嘿嘿,这么多年了,这个源码目录居然还存在),忘了怎么编译?执行:

ffmpeg | head

就找回了原先的编译参数,是不是要加一个参数就能支持wma,难道还要装一个lame这样的东东么?敲上

./configure --help | grep wma

没有结果,仔细看了一遍help,也确实没有发现有关的东西。

于是在源码目录敲一下:

ss

请允许我有如此跳跃性的思维,其实我是没思路的时候,习惯性随手敲的,ss在我的机器上配置为svn up的快捷键。

这样一敲结果出现神奇现象,这个目录居然是一个svn拿下来的目录,而且,那么多年了,居然还能从这个svn地址check下东西,svn团队居然能把一个svn地址维护那么多年,一直没中断,实在是一大奇迹。

看一下这个传奇的svn地址:

svn://svn.mplayerhq.hu/ffmpeg/trunk

朋友们可以直接敲:

svn co svn://svn.mplayerhq.hu/ffmpeg/trunk

就可以拿下ffmpeg的所有东西了,我不知道ffmpeg现在有没有出tar.gz的包裹,前些年我就是直接从这个svn地址checkout下来的了。

多年没更新了,svn up的时间还比较长……

拿下最新的源码后,直接编译一下看看,我的编译参数是极简的:

./configure --enable-gpl --disable-debug --prefix=/data/ffmpeg --enable-libmp3lame --enable-pthreads --enable-nonfree

我用的系统是ubuntu,在ubuntu下有ffmpeg的apt,但当时安上去后发现没有声音,于是下载了ffmpeg的svn,并自己装上lame,才创出了声音。lame记得是用apt安装的,不很麻烦:

apt-get install lame liblame-dev

注意要安上liblame-dev的开发包,否则还是会不能支持mp3。

然后就是:

make; make install

无聊的过程。

装完后可以一测,嗯,这回能支持了。


总结(写到后面我总有点不耐烦):

###############################
#系统是ubuntu6

apt-get install lame liblame-dev
svn co svn://svn.mplayerhq.hu/ffmpeg/trunk
cd trunk
./configure --enable-gpl --disable-debug --prefix=/data/ffmpeg --enable-libmp3lame --enable-pthreads --enable-nonfree
make -j10; make install

###

然后就可以用了:

/data/ffmpeg/ffmpeg -y -ab 24 -ar 22050 -acodec wmav2 -i test.mp3 test.wma

附带转wmv的,我怕不支持,也小测一把:

ffmpeg -y -acodec mp3 -vcodec wmv2 -i test.rm test.wmv
ffmpeg -y -acodec wmav2 -vcodec wmv2 -i test.rm test.wmv
都可以。
-----------

为 Linux 服务器编写的 BDRip 脚本

吐槽:学校个大土豪,居然用双路 E5-2620 + 16G 内存的服务器,强烈怀疑这服务器上的站加起来不如这俩CPU贵… 另外机器上只有一块 300G 的硬盘 (SAS?) 是什么情况… 以及盗版的 RHEL5 是什么情况… 以及 /opt 分了 236G,rootfs 只有 19G 是要闹哪样…
于是进入正题。Linux 服务器一般都不安装图形界面,更加节省资源。同时现在也能以每月数十美元的价格租到足够性能和带宽的独立服务器,更何况把任务丢给服务器自动化操作,人的时间便可以节省下来做更重要的事情。
脚本需要如下软件包:
  • ffmpeg
  • mencoder
  • x264
  • mkvtoolnix
学校的服务器是 RHEL5 还没给激活,没办法换了 CentOS 的源,上面的一些软件包需要从 repoforge 获得。Ubuntu/Debian 的话,一般启用专有软件仓库就可以了。
下面贴脚本。

#!/bin/bash
# $1 = origin file
# $2 = output file
# $3 = quality
# $4 = threads

# The crf option controls encoding quality, and indirectly the final
# filesize. The higher the value, the more compression and thus smaller
# file size. Reduce the value and file size will go up. A value of 21
# should produce a file of approximately 4GB in size for a typical movie.

# Encode the video using x264, ignore the audio for now.
mencoder $1.m2ts \
-ovc x264 -x264encopts \
crf=$3:frameref=3:bframes=3:direct_pred=auto:weight_b:partitions=all:8x8dct:me=umh:mixed_refs:trellis=1:nopsnr:nossim:subq=6:level_idc=41:threads=$4 \
-nosound \
-of rawvideo \
-o $2.x264

# Extract first sound track, normally stream 0:1 in BDs.
ffmpeg -i $1.m2ts -map 0:1 -acodec flac $2.flac

# Convert raw x264 video to MP4
ffmpeg -i $2.x264 -vcodec copy $2.mp4

# Finally, merge everything into a single MKV file
mkvmerge -o $2.mkv $2.mp4 --track-name 0:Jpn $2.flac

# Uncomment if you want to clean up your working environment.
# rm $2.x264 $2.flac $2.mp4

# Tell the user we're done.
echo "Rip complete. Output file is $2.mkv"

保存为 transcode.sh 并赋予可执行权限:

$ chmod +x transcode.sh

脚本基本上是从下面的参考链接里抄来的,但是做了一些更改以适合我目前的需求。脚本接受 4 个参数,分别为输入文件(不含扩展名)、输出文件(不含扩展名)、质量、线程数。我在服务器上 Rip 的文件是 zyo 买的「未確認で進行形」第一卷OVA,命令如下:

$ ./transcode.sh 00004 4 18 20

transcode.sh 是当前目录下的脚本文件,00004 代表当前目录下的 00004.m2ts 片源,输出文件将是 4.mkv,压缩质量为 18,编码过程使用 20 个线程(服务器一共 12 个核心 24 个线程么我就不客气啦。
OVA压缩大约使用了不到 20 分钟的时间,最终文件大小不到 500M。看起来效果还可以嗯…
参考:
--------------------------

HowTo: Encode a Blu-ray rip into a smaller format without losing quality

Those of you who archive or backup their Blu-ray movie media to hard-drive will already be aware that the average movie comes out at a good 25GB. Some of the bigger titles top out at around 40GB or more. This eats up an awful lot of disk space.
Blu-ray titles are already compressed down using the MPEG2 codec, and quality pundits will abhor the idea of re-compressing the title again for fear of losing image and audio quality. Certainly if you go down the Xvid route, you will definitely lose image quality, but as per my previous DVD HowTo, you can do excellent rips with virtually indistinguishable quality to the original using the x264 codec, and have a significantly smaller footprint to go with it.
The process of encoding a Blu-ray rip isn’t quite the same as doing a DVD, however, so here’s a quick guide on how to take your decrypted .m2ts file and finish up with a much smaller, but 99% perfect copy in a Matroska .mkv file.
Pre-requisites:
  • A pre-decoded Blu-ray movie file (.m2ts file).
  • Approximately the same amount of free disk space as the size of the movie file. Eg: If you have a 25GB movie file, then you should have another 25GB free space to work with. You can have less, since the final resulting file will be much smaller than the original movie anyway, but since this process can take a number of hours to complete, you don’t exactly want to discover you ran out of disk space and have to start over, do you?
  • A nice powerful CPU. I use a Intel quad-core Q9450 CPU at 2.66GHz. It takes my machine roughly 9-12 hours to process just one movie using four threads. A dual-core will take longer.
  • Time to let the PC do its work, eg: overnight.
This guide was written using Ubuntu 8.10 Intrepid Ibex 64-bit, but will work quite happily in 32-bit and should also work with most previous versions of Ubuntu.
  1. You will need some extra software installed if you haven’t already got it. Open a terminal and type in the following at the $ prompt:
    $ sudo apt-get install mencoder mplayer gpac x264 mkvtoolnix
    (Don’t worry if you’ve already got some of those apps installed, Ubuntu will skip over them if they already exist on your system)
  2. Create a new text file somewhere using your favourite text editor, eg:
    $ gedit ~/encodevideo.sh
    …will create a new text file called “encodevideo.sh” in the root of your Home directory using the GEdit text editor.
  3. Now copy and paste the following script into it:
    #! /bin/bash
    
    # =====================================================================
    # Blu-ray encoding script by HyRax February 2009 http://www.serenux.com
    # =====================================================================
    
    # Make sure the user has specified what to work on.
    if [ -z "$1" ]; then
      echo "\nBlu-ray movie encoding script\n-----------------------------"
      echo "Written by HyRax February 2009\nhttp://www.serenux.com"
      echo "\nUsage: $0 "
      echo "\nExample: If your movie file is called TheDarkKnight.m2ts then\nyour usage will be: $0 TheDarkKnight\n"
      exit
    fi
    
    # The crf=21 option controls encoding quality, and indirectly the final
    # filesize. The higher the value, the more compression and thus smaller
    # file size. Reduce the value and file size will go up. A value of 21
    # should produce a file of approximately 4GB in size for a typical movie.
    
    # Encode the video using x264, ignore the audio for now.
    mencoder $1.m2ts \
    -ovc x264 -x264encopts crf=21:frameref=3:bframes=3:b_pyramid=normal:direct_pred=auto:weight_b:partitions=all:8x8dct:me=umh:mixed_refs:trellis=1:nopsnr:nossim:subq=6:level_idc=41:threads=4 \
    -nosound \
    -of rawvideo \
    -o $1.x264
    
    # Dump the first original audio track (should be the English track) but
    # don't re-encode it. Ignore the video.
    mplayer $1.m2ts -dumpaudio -dumpfile $1.ac3
    
    # Copy the raw x264 encoded video into an MP4 container so we can set
    # the correct framerate (generally 23.976 - adjust it if MPlayer or
    # MEncoder report something different)
    MP4Box -add $1.x264 $1.mp4 -fps 23.976
    
    # Finally, merge everything into a single MKV file
    mkvmerge -o $1.mkv $1.mp4 --track-name 0:Eng $1.ac3
    
    # Remove the hash in front of the next command to have the script delete
    # your working files when encoding is complete.
    # rm $1.m2ts $1.x264 $1.ac3
    
    # Tell the user we're done.
    echo "All done! Your final movie file is called $1.mkv - enjoy!"
    
  4. Save and exit your text editor.
    .
  5. Change directory to where you have your original .m2ts file, eg:
    $ cd ~/Videos/BDRips/MyMovie
  6. Let’s say your movie file is called TheIsland.m2ts. To begin encoding it, you will use the following command:
    $ sh ~/encodevideo.sh TheIsland
    (Notice that we don’t specify the file extension – the script assumes .m2ts on the end already)
  7. Hit enter and the encoding process will begin. The script does the following in order:
    1. Extract the video component only and encode it in a single pass to a raw x264 video file called TheIsland.x264 (in this example).
    2. When that has finished, go back and extract the first audio track only and save it to a file called TheIsland.ac3 without any re-encoding.
    3. When that has finished, take the raw x264 video data and put it into an MPEG4 container so we can fix the framerate at 23.976 frames per second, typical of most Blu-ray movies. If you don’t do this step, then the video will play faster than the audio in the final product.
    4. Finally we create a new Matroska container called TheIsland.mkv and in it we place the framerate-adjusted MPEG4 video track and the unmodified audio track, producing our final product.
    .
  8. When the script has finished some 9-12 hours later, you will have a file called TheIsland.mkvready for playback in Totem, MPlayer, VLC, or whatever your favourite player is. You will notice that the filesize is significantly smaller than the original but when you play it back, the image quality will look pretty much 100% identical to the original. About the only compression artefacts you may notice is around the edges of some text titles such as opening credits, but you’d really have to look hard to spot them.
    .
  9. We’ve finished with the working files now, so you can delete the .m2ts, .x264 and .ac3 files now to reclaim the disk space and enjoy your new .mkv file.
    .
Enjoy! :)
from http://web.archive.org/web/20141011201917/http://www.rcomputer.eu/21-zoznam/operacne-systemy/linux/157-howto-encode-a-blu-ray-rip-into-a-smaller-format-without-losing-quality
-------------------------------------

免费开源的视频/音频格式转换和压缩软件FFmpeg-快速转换格式和压缩视频


一、FFmpeg软件安装

官网:https://ffmpeg.zeranoe.com/builds/
备用下载:https://wzfou.com/down/ffmpeg64(64位)
进入网站后,选择你要安装的版本,支持Windows 7 和 Mac OS X 10.10及以上。

FFmpeg选择安装版本

下载的压缩包解压获得 ffmpeg-xxx-win64-static 文件夹,将其重命名为 ffmpeg ,然后将 ffmpeg 文件夹放置到程序文件夹,例如wzfou.com放置路径为:C:\。

打开环境变量设置页:资源管理器 > 此电脑 > 右键-属性 > 高级系统设置 > 环境变量。双击 Path 项进入编辑页,选择新建,将 路径C:\ffmpeg\bin 粘贴至输入框后确定保存。(点击放大)

二、FFmpeg快速使用
如果不是影音专业需求户,可以只看这一部分FFmpeg的常用操作,后面的更为复杂的操作可“按需观看”。

2.1 转换格式
FFmpeg转换格式最简单最常用的一个命令就是:

ffmpeg -i input.xxx output.xxx
mp4和flv格式转换,命令如下:

ffmpeg -i input.flv output.mp4
#或者
ffmpeg -i input.mp4 output.flv
mp4和webm格式转换,命令如下:

ffmpeg -i input.mp4 output.webm
#或者
ffmpeg -i input.webm output.mp4

2.2 压缩视频
FFmpeg压缩视频的命令如下:

ffmpeg -i input.mp4 -r 10 -b:a 32k output.mp4 #对它降低fps和音频码率的方法大大压缩文件大小,而清晰度不变。
#或者
ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4 #采用H.264视频压缩算法和AAC音频压缩算法,视频帧率10fps,音频码率32k
#或者是
ffmpeg -i wzfou.mp4 -crf 20 wzfou.mp4
ffmpeg -i wzfou1.flv -crf 20 wzfou1.mp4
ffmpeg -i wzfou1.mp4 -crf 30 wzfou30.mp4
ffmpeg -i 480p.mp4 480p.webm

2.3 转换gif
把视频转换为gif,命令如下:
#把视频的前 30 帧转换成一个 Gif
ffmpeg -i input_video.mp4 -vframes 30 -y -f gif output.gif

#将视频转成 gif 将输入的文件从 (-ss) 设定的时间开始以 10 帧频率,输出到 320x240 大小的 gif 中,时间长度为 -t 设定的参数。
ffmpeg -ss 00:00:00.000 -i input.mp4 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif

三、FFmpeg视频操作
FFmpeg的命令参数如下:


相关说明:
-crt: 这个选项会直接影响到输出视频的码率,当设置了这个参数之后,再设置-b指定码率不会生效,crt的取值范围是0-50,0为无失真编码,建议18-28。

-preset: 指定编码的配置,x264提供了一些预设值,而这些预设值可以通过preset指定。preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。

执行完一条转码命令之后,调整-crf参数值,分别设为19、20、28、51,重新转码输出为不同的MP4文件。记录数据,对比如下:

源                文件大小      缩减比率
crf = 18       46.3              21%
crf = 19       36.7              33%
crf = 20       31.2              43%
crf = 28       26.5              83%
crf = 51       1.25              97%

3.1 指定转换格式
一般FFmpeg会根据文件格式选择最合适的容器格式与编码格式,也可以手动指定。例如:

ffmpeg -i out.ogv -vcodec h264 out.mp4
ffmpeg -i out.ogv -vcodec mpeg4 out.mp4
ffmpeg -i out.ogv -vcodec libxvid out.mp4
ffmpeg -i out.mp4 -vcodec wmv1 out.wmv
ffmpeg -i out.mp4 -vcodec wmv2 out.wmv
-i 后面是输入文件名。-vcodec 后面是编码格式,h264 最佳,但 Windows 系统默认不安装。如果是要插入 ppt 的视频,选择 wmv1 或 wmv2 是最合适了。

另外还有附加选项:-r 指定帧率,-s 指定分辨率,-b 指定比特率;于此同时可以对声道进行转码,-acodec 指定音频编码,-ab 指定音频比特率,-ac 指定声道数,例如:

ffmpeg -i out.ogv -s 640x480 -b 500k -vcodec h264 -r 29.97 -acodec libfaac -ab 48k -ac 2 out.mp4
原样转换格式,即保持原来的视频和音频编码格式,命令如下:

ffmpeg -i input.flv -vcodec copy -acodec copy out.mp4 #-vcodec copy 和 -acodec copy 表示所使用的视频和音频编码格式,为原样拷贝。
3.2 合并MP4视频
FFmpeg可以将多个视频合并,mp4的合并最好是先转成无损质量的ts,再合并。命令如下:

ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
3.3 更改分辨率大小
如果想要调整视频的分辨率,可以使用以下命令:

ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4
# or
ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4
如果要调整视频的宽高比,可以使用以下命令:

ffmpeg -i input.mp4 -aspect 16:9 output.mp4
#常见的宽高比:16:9、4:3、16:10、5:4
3.4 转换视频码率
ffmpeg 码率相关的参数主要有 -minrate, maxrate, -b:v,命令如下:

ffmpeg -i input.mp4 -b:v 2000k output.mp4

#把原始视频转换成 2 Mbps 码率视频。ffmpeg 官方建议,在设置 -b:v 时,同时加上 -bufsize 用于设置码率控制缓冲器大小,让整体码率更加趋近于希望的值,减少波动。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4

# -minrate 和 -maxrate 比较简单,设置码率不要低于或者超过某一个阈值
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
3.5 剪辑和裁剪视频
想要改变截取部分视频或者保留某一部分视频,命令如下:

ffmpeg -i a.mov -ss 00:00:21 -t 00:00:10 -acodec aac -vcodec h264 -strict -2 out.mp4
#其中 -ss 00:00:21 表示开始剪辑的位置(时间点),-t 00:00:10 表示剪辑的长度,即 10 秒钟

ffmpeg -i a.mov -strict -2 -vf crop=1080:1080:0:420 out.mp4
#将竖向的视频 1080 x 1920,保留中间 1080×1080 部分,其中的 crop=1080:1080:0:420 才裁剪参数,具体含义是 crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸,x:y 表示裁剪区域的左上角坐标。比如当前这个示例,我们只需要保留竖向视频的中间部分,所以 x 不用偏移,故传入0,而 y 则需要向下偏移:(1920 – 1080) / 2 = 420
四、图片操作
4.1 合并图片为视频
首先,将你要合并的图片放在一个文件夹当中,然后重命名为:img001.png, img002.png, img003.png, 这样。

FFmpeg合并图片

最后执行合并图片为视频的命令:

ffmpeg -framerate 24 -i img%03d.png output.mp4
#或者
ffmpeg -r 0.5 -i  img%03d.jpg  video.avi
4.2 图片与视频转换
命令如下:

#将图片序列合成视频
ffmpeg -f image2 -i image%d.jpg video.mpg

#将视频分解成图片序列
ffmpeg -i video.mpg image%d.jpg

#截取一张352x240尺寸大小的,格式为jpg的图片:
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

#把视频的前30帧转换成一个Animated Gif :
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

#在视频的第8.01秒处截取 352*240 的缩略图
ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
ffmpeg -r 0.5 -i d:/tmpImg/image%04d.jpg -i d:/time.mp3 -vcodec mpeg4 d:/video5.avi
五、FFmpeg常用命令
以下是ffmpeg格式转换、压缩视频、合并和切割视频等常用命令:

# 去掉视频中的音频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝

# 提取视频中的音频
ffmpeg -i input.mp4 -acodec copy -vn output.mp3
// -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝

# 音视频合成
ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
// -y 覆盖输出文件

#剪切视频
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
// -ss 开始时间; -t 持续时间

#视频截图
ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
// -s 设置分辨率; -f 强迫采用格式fmt;

# 视频分解为图片
ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg
// -r 指定截屏频率

# 将图片合成视频
ffmpeg -f image2 -i image%d.jpg output.mp4

#视频拼接
ffmpeg -f concat -i filelist.txt -c copy output.mp4

#将视频转为gif
ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
// -pix_fmt 指定编码

#将视频前30帧转为gif
ffmpeg -i input.mp4 -vframes 30 -f gif output.gif

#旋转视频
ffmpeg -i input.mp4 -vf rotate=PI/2 output.mp4

#缩放视频
ffmpeg -i input.mp4 -vf scale=iw/2:-1 output.mp4
// iw 是输入的宽度, iw/2就是一半;-1 为保持宽高比

#视频变速
ffmpeg -i input.mp4 -filter:v setpts=0.5*PTS output.mp4

#音频变速
ffmpeg -i input.mp3 -filter:a atempo=2.0 output.mp3

#音视频同时变速,但是音视频为互倒关系
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4


# 视频添加水印
ffmpeg -i input.mp4 -i logo.jpg -filter_complex [0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map 0:a -codec:a copy output.mp4
// main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距;

# 截取视频局部
ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4

# 截取部分视频,从[80,60]的位置开始,截取宽200,高100的视频
ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4

# 截取右下角的四分之一
ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4

# 截去底部40像素高度
ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4


总结
FFmpeg是一个格式转化的神器,虽然没有客户端使用方便,但是只要掌握了几个基本的命令就足以完成MP4、FLV、Gif、WebP等格式的转换和体积压缩,Windows和Linux平台通用。

同时,FFmpeg也适合专业用户使用,如果对视频、音频等格式有指定的要求,可以参考FFmpeg的官方参数,只需要在转换格式和压缩视频中添加几个参数即可,转换和压缩速度非常快。
-------------------------
 

写在前面

本教程的目的是展示并教学广义上“压制”的工作。这些工作所涉及的工具非常众多且步骤繁琐,所需要的知识点也非常分散,所以教程的章节构成会比较随意,在阅读一些章节时,可能需要同时参考其他章节一并学习。笔者希望尽量以简单易懂的方法来叙述教程的每一部分,但是由于表达水平有限,语句不通等丢人问题还请包涵,希望读者能够多多见谅。

本文受到guide.encode.moe的启发并借鉴了其一定思路,但更多的希望专精于压制方面,更详细的阐述视频处理方面的内容。

由于AVS已经十分古老,使用的必要性也已经极其有限,所以本教程主要使用Vapoursynth作为视频处理工具并且主要在Windows平台下进行示例(你既然都用OS X/Linux了,那……)。

from https://github.com/pwinner/Mystery-Encoding-Guide

-----

使用ffmpeg无损剪切视频


在上传视频时,发现上传提示视频文件过大,这时我们可以使用ffmpeg命令行来直接对视频做无损分割。

Bash
ffmpeg -y -ss START -t DURATION -i INPUT -c copy OUTPUT

示例

Bash
ffmpeg -y -ss 0:1:20 -t 0:0:30 -i input.avi -c copy output.avi

对上面涉及到的参数进行解释:


-y 覆盖已经存在的文件;

-ss 开始时间,如: 00:1:20,表示从1分20秒开始;

-t 时长,如: 00:00:20,表示截取20秒长的视频;

-i 输入,后面是空格,紧跟着就是输入视频文件;

-c copy,拷贝所有流;

INPUT,输入视频文件;

OUTPUT,输出视频文件;

-------------------

利用ffmpeg将图片和音频拼接成视频


ffmpeg -loop 1 -i 86074442_p0.jpg -i "1.wav" -acodec aac -c:v h264_nvenc -ab 2822k -shortest -s 1280*720 result.mp4

参数解释:

86074442_p0.jpg - 图片文件名

wav - 音频文件名(如果已经aac编码可以直接copy,这里因为是从无损编码过来的)

-c:v h264_nvenc - 视频编码器(开启N卡硬件加速,h265可选hevc_nvenc)

-acodec aac - 音频编码器

-ab 2822k - 音频码率,目前看来好像不能到这么高

-shortest - 截断

-s 1280*720 - 输出分辨率

result.mp4 - 输出文件

 
--------

使用ffmpeg进行视频格式转换

今天用别人的脚本在bilibili上面下载了个视频,发现时flv格式的,我博客对flv格式支持不是很好,于是就想转换一下视频格式百度了一下,无意中看到了ffmpeg,以前听别人说过这个工具,听说特别强大,于是就了解了一下ffmpeg,发现真的超级好用!

FFmpeg是一个多媒体视频处理工具,有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。我在ffmpeg官网下载了mac版的dmg安装包,直接就安装好了,环境都不用自己添加了,挺方便的。

我只用到了视频转换功能 -i 后面跟你要转换的视频文件,接着后面自定义输出文件名和格式

1
ffmpeg -i input.flv  output.mp4

这个工具还有其他很强大的功能,我在网上搜集了一点常用的功能和命令,在此记录,以便以后方便查找使用

主要命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
主要命令:
ffmpeg \[input\_file\_options\] -i input\_file \[output\_file\_options\] output\_file
注意: "-i input_file" 表示输入的文件或设备.
输入文件或设备相关的配置必须在"-i input_file"前设定, 在之后写的是用于输出文件的配置.

ffmpeg -version //查看ffmpeg版本号,并编译时配置

ffmpeg -formats //Show available formats (including devices).

ffmpeg -devices //Show available devices.

ffmpeg -codecs //Show all codecs known to libavcodec.

ffmpeg -decoders //Show available decoders.

ffmpeg -encoders //Show all available encoders.

ffmpeg -protocols //Show available protocols.

ffmpeg -pix_fmts //Show available pixel formats.
 
参数选项
----

参数选项:

-f 用于指定文件格式. 可用"ffmpeg -formats"是看能支持的文件格式

-i 用于指定输入文件或设备名

-y 用于不用确认直接替换存在的输出文件

-t 用于指定输入或输出文件的持续时间.

-ss 用于指定视频文件从什么时间开始

-to 用于指定视频文件在什么时间结束

-vframes number 用于指定输出多少帧数据到输出文件

-framerate number 用于指定输入文件或设备的帧率

-r 用于指定输入或输出文件的帧率,多少帧每秒(fps)
// -re 是指按播放的速度来读取输入帧数据并传输

-s和-video\_size 用于指定图像的分辨率, 如"-video\_size 640x480"
// -video_size 只能用于指定输入文件或设备的分辨率, -s可用于指定输入和输出

-aspect 用于指定图像比例. "4:3", "16:9"

-vn 用于指定没有视频图像输出.

-vcodec codec 用于指定输出文件使用什么编码格式. "-vcodec copy"表示使用原文件的编码格式, "-vcodec h264"表示使用h264编码

-pix\_fmt 用于指定输入或输出的图像像素格式。可用"ffmpeg -pix\_fmts"查看支持的像素格式.

-an 用于指定没有声音数据输出

-acodec codec 指定使用的声音编解码器

-b 100k 用于指定输出视频文件的码率为100k, 数字越大越清晰.
-b:v 可用于指定视频的码率
-b:a 可用于指定音频的码率

常用功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
1. 视频文件简单转换成另一个格式的视频文件, 会默认使用H264编码格式输出视频文件.
ffmpeg -i input.avi output.mkv

2. 把一个视频文件my.avi和一个声音文件my.mp3合并成一个音视频文件my.mkv
ffmpeg –i my.avi –i my.mp3 –vcodec copy –acodec copy my.mkv


3. 把音视频文件my.mkv里的声音数据去掉生成只有图像的my.avi文件, 并使用h264编码
ffmpeg -i my.mkv -vcodec h264 -an my.avi

4. 把音视频文件my.mkv里的图像数据去掉生成只有声音的my.aac文件, 并使用aac编码
ffmpeg -i my.mkv -acodec aac -vn my.aac

5. 把多个图像文件使用h264编码封装成avi文件,如有my0.jpg, my1.jpg ... my99.jpg
ffmpeg -i my%d.jpg -vcodec h264 my.avi

6. 指定音视频文件把1分30秒到5分20秒的内容输出到另一个文件
ffmpeg -ss 00:01:30 -i my.avi -to 00:05:20 -vcodec copy -acodec copy my.mkv

7. 把视频文件里内容输出成多张图像
ffmpeg -i my2.avi -r 1 -f image2 my%d.jpg

只输出一张图像
ffmpeg -i my2.avi -r 1 -f image2 -t 0.0001 my%d.jpg

8. 从音视频文件里生成yuyv422格式的数据
ffmpeg -i 99bear.mp4 -r 1 -f rawvideo -pix_fmt yuyv422 my.yuyv

//yuv数据可用ffplay来播放
ffplay -f rawvideo -video\_size 640x480 -pixel\_format yuyv422 my.yuyv


9. 改变原视频文件的分辨率大小为640x480, 使用h264编码, 声音使用aac编码, 并指定视频输出的码率为100k.
ffmpeg -i 78.flv -vcodec h264 -acodec aac -s 640x480 -b:v 100k 78.avi

10. 指定把视频文件里在第500秒开始30帧图像数据保存为gif, 指定一秒2张图像的速率
ffmpeg -ss 500 -r 2 -i 99bear.mp4 -vframes 30 my.gif


11. 合并多个同格式的视频文件. 如把"1.flv 2.flv 3.flv"三个文件合并为my.avi
先创建一个文本文件files.txt, 里面记录要合并的文件名:
files.txt:
file '1.flv'
file '2.flv'
file '3.flv'
然后:
ffmpeg -f concat -i files.txt -vcodec copy -acodec copy my.avi


12. 视频文件增加logo.
ffmpeg -i God.rm -i logo.png -filter_complex overlay my.avi

指定logo的位置, overlay=logo在视频里开始显示的x坐标:y坐标. 可以用变量W/w, H/h来表示, W表示视频图像的宽度 H表示视频图像的高度, w表示logo的宽度, h表示logo的高度

如右下角: ffmpeg -i God.rm -i logo.png -filter_complex overlay=W-w:H-h my.avi
如居中: ffmpeg -i God.rm -i logo.png -filter_complex overlay=W/2-w/2:H/2-h/2 my.avi


13. 操作摄像头.
查看摄像头所支持的数据格式及分辨率:
ffmpeg -f v4l2 -list_formats all -i /dev/video0

录制10秒摄像头里的内容, 并指定帧率为10和使用h264编码:
ffmpeg -t 10 -f v4l2 -r 10 -i /dev/video0 -vcodec h264 ./a.avi

录制摄像头的内容为gif,并指定分辨率及帧率:
ffmpeg -f v4l2 -video_size 320x240 -r 2 -i /dev/video0 o.gif


14. 操作声卡, 录音10秒并使用aac编码:
ffmpeg -t 10 -f alsa -i default -acodec aac my.aac

录音10秒保存为wav文件:
ffmpeg -t 10 -f alsa -i default my.wav

15. 录屏,指定录制的分辨率及帧率, 并使用h264编码:
ffmpeg -f x11grab -video_size 1024x768 -r 10 -i :0 -vcodec h264 ./a.avi

录屏,并指定从屏幕的坐标10:20开始区域录制:
ffmpeg -f x11grab -video_size 800x600 -r 5 -i :0.0+10,20 -vcodec h264 ./b.avi

录屏并录制声音:
ffmpeg -f x11grab -r 5 -i :0 -f alsa -i default -vcodec h264 -acodec aac my.avi
16. 视频倍速转换输出:
ffmpeg -i input.mov -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2[a]" -map "[v]" -map "[a]" output.mp4
其中atempo=`2`[a],setpts=`0.5`*PTS[v],是2倍速输出.

-------------------------------

利用FFMPEG进行简单的视频剪辑与转码


安装

Ubuntu

sudo apt install ffmpeg

Windows

下载 FFMPEG 安装包,并将安装目录内 bin 文件夹添加到系统 PATH

转码

简单命令:

ffmpeg -i original.mp4 -c:v h264 output.mp4 # 转码为 h264 编码
ffmpeg -i original.mp4 output.gif # 转换为 gif

ffmpeg -i original.mp4 -s 640x480 -vframes 90 -r 29.97 -c:v h264 -b:v 500k -b:a 48k -ac 2 output.mp4 # 多参数

参数:

  • -i 参数为输入文件
  • -s 指定分辨率
  • -r 指定帧率
  • -c:v 或 -vcodec 参数为输出编码 可以省略,如果插入PPT最好输出为 gif 可选项 mpeg4 libxvid 等
  • -c:a 或 -acodec 指定音频编码
  • -b:v 指定视频比特率
  • -b:a 或 -ab 指定音频比特率
  • -ac 指定声道数

如果对这些指标没有特殊要求,不需要手动指定参数

调整播放速度

加速/减速视频

ffmpeg -i original.mp4 -filter:v "setpts=0.25*PTS" output_v_fast.mp4 # 加速四倍
ffmpeg -i original.mp4 -filter:v "setpts=4*PTS" output_v_slow.mp4 # 减速四倍

参数:

  • --filter:v 或 -vf 指定一个视频过滤器

通过以上方法加速得到的视频,视频时长不变,前面部分为原视频加速后结果,之后画面保持最后一帧直至结束,因为音频还是原来的长度

通过以上方法减速得到的视频,视频长度相应延长,帧率不变。

视频加速时为了避免丢帧,可以尝试将目标文件的FPS依据源文件的FPS相应提高,以保留原始视频所有帧。比如加速一个60FPS的源文件4倍,则将目标文件的FPS设置为240。不过视频减速则没有什么好的方法 加速后视频后面部分为同一帧画面问题依然存在

ffmpeg -i original.mp4 -filter:v "setpts=0.25*PTS" -r 120 output_fast.mp4 # 加速四倍

加速/减速音频

ffmpeg -i original.mp4 -filter:a "atempo=2.0" output_a_fast.mp4 # 加速2倍
ffmpeg -i original.mp4 -filter:a "atempo=0.5" output_a_slov.mp4 # 减速2倍

ffmpeg -i original.mp4 -filter:a "atempo=2.0" -vn output_a_fast.mp4 # 只保留音频

参数:

  • vn video negative 不保留视频
  • an 不保留音频

注意视频加速时参数小于1而音频加速时参数大于1,另外对于音频的加速减速倍数限制在0.5-2.0以内,不过可以通过叠加过滤器的方式突破这一限制。

同时加速/减速视频和音频

单纯加速/减速音视频中的一个会导致视频文件音视频时间戳长度不一产生错误,所以最好将音视频的加减速统一起来。

同时加速视频和音频

ffmpeg -i original.mp4 -r 240 -filter:v "setpts=0.25*PTS" -filter:a "atempo=2.0, atempo=2.0" output_fast.mp4 # 直接叠加过滤器

ffmpeg -i original.mp4 -filter_complex "[0:v]setpts=0.25*PTS[v];[0:a]atempo=2.0,atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4 # 使用复合过滤器

截取视频

初级代码

# 按时间长度截取
ffmpeg -i original.mp4 -ss 00:00:00.0 -t 00:00:10.0 -c copy output_trim.mp4 # 精确时间格式
ffmpeg -i original.mp4 -ss 0 -t 10 -c copy output_trim.mp4 # 只使用秒

ffmpeg -ss 0 -t 10 -i original.mp4 -c copy output_trim.mp4 # 使用关键帧

# 按开始结束截取
ffmpeg -ss 0 -to 10 -i original.mp4 -c copy output_trim.mp4

参数:

  • -c 编码 同 -codec
  • -c copy 复制原视频编码

ffmpeg 为了加速,会使用关键帧技术, 所以有时剪切出来的结果在起止时间上未必完全准确。 把 -i 放在 -ss 之前,不使用关键帧技术,把 -i 放在 -ss 后,使用关键帧技术。

以上简单的截取方式,如果使用关键帧,则截取出的视频长度无法控制,会多出几秒;如果不适用关键帧,视频会出现一小段时间只显示某一帧画面的情况。

这种方法,不需要重新编码,速度较快。

进阶代码

ffmpeg -ss 5 -t 10 -accurate_seek -i original.mp4 -c copy -avoid_negative_ts 1 output_trim.mp4 # 使用关键帧

ffmpeg -accurate_seek -i original.mp4 -ss 5 -t 10 -c copy -avoid_negative_ts 1 output_trim.mp4 # 不使用关键帧

使用关键帧可以正常截取,但会出现多出一小段视频,不使用关键帧,视频开头存在几秒定格画面。

进进阶代码

FFMPEG 转码时时间是精确的,所以借助转码截取视频。

ffmpeg -ss 5 -t 10 -accurate_seek -i original.mp4 -c:v h264 -c:a copy -avoid_negative_ts 1 -strict experimental output_trim.mp4 # 使用关键帧

ffmpeg -accurate_seek -i original.mp4 -ss 5 -t 10 -c:v h264 -c:a copy -avoid_negative_ts 1 -strict experimental output_trim.mp4 # 不使用关键帧

使用关键帧,视频时长依旧不准确。不使用关键帧效果更好,时长准确,播放完美。

总结

使用转码进行视频截取,不要使用关键帧,亲测效果很好。

ffmpeg -accurate_seek -i original.mp4 -ss 5 -t 10 -c:v h264 -c:a copy -avoid_negative_ts 1 -strict experimental output_trim.mp4 # 不使用关键帧

合并视频

按文件列表合并

先创建一个文本文件filelist.txt:

file '1.mp4'
file '2.mp4'

之后合并

ffmpeg -f concat -i filelist.txt -c copy concat.mp4

转换为中间格式之后合并

ffmpeg -i original.mp4 -qscale:v 1 intermediate1.mpg
ffmpeg -i original.mp4 -qscale:v 1 intermediate2.mpg
ffmpeg -i "concat:intermediate1.mpg|intermediate2.mpg" -c copy concat.mpg
ffmpeg -i concat.mpg -qscale:v 1 concat.mp4

参数:

  • -qscale:v 视频质量,可省略

Tips

查看视频信息

ffmpeg -i original.mp4

播放视频

ffplay original.mp4

从视频提取图片

ffmpeg -i original.mp4 -r 1 -f image2 image-%2d.png # 每秒 1 张

裁切画面

ffmpeg -i original.mp4 -filter:v "crop=200:200:50:50" croped.mp4

参数:

  • -filter:v "crop=w:h:x:y" 宽度,高度,画面左上角坐标

参考:

------------------------- 

ffmpeg - macOS 平台编译完成版

FFmpeg 是开源的音视频工具,其官网只提供源代码,本文提供已编译的 macOS 平台二进制文件下载。

关于

本文中的文件由 https://evermeet.cx/ffmpeg/ 提供,文件由下面命令编译而成:

configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
-------------------

Streaming dynamic playlist simply using FFMpeg.

ffplaylist

Streaming dynamic playlist simply using FFMpeg.

For example, you have a directory containing audio files. You want to stream it to some server.

python3 random_files.py 'music/*.m4a' | python3 ffplaylist.py -vv -p -- -vn -c:a copy -content_type audio/aac -password hackme icecast://10.0.0.2:9000/music.aac
usage: ffplaylist.py [-h] [-e FFMPEG] [-v] [-p] ...

FFMpeg dynamic playlist input. Feed stdin with your list of media files.

positional arguments:
  args                  ffmpeg output arguments

optional arguments:
  -h, --help            show this help message and exit
  -e FFMPEG, --ffmpeg FFMPEG
                        ffmpeg/avconv executable, can be set using FFMPEG
                        environment variable
  -v, --verbose         verbosity level. -v prints filename, -vv shows ffmpeg
                        output.
  -p, --progress        show progress bar.
from  https://github.com/gumblex/ffplaylist
-------------------------

在Mac OS X下,用ffmpeg把mpeg转换成mp3 

要将几个mpeg文件转换成mp3, 试了一大轮freeware/shareware/open source软件之后发现ffmpeg最简单,命令行一行搞定:
ffmpeg -i video1.mpeg video1.mp3

因为是在Mac OS X下(LD的MacBook)安装ffmpeg有点麻烦,如果没装MacPorts可以采用先安装ffmpegX的“曲线救国”方式, 安装完之后可以在/Applications/ffmpegX.app/Contents/Resources/ffmpeg找到ffmpeg命令。

windows version下载地址:

https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip

 

 

No comments:

Post a Comment