【FFmpeg】Ffmpeg音视频转换神器讲解

admin / Tools / / 2399 字 · 约 16 分钟 / 579 次阅读 /
📑 文章章节大纲 (点击平滑直达)

音视频格式转换工具 FFmpeg 介绍 (将 file.avi 转换成 output.flv) ffmpeg -i file.avi output.flv -i 表示输入文件 现在有个视频 video.avi,有个音频 audio.mp3,将其合并成 output.avi

两个命令 ( video2.avi 是中间文件 ,用完可删)

ffpeg -i video.avi -vcodec copy -an video2.avi
ffmpeg -i video2.avi -i audio.mp3 -vcodec copy -acodec copy output.avi
-i 表示输入文件
-vcodec copy 表示 force video codec (‘copy’ to copy stream) 这个不知怎么译 ,估计是直接copy
-acodec copy 这个说的应该是音频了 跟上面一样
-an : 表示 disable audio 估计是audio no 之类的缩写 表示去掉video.avi 原有的音频

方法 2 好像可以直接指定两个输入文件 ,

ffmpeg -i /tmp/a.wav -i /tmp/a.avi /tmp/a.avi 两个文件 的顺序很重

从视频里提取声音(声音与视频的分离)

ffmpeg  -i 人生若只如初见.flv  -vn r.mp3  从flv 文件 中提取声音并保存为mp3 格式

-vn : 表示忽略视频 估计是 video no 之类的缩写

ffmpeg  -i 人生若只如初见.flv  -an  r.flv   只留视频不留声音

-an : 表示忽略声音估计是 audio no 之类的缩写 从视频里提取图片( )

ffmpeg -i test.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 test.jpg
-ss 第8秒处 截一图

压缩 mp3 文件 如果你觉得 mp3 文件 有点大,想变小一点那么可以通过 -ab 选项改变音频的比特率(bitrate)

ffmpeg -i input.mp3 -ab 128 output.mp3   //这里将比特率设为128

你可以用 file 命令查看一下源文件 的信息

file z.mp3
z.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, Stereo

其中的 192 kbps 就是这个东西

mp3 中比特率的含义是:在压缩音频文件至 mp3 时,由压缩软件所确定数码文件在播放时每秒传送给播放器大小,其单位是:千位/秒;英文的含义是:kbps - = kilobits per second。现在 mp3 文件的最高数位率是 320 kbps。这样的文件体积很大,每分钟的音乐超过两兆字节。如果采用可变比特率(VBR)编码来生成 mp3 文件,获得与 320 kbps 相当音质,文件的体积会缩小 25~50%。请注意:播放时间相同,而歌曲不同,所获的压缩 mp3 文件的一般不相同,这是因为 VBR 编码所生成的 mp3 文件的大小不仅仅取决于播放时间的长度,还取决于源音频文件的其它因素。

录音(要有可用的麦克风,并且如果用 alsa 的话,好像得安 alsa-oss,重启)

ffmpeg  -f oss -i /dev/dsp   out.avi  (should  hava oss or alsa-oss)
ffmpeg   -f  alsa -ac 2 -i hw:0,0  out.avi   (should )
ffmpeg   -f alsa -ac 2 -i pulse  (should hava PulseAudio)

oss 是 linux 下的声音相关的东西,与 alsa 一样,不过 oss 是商业的, 而/dev/dsp 是 oss 用到的麦克的设备吧,可以这样理解 屏幕录像

ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi
ffmpeg -f x11grab  **-s 320x240** -r 10 -i :0.0+100+200 wheer.avi

0 表示屏幕(个人理解,因为系统变量$DISPLAY 值就是:0.0) 而 100,表示距左端 100 象素,200 表示距上端 200 -s 设置窗口大小 -r 10 好像是设置频率,不懂

ffmpeg -f x11grab -s xga-qscale 5   -r 10 -i :0.0+0+0 wheer.avi

-qscale 8 设定画面质量,值 越小越好 屏幕录像,同时录音

ffmpeg -f oss -i /dev/dsp        -f x11grab -r 30 -s 1024x768 -i :0.0  output.mkv

ffmpeg    -ac 2 -f oss  -i  /dev/dsp   -f x11grab -r 30 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv

看到这,你会发现这个命令有多强大, 如果我屏幕上打开了一个窗口,我只想录这个窗口的内容,如何确定这个窗口的坐标位置呢 可以用另外一个命令 xwininfo 输入这个命令后,用鼠标点选目标窗口, 就会出现目标窗口的坐标,宽高等一系列信息

Absolute upper-left X:  276
 Absolute upper-left Y:  57
 Relative upper-left X:  2
 Relative upper-left Y:  23
 Width: 742
 Height: 499
 Depth: 24
 Visual: 0x21
 Visual Class: TrueColor
 Border width: 0
 Class: InputOutput
 Colormap: 0x20 (installed)
 Bit Gravity State: NorthWestGravity
 Window Gravity State: NorthWestGravity
 Backing Store State: NotUseful
 Save Under State: no
 Map State: IsViewable
 Override Redirect State: no
 Corners:  +276+57  -262+57  -262-244  +276-244
 -geometry 80x24+274+34 看到这一行了没 ()

比如根据上面的信息

ffmpeg -f oss  -i  /dev/dsp      -f  x11grab -r 30  -s 1280x752 -i :0.0+0+23  output.avi
Another thing you can change is the video frame rate (FPS). In the example above we used -r 30 which means capture at 30 FPS. You can change this value to whatever frame rate you want.

这个 -r 30 应该是每秒钟取样几次,估计是一秒截三十次屏, 切头去尾

ffmpeg -ss 00:00:10 -t 00:01:22 -i 五月天-突然好想你.mp3  output.mp3

只要 从第 10 秒开始截取,共截取 1:22 时长的内容 视频文件的连接,如两个 flv 文件 连接成一 好像必须先将文件 转成 mpg ,dv 等格式的文件后才能进行连接 - 连接复数的 AVI 影片档之范例(在此范例中须一度暂时将 AVI 档转换成 MPEG-1 档(MPEG-1, MPEG-2 PS, DV 格式亦可连接))

ffmpeg -i input1.avi -sameq inputfile_01.mpg -r 20
ffmpeg -i input2.avi -sameq inputfile_02.mpg  -r 20
cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg
ffmpeg -i inputfile_all.mpg -sameq outputfile.avi上面将  input1.avi    input2.avi 合并成outputfile.avi-sameq  表示  相同的质量(可能指的是画面,不太清楚)
-r 指频率

参数

FFmpeg 可使用众多参数,参数内容会根据 ffmpeg 版本而有差异,使用前建议先参考参数及编解码器的叙述。此外,参数明细可用 ffmpeg -h 显示;编解码器名称等明细可用 ffmpeg -formats 显示。 下列为较常使用的参数。

主要参数

  • -i 设定输入档名。
  • -f 设定输出格式。
  • -y 若输出档案已存在时则覆盖档案。
  • -fs 超过指定的档案大小时则结束转换。
  • -ss 从指定时间开始转换。
  • -title 设定标题。
  • -timestamp 设定时间戳。
  • -vsync 增减 Frame 使影音同步。

影像参数

  • -b 设定影像流量,默认为 200Kbit/秒。( 单位请参照下方注意事项
  • -r 设定 FrameRate 值,默认为 25。
  • -s 设定画面的宽与高。
  • -aspect 设定画面的比例。
  • -vn 不处理影像,于仅针对声音做处理时使用。
  • -vcodec 设定影像影像编解码器,未设定时则使用与输入档案相同之编解码器。

声音参数

  • -ab 设定每 Channel(最近的 SVN 版为所有 Channel 的总合)的流量。( 单位请参照下方注意事项
  • -ar 设定采样率。
  • -ac 设定声音的 Channel 数。
  • -acodec 设定声音编解码器,未设定时与影像相同,使用与输入档案相同之编解码器。
  • -an 不处理声音,于仅针对影像做处理时使用。
  • -vol 设定音量大小,256 为标准音量。(要设定成两倍音量时则输入 512,依此类推。)

注意事项

  • 以-b 及 ab 参数设定流量时,根据使用的 ffmpeg 版本,须注意单位会有 kbits/sec 与 bits/sec 的不同。(可用 ffmpeg -h 显示说明来确认单位。)
  • 以-acodec 及-vcodec 所指定的编解码器名称,会根据使用的 ffmpeg 版本而有所不同。例如使用 AAC 编解码器时,会有输入 aac 与 libfaac 的情况。此外,编解码器有分为仅供解码时使用与仅供编码时使用,因此一定要利用 ffmpeg -formats 确认输入的编解码器是否能运作。

范例

  • 将 MPEG-1 影片转换成 MPEG-4 格式之范例
ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4
  • 将 MP3 声音转换成 MPEG-4 格式之范例
ffmpeg -i inputfile.mp3 -f mp4 -acodec libaac -vn -ab 64k outputfile.mp4
  • 将 DVD 的 VOB 档转换成 VideoCD 格式的 MPEG-1 档之范例
ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpg
  • 将 AVI 影片转换成 H.264 格式的 M4V 档之范例
  • ffmpeg -i inputfile.avi -f mp4 -acodec libfaac -vcodec libx264 -b 512k -ab 320k outputfile.m4v
  • 将任何影片转换成东芝 REGZA 可辨识的 MPEG2 格式之范例
  • ffmpeg -i inputfile -target ntsc-svcd -ab 128k -aspect 4:3 -s 720x480 outputfile.mpg
  • 连接复数的 AVI 影片档之范例(在此范例中须一度暂时将 AVI 档转换成 MPEG-1 档(MPEG-1, MPEG-2 PS
DV格式亦可连接
ffmpeg -i input1.avi -sameq inputfile_01.mpg
ffmpeg -i input2.avi -sameq inputfile_02.mpg
cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg
ffmpeg -i inputfile_all.mpg -sameq outputfile.avi
http://ffmpeg.org/ffmpeg-doc.html
http://ubuntuforums.org/showthread.php?t=1392026
同时搞明白的一些问题
在alsa 体系中声卡(也可能是麦克风,)叫hw:0,0 而在oss 体系中叫/dev/dsp (用词可能不太专业) Linux在安装了声卡后,会有一些设备文件生成。
采集数字样本的
/dev/dsp文件,针对混音器的
/dev/mixer文件,用于音序器的
/dev/sequencer,
/dev/audio文件一个
基于兼容性考虑的声音设备文件。只要向
/dev/audio中输入
wav文件就能发出声音。而对
/dev/dsp文件读取就能得到
WAV文件格式的声音文
admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。