文章目录

  • 1、播放视频
  • 直接播放 `ffplay -i test.mp4`
  • 以特定大小的窗口播放视频 `ffplay -x 640 -y 480 -i test.mp4`
  • 播放视频中的特定片段 `ffplay -i test.mp4 -ss 0:0:0 -t 0:0:5`
  • 全屏播放 `ffplay -fs -i test.mp4 `
  • 倍速播放 `ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2`
  • 播放yuv数据 `ffplay -i test.yuv -pixel_format yuv420p -video_size 352x288`
  • 播放PCM数据 `ffplay -i 44100_2_flt32le.pcm -f f32le -ac 2`
  • 其他ffplay的命令
  • 2、转码视频
  • <font color=#FF0000> 2.1 更改文件的封装格式
  • <font color=#FF0000> 2.2 文件1的视频加文件2的音频合成到一起
  • <font color=#FF0000> 2.2 文件1和文件2按照时间顺序合成到一起
  • <font color=#FF0000> 2.2 多个文件按照时间顺序合成到一起
  • 视频文件转为gif
  • 3 提取YUV数据
  • <font
  • <font color=#FF0000>3.2 提取一帧yuv数据
  • 4 提取PCM数据
  • 5 编码PCM数据


1、播放视频

直接播放 ffplay -i test.mp4

说明: -i 后跟 要播放的文件名,·-i也可以省略, ffplay播放过程中常用的快捷键如下:

快捷键

解释

快捷键

解释

q / ESC

退出播放

p / SPACE

暂停/恢复

f

全屏/恢复

m

静音/恢复

主键盘9 / 小键盘 除号

降低音量

主键盘0 / 小键盘 乘号

增加音量

s

跳到下一帧

a

切到下一路音频流

v

切到下一路视频流

t

切到下一路字幕流

c

切到下一路视频流/视频流/字幕流

w

视频模式/音频波形模式/RDFT显示音频波段

三种模式循环切换


快退10s


快进10s


快退60s


快进60s

PgDn

快退600s

PgUp

快进600s

注: RDFT ((Inverse) Real Discrete Fourier Transform)

以特定大小的窗口播放视频 ffplay -x 640 -y 480 -i test.mp4

说明:-x 指定窗口的宽度, -y 指定窗口的高度

播放视频中的特定片段 ffplay -i test.mp4 -ss 0:0:0 -t 0:0:5

说明:-ss 指定播放的起始时间, -t 指定播放的时长,二者可配合使用,也可单独使用。
后面的参数可以是 ss:mm:hh的形式,也可以是 s的形式, 本例子表示只播放test.mp4前5s

全屏播放 ffplay -fs -i test.mp4

倍速播放 ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2

说明: 此处用到了 filter的功能
-vf 指定video filter以及传递给video filter的参数, n倍速度就是 setpts=PTS/n,
-af 指定audio filter以及传递给audio filter的参数, n倍速度就是 atempo=n 这里不再扩展,有时间专门写一篇文件来介绍filters,本例子中表示 两倍速度播放test.mp4的音频和视频

播放yuv数据 ffplay -i test.yuv -pixel_format yuv420p -video_size 352x288

说明: 播放YUV数据时,需要指定数据的宽高和颜色格式,这样ffmpeg才能正确地读取和渲染每一帧数据.
-pixel_format 指定yuv的颜色格式
-video_size 指定yuv的宽高

播放PCM数据 ffplay -i 44100_2_flt32le.pcm -f f32le -ac 2

说明:播放pcm数据时,必须指定pcm的demuxer和声道数
-f 指定使用 f32le demuxer(表示按照 小端的32-bit 浮点数的方式去渲染每一个音频sample)
-ac 指定声道数

其他ffplay的命令

如下表

命令

解释

选项

选项说明

ffplay -fs input.mp4

全屏播放

-fs

full screen, 全屏播放

ffplay -loop 5 input.mp4

循环播放5次

-loop N

循环播放N次, 如果N为-1, 为无限循环播放

ffplay -an input.mp4

静音播放

-vn/-an/-sn

不加载 视频/音频/字幕 播放

ffplay -vst 1 input.mp4

选择stream_id为1的视频播放

-vst/-ast/-sst

选择指定id的 视频/音频/字幕 流播放

2、转码视频

2.1 更改文件的封装格式

如 mp4->mkv, 示例:

ffmpeg -i test.mp4 -vcodec copy -acodec copy -f matroska test.mkv

注1: -vcodec copy -acodec copy 等选项可以简化为 -codec copy,进一步可简化为 -c copyffmpeg会原封不动将video packet, audio packetsubtitle packet(如果有的话) 拷贝到新的文件中。即:

ffmpeg -i test.mp4 -codec copy  -f matroska test.mkv

注2:
-i 后面跟 input文件名字
-f 后面跟 output文件的封装格式
-vcodec 后跟指定的视频编码格式,若是copy,表示转码时不更改video packet的数据,编码格式与源文件相同
-acodec 后跟指定的音频编码格式,若是copy,表示转码时不更改audio packet的数据,编码格式与源文件相同
-subtitle 用法同 -vcodec -acodec

注3:
具体的封装协议代号可以通过
ffmpeg -muxers
命令来查看

$ffmpeg -muxers
ffmpeg version N-91579-g243ecadad5 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
  configuration: 
  libavutil      56. 18.102 / 56. 18.102
  libavcodec     58. 22.100 / 58. 22.100
  libavformat    58. 17.101 / 58. 17.101
  libavdevice    58.  4.101 / 58.  4.101
  libavfilter     7. 26.100 /  7. 26.100
  libswscale      5.  2.100 /  5.  2.100
  libswresample   3.  2.100 /  3.  2.100
File formats:
 D. = Demuxing supported
 .E = Muxing supported
 --
  E 3g2             3GP2 (3GPP2 file format)
  E 3gp             3GP (3GPP file format)
  E a64             a64 - video for Commodore 64
  E ac3             raw AC-3
  E adts            ADTS AAC (Advanced Audio Coding)
  E adx             CRI ADX
  E aiff            Audio IFF
  E alaw            PCM A-law
  ……
  E matroska        Matroska
  E md5             MD5 testing
  E microdvd        MicroDVD subtitle format
  E mjpeg           raw MJPEG video
  E mkvtimestamp_v2 extract pts as timecode v2 format, as defined by mkvtoolnix
  E mlp             raw MLP
  E mmf             Yamaha SMAF
  E mov             QuickTime / MOV
  E mp2             MP2 (MPEG audio layer 2)
  E mp3             MP3 (MPEG audio layer 3)
  E mp4             MP4 (MPEG-4 Part 14)
 ……

第二列就是我们要找的封装格式,如 3gp, aac这些

注4:
具体的编码协议代号可以通过
ffmpeg -codecs
命令来查看

$ffmpeg -encoders
ffmpeg version N-91579-g243ecadad5 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
  configuration: 
  libavutil      56. 18.102 / 56. 18.102
  libavcodec     58. 22.100 / 58. 22.100
  libavformat    58. 17.101 / 58. 17.101
  libavdevice    58.  4.101 / 58.  4.101
  libavfilter     7. 26.100 /  7. 26.100
  libswscale      5.  2.100 /  5.  2.100
  libswresample   3.  2.100 /  3.  2.100
Encoders:
 V..... = Video
 A..... = Audio
 S..... = Subtitle
 .F.... = Frame-level multithreading
 ..S... = Slice-level multithreading
 ...X.. = Codec is experimental
 ....B. = Supports draw_horiz_band
 .....D = Supports direct rendering method 1
 ------
 V..... a64multi             Multicolor charset for Commodore 64 (codec a64_multi)
 V..... a64multi5            Multicolor charset for Commodore 64, extended with 5th color (colram) (codec a64_multi5)
 V..... alias_pix            Alias/Wavefront PIX image
 ……
 V..... flv                  FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (codec flv1)
 V..... gif                  GIF (Graphics Interchange Format)
 V..... h261                 H.261
 V..... h263                 H.263 / H.263-1996
 V.S... h263p                H.263+ / H.263-1998 / H.263 version 2
 V..... h264_vaapi           H.264/AVC (VAAPI) (codec h264)
 VF.... huffyuv              Huffyuv / HuffYUV
 V..... jpeg2000             JPEG 2000

……
 A..... aac                  AAC (Advanced Audio Coding)
 A..... ac3                  ATSC A/52A (AC-3)
 A..... ac3_fixed            ATSC A/52A (AC-3) (codec ac3)
 A..... adpcm_adx            SEGA CRI ADX ADPCM
 A..... g722                 G.722 ADPCM (codec adpcm_g722)

第二列就是我们要找的编码格式,如 h263, aac, ac3这些

同理,举一反三
查看所有的decoder
ffmpeg -decoders
查看所有支持的颜色格式
ffmpeg -pix_fmts
查看所有支持的采样格式
ffmpeg -sample_fmts
等等等等

2.2 文件1的视频加文件2的音频合成到一起

ffmpeg -i 1.mp4 -i 2.mp4 -map 0:v -map 1:a -c:v copy -c:a copy -f mp4 out.mp4

2.2 文件1和文件2按照时间顺序合成到一起

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex “concat=n=2;v=1;a=1” -map [v] -map [a] -f mp4 out.mp4

2.2 多个文件按照时间顺序合成到一起

2.2.1 创建一个txt文件,记录待处理的文件,如下:
···
file ‘D:\02-file\VID_00288.MP4’
file ‘D:\02-file\VID_00289.MP4’
file ‘D:\02-file\VID_00290.MP4’
file ‘D:\02-file\VID_00291.MP4’
file ‘D:\02-file\VID_00292.MP4’
file ‘D:\02-file\VID_00293.MP4’
file ‘D:\02-file\VID_00294.MP4’
file ‘D:\02-file\VID_00295.MP4’
file ‘D:\02-file\VID_00296.MP4’
file ‘D:\02-file\VID_00297.MP4’
file ‘D:\02-file\VID_00298.MP4’
file ‘D:\02-file\VID_00299.MP4’
file ‘D:\02-file\VID_00300.MP4’
···
2.2.2 运行转换命令
···
ffmpeg -f concat -safe 0 -i file.txt -c copy output.mp4
···
注意:为了防止ffmpeg不识别带中文字符的路径,最好加上 -safe 0 这个参数

视频文件转为gif

PPT中插入的视频不能默认播放,必须手动点击才可以播放
但可以自动播放gif图片,故可以把视频文件转换成gif插入到PPT中,带来较好的用户体验
转普通gif ffmpeg -i input.mp4 output.gif 使用调色板转高清gif ffmpeg -i input.mp4 -vf split[pict][ref];[ref]palettegen[palette];[pict][palette]paletteuse -y output.gif

3 提取YUV数据

<font

color=#FF0000>3.1 提取yuv数据
ffmpeg -i input -pix_fmt yuv420p -f rawvideo output.yuv
说明:
-pix_fmt 指定yuv的颜色格式, 可以使用如下命令来查看ffmpeg支持的颜色格式

ffmpeg -pix_fmts

-f 指定文件封装格式, 由于yuv是裸数据,没有封装格式,所以是rawvideo
注: 如果不指定文件封装格式, 则输出文件名必须以 .yuv或.rgb结尾,否则命令不生效.
即等价于

ffmpeg -i input -pix_fmt yuv420p output.yuv

除了ffplay可以播放YUV数据外,
也可以使用linux上的vooya来查看yuv数据
也可以window上可以使用其他yuv工具如 yuvview 来查看

3.2 提取一帧yuv数据

有的文章中是将视频的转成一张张jpeg图片,之后再把第一张jpeg图片转成yuv,我想说这样的yuv经过二次编码,已经不是原有的yuv了
这种方法还不如使用 dd 命令来截取 3.1 中提取的yuv数据中的前 w*h*1.5 个字节的数据呢
我再介绍一种方法,使用 trim filter精确截取某一帧yuv数据

ffmpeg -i input -vf "trim=start_frame=0:end_frame=1" out.yuv

说明: 本例子截取了视频第一帧的yuv数据
start_frame: 起始帧的序号(从0开始)
end_frame: 结束帧的序号(不包含)
可以参考我的这篇文章中介绍的trim filter的用法

4 提取PCM数据

ffmpeg -i input -sample_fmt flt -f f32le output.pcm

说明:
-sample_fmt 指定pcm的sample格式,可以使用如下命令来查看ffmpeg支持的sample格式

ffmpeg -sample_fmts

-f 指定文件封装格式,
除了ffplay可以播放pcm数据外,
也可以使用linux上的Audacity来查看pcm数据
也可以window上可以使用其他工具如 cool edit 来查看

5 编码PCM数据

ffmpeg -f f32le -ar 44100 -ac 2 -i 44100_2_f32le_2s.pcm -acodec aac test.aac

说明:
-f 指定当前pcm数据的排布格式
-ar 指定编码时的采样率
-ac 指定编码时的通道数