使用ffmpeg

-- TOC --

ffmpeg工具包含3个主要的bin文件,ffmpeg,ffplay和ffprobe!

FFmpeg被描述为多媒体的瑞士军刀。它集成了数百个视频、音频和图像解码器和编码器、多路复用器和解复用器、过滤器和设备。FFmpeg是第一个在其细分市场上完全消除了专有软件的大规模FOSS项目。几乎所有的多媒体相关公司都依靠FFmpeg来完成他们的工作。在多媒体方面,FFmpeg几乎是所有问题的解决方案。如果它不是,你更有可能去修补FFmpeg,而不是去开发新的东西。顺便说一句,FFmpeg 的创始人 Fabrice Bellard 也是 QEMU 的创始人。(开源垄断)

ffmpeg

$ ffmpeg -h
$ ffmpeg -codecs    # show all available codecs
$ ffmpeg -hwaccels  # show hardware acceleration methods
$ ffmpeg -h encoder=libx264
$ ffmpeg -h encoder=h264_nvenc

不同的codec,配置参数的写法会有不同。x264没有找到官文文档,可用x264 --fullhelp查看配置。而x265有完善的在线文档。

x264相关资料:

https://trac.ffmpeg.org/wiki/Encode/H.264

http://www.chaneru.com/Roku/HLS/X264_Settings.htm

$ ffmpeg -i fun.mp4 -map 0:0 -ss 00:05:00.0 -t 00:00:02 v2s.mp4

-ss,指定截取开始时间,可精确到毫秒;-t,指定时间长度;-map 0:0,选择第1个输入的0号stream(用ffprobe查看,0对应video,1对应audio)。

ffmpeg -i v2s.mp4 -map 0:0 -c rawvideo -pix_fmt yuv420p v2s.420p.yuv
ffmpeg -i v2s.mp4 -c:v rawvideo -pix_fmt yuv420p v2s2.420p.yuv

-c,codec-c:v,对应输入中默认的video;后面跟 rawvideo,表示转成原始YUV格式;-pix_fmt,像素采样及存储格式;最后是输出文件。以上两个命令等价,后一个使用了ffmpeg的默认选择流机制。

ffmpeg -i bizhi01.jpg -c:v rawvideo -pix_fmt yuv420p bizhi.420p.yuv

-pix_fmt的常用值:yuv420p,yuv422p,yuv444p,gray(没有yuv400p)

ffmpeg -i bizhi01.jpg bizhi.265

bizhi.265的后缀指明了格式,ffmpeg会自动调用x265进行编码,jpg图片自带尺寸信息。一张图片,IDR帧!

ffmpeg -pix_fmt yuv420p -s 1280x720 -i v2s.420p.yuv -c:v libx265 out.265

要指定输入文件的yuv格式和size(-s),输出这个地方有个坑,out.265这个后缀必须要是.265,否则ffmpeg不能判断输出文件格式。?

$ ffmpeg -i input.mp4 -ss 4.5 -vframes 1 output.png
$ ffmpeg -i input.mp4 -ss 4.5 -vframes 10 output_%d.png  # 连续10张图

这里的-ss定位到了秒,-vframes指定截图图片数量。

$ ffmpeg -i input.mp4 -vf fps=1 out_%d.jpg  # 每秒1张
$ ffmpeg -i input.mp4 -vf fps=0.1 out_%d.png  # 每秒0.1张,就是每10秒一张
$ ffmpeg -i input.mp4 -vf fps=10 out_%d.bmp  # 每秒10张

上面这种截图的方法,截出来的图片,与视频的分辨率相同。

$ ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4  # 保持相同宽高比,不会扭曲图像
$ ffmpeg -i input.mp4 -vf scale=3840:2160,setdar=16:9 output.mp4

setdar=16:9设置宽高比,可能会扭曲图像。

ffmpeg -i input.mp3 -acodec pcm_s16le -ac 2 -ar 44100 output.wav

pcm_s16le表示signed 16 bit-depth, little endian

查询所有支持的pcm格式:$ ffmpeg -codecs | grep pcm

-ac 2表示2 channel

-ar 44100表示采样率

转换其它音频格式的文件到wav,也是一样的。

学习:PCM和数字音频

ffmpeg -i input.wav -f s16le -ar 44100 -acodec pcm_s16le output.raw
ffmpeg -f s16le -ar 44100 -ac 2 -acodec pcm_s16le -i input.raw output.wav

ffplay

播放yuv文件有点费劲,必须要指定 -video_size,默认是0x0。默认420p格式,其它格式需要用-pix_fmt指定。

ffplay -f rawvideo -video_size 1280x720 v2s.420p.yuv
ffplay -f rawvideo -video_size 1280x720 -pix_fmt yuv422p bz.yuv

-autoexit设置播放完后自动退出。默认播放完后就停在最后一个画面。

ffplay -autoexit v2s.mp4

可以用-x-y来指定播放尺寸:

ffplay -x 320 -y 240 v2s.mp4

-loop N指定循环播放的次数,-loop 0是无脑死循环:

ffplay -loop 5 v2s.mp4

播放界面快捷键

暂停,重启:p,space

单帧模式:s

鼠标右键的作用:选择播放位置!根据点击位置计算进度百分比,并跳转到那个位置,此时cmd界面会显示 seek to N%.....

全屏:f,或者左键双击。

ffplay -f s16le -ar 44100 -ac 2 test.raw

ffprobe

-show_format,检查媒体文件类型:

$ ffprobe -show_format <filename>

-show_streams

-show_frames

-show_packets,配合-show_data,可以打印每一个packet的raw data:

阅读ffmpeg文档,frame指uncompressed, packet指encoded。

$ ffprobe -show_data -show_packets <filename>
...
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=48000
duration_time=0.040000
size=574
pos=44876
flags=__
data=
00000000: 0000 0001 419a a537 843f c994 c008 5fff  ....A..7.?...._.
00000010: 6e80 e5ef 8efb 29c7 fbc5 6d49 f3d1 3cb3  n.....)...mI..<.
00000020: 43e8 1bee 492a 9762 aac4 f198 a00d faa6  C...I*.b........
00000030: 28e4 aabc 32e5 2bf8 e4ba 46d8 272a 173e  (...2.+...F.'*.>
00000040: b1de f51f bbb3 6fdf ed75 4f2a e79f afab  ......o..uO*....
00000050: 5a5a c95c 3d2a 5f25 6852 5cd9 a3e7 0ce9  ZZ.\=*_%hR\.....
00000060: 9ad0 78af 0efb 64e1 a67f 6015 2725 4a38  ..x...d...`.'%J8
00000070: d9fd 1bd4 42b7 8e84 84b0 9d47 ec07 6a73  ....B......G..js
00000080: 513c 6795 0000 0300 cf70 5586 6ffb 3329  Q<g......pU.o.3)
000000a0: 6362 7079 2f75 8b84 a434 7389 dd52 f1fe  cbpy/u...4s..R..
000000b0: 04c6 4916 6ff8 66ed b6a2 6c89 11e3 de86  ..I.o.f...l.....
000000c0: 7a09 f8d7 37ca 0a09 235a d368 dd5f da4c  z...7...#Z.h._.L
000000d0: f67e 1abf aa45 f2a8 b25b de62 08f3 592a  .~...E...[.b..Y*
000000e0: 652c d97c ee60 3b84 1ca4 521b 1800 de81  e,.|.`;...R.....
000000f0: 460d ffd0 ac04 0753 2b3b 1fad 32c6 da31  F......S+;..2..1
00000100: 9069 f479 9615 05ff fefe 9d99 530d 8dee  .i.y........S...
00000110: 65ec 7f27 b15a 3229 6659 b89d 1c25 5d8c  e..'.Z2)fY...%].
00000120: 446a 87e0 a569 aa0f 5537 bf2a d608 ae8c  Dj...i..U7.*....
00000130: 26fd c25b 549b 601c 2521 8055 ad52 e8c9  &..[T.`.%!.U.R..
00000140: d83f be8b 5633 f010 9457 b459 c299 4c6d  .?..V3...W.Y..Lm
00000150: 2948 82ac e727 c845 22d5 dbb1 ec91 c7fe  )H...'.E".......
00000160: c99c 8a0e c7be 465a 1ac4 b124 80e3 2b49  ......FZ...$..+I
00000170: 01f2 563f 7e47 00b1 1956 c576 d117 6314  ..V?~G...V.v..c.
00000180: 0092 ea3e b8bb 4953 c4d8 aea5 e1a4 884b  ...>..IS.......K
00000190: 06b7 8057 7e84 1ff5 a3bb 6a5a 08f9 1957  ...W~.....jZ...W
000001a0: 7b45 1b46 0380 c817 caff 97dd e348 1de9  {E.F.........H..
000001b0: 6b8d 6831 dc36 4df1 e20d 20e6 7ab0 caa9  k.h1.6M... .z...
000001c0: 1a68 0b6c f457 81b3 ff67 db88 12b4 3efc  .h.l.W...g....>.
000001d0: c718 5a8c b73d e25f a606 a86d ca34 ebe9  ..Z..=._...m.4..
000001e0: f436 eec7 76fe 150b c998 5b96 70f1 48f6  .6..v.....[.p.H.
000001f0: da66 9697 a481 cd2c 0d50 8379 1990 79d9  .f.....,.P.y..y.
00000200: ea9d da0d 9268 8af2 577c 8ebd 79d5 591a  .....h..W|..y.Y.
00000210: 6e0c 9f59 f08a 1d33 3c79 24a8 c144 a59f  n..Y...3<y$..D..
00000220: bc98 663f db09 1a1e d477 ba9e d881 4779  ..f?.....w....Gy
00000230: 4ad2 8bfa 5e19 83ad 5f9c 8165 826e       J...^..._..e.n

[/PACKET]

本文链接:https://cs.pynote.net/ag/202204111/

-- EOF --

-- MORE --