跳到主要内容
SUN / 笔记
← 全部文章

2.FFmpeg常用命令行

ffmpeg

  1. 分离视频音频流
text
ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流
  1. 视频解复用
text
ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
  1. 视频转码
text
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264              //转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264  //转码为码流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi            //转码为封装文件
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
  1. 视频封装
text
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
  1. 视频剪切
text
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg        //提取图片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi    //剪切视频
//-r 提取图像的频率,-ss 开始时间,-t 持续时间
  1. 视频录制
text
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
  1. YUV序列播放
text
ffplay -f rawvideo -video_size 1920x1080 input.yuv
  1. YUV序列转AVI
text
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

常用参数说明:

主要参数:-i 设定输入流 -f 设定输出格式 -ss 开始时间
视频参数:-b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:-ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频

  1. 压缩转码mp4文件
text
ffmpeg -i input.avi -s 640x480 output.avi

ffmpeg -i input.avi -s vga output.avi
  1. 将文件当做直播送至live
text
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
  1. 将直播媒体保存至本地文件
text
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
  1. 将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流
text
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
  1. 将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流
text
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream
  1. 将其中一个直播流,视频不变,音频改用faac压缩,送至另外一个直播服务流
text
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream
  1. 将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变
text
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
  1. 将一个JPG图片经过h264压缩循环输出为mp4视频
text
ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4
  1. 将普通流视频改用h264压缩,音频不变,送至高清流服务(新版本FMS live=1)
text
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1〃
  1. 采集usb摄像头视频命令:
text
ffmpeg -t 20 -f vfwcap -i 0 -r 8 -f mp4 cap1111.mp4
./ffmpeg -t 10 -f vfwcap -i 0 -r 8 -f mp4 cap.mp4

具体说明如下: 我们采集10秒,采集设备为vfwcap类型设备,第0个vfwcap采集设备(如果系统有多个vfw的视频采集设备,可以通过-i num来选择),每秒8帧,输出方式为文件,格式为mp4。

  1. 最简单的抓屏:
text
ffmpeg -f gdigrab -i desktop out.mpg
  1. 从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5 :
text
ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg
  1. ffmpeg从视频中生成gif图片:
text
ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif
  1. 视频文件切片
text
// 将一个MP4文件切割为MP4切片,切出来的切片文件的时间戳与上一个MP4的结束时间戳是连续的
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 test_output-%d.mp4
  1. moov前置 当使用ffmpeg的默认参数输出为MP4格式时,moov会在所有数据转封装完成后生成,然后添加在文件的末尾。由于获取moov相对较为复杂,因此MP4格式对流媒体播放等场景并不友好。为了解决该问题,在使用ffmpeg进行转封装操作时,可以在选项-movflags中加入参数faststart。
text
ffmpeg -i input.avi -c copy -movflags faststart output.mp4

在加入参数faststart后,ffmpeg在完成转封装操作后会进行一次附加操作——将moov置于文件头部。

  1. 设置视频帧率 滤镜fps可以设置输入视频的帧率。当输入视频的帧率与设置帧率不一致时,ffmpeg将通过丢帧或复制当前帧的方式确保输出视频帧率的稳定性。滤镜fps支持的参数如下。◎ fps:指定输出视频的帧率,默认为25。◎ start_time:指定起始时间戳。◎ round:时间戳近似方法。◎ eof_action:末尾帧的处理方法。通过以下命令可以将输入视频的帧率设置为30。
text
ffmpeg -i input.mp4 -vf fps=fps=30 -y output.mp4

ffplay

ffplay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器。ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎、format引擎以及filter引擎的工具。并且还可以进行媒体参数分析,可以通过ffplay --help进行查看。 Image

Image

ffplay [选项] [输入文件]

text
ffplay /Users/xxx/Desktop/111.mp4
ffplay http://219.151.31.38/liveplay-kk.rtxapp.com/live/program/live/hnwshd/4000000/mnf.m3u8

如果按s键就可以进入frame-step模式,即按s键一次就会播放下一帧图像。

主要选项
  • '-x width' 强制以 "width" 宽度显示
  • '-y height' 强制以 "height" 高度显示
  • '-an' 禁止音频
  • '-vn' 禁止视频
  • '-ss pos' 跳转到指定的位置(秒)
  • '-t duration' 播放 "duration" 秒音/视频
  • '-bytes' 按字节跳转
  • '-nodisp' 禁止图像显示(只输出音频)
  • '-f fmt' 强制使用 "fmt" 格式
  • '-window_title title' 设置窗口标题(默认为输入文件名)
  • '-loop number' 循环播放 "number" 次(0将一直循环)
  • '-showmode mode' 设置显示模式
    • 可选的 mode :
    • '0, video' 显示视频
    • '1, waves' 显示音频波形
    • '2, rdft' 显示音频频带
    • 默认值为 'video',你可以在播放进行时,按 "w" 键在这几种模式间切换
  • '-i input_file' 指定输入文件
  • '-sync type' 设置主时钟为音频、视频、或者外部。默认为音频。主时钟用来进行音视频同步
  • '-threads count' 设置线程个数
  • '-autoexit' 播放完成后自动退出
  • '-exitonkeydown' 任意键按下时退出
  • '-exitonmousedown' 任意鼠标按键按下时退出
  • '-acodec codec_name' 强制指定音频解码器为 "codec_name"
  • '-vcodec codec_name' 强制指定视频解码器为 "codec_name"
  • '-scodec codec_name' 强制指定字幕解码器为 "codec_name"

如果希望从视频的第30秒开始播放,播放10秒钟的文件,则可以使用如下命令 ffplay -ss 30 -t 10 /Users/xxx/Desktop/111.mp4

使用ffplay除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如播放音频文件时,如果不确定文件的声音是否正常,则可以直接使用ffplay播放音频文件,播放的时候其将会把解码后的音频数据以音频波形的形式显示出来,命令行执行后的效果如图2-8所示,命令如下: ffplay -showmode 1 output.mp3

音画同步

ffplay也是一个视频播放器,所以不得不提出来的一个问题是:音画同步。 ffplay的音画同步的实现方式其实有三种,分别是:

  • 以音频为主时间轴作为同步源
  • 以视频为主时间轴作为同步源
  • 以外部时钟为主时间轴作为同步源。

下面就以音频为主时间轴来作为同步源来作为案例进行讲解,而且ffplay默认也是以音频为基准进行对齐的,那么以音频作为对齐基准是如何实现的呢?

首先需要说明的是,播放器接收到的视频帧或者音频帧,内部都是会有时间戳(PTS时钟)来标识它实际应该在什么时刻展示,实际的对齐策略如下: 比较视频当前的播放时间和音频当前的播放时间,如果视频播放过快,则通过加大延迟或者重复播放来降低视频播放速度,如果视频播放慢了,则通过减小延迟或者丢帧来追赶音频播放的时间点。 关键就在于音视频时间的比较和延迟的计算,当前在比较的过程中会设置一个阈值,如果超过预设的阈值就应该作出调整(丢帧或者重复渲染),这就是整个对齐策略。

在使用ffplay的时候,我们可以明确的指定使用那种对齐方式,比如: ffplay test.mp4 -sync audio 上面这个命令显式的指定了使用以音频为基准进行音视频同步的方式播放视频文件,当然这也是ffplay的默认播放设置。 ffplay test.mp4 -sync video 上面这个命令显式的指定了使用以视频为基准进行音视频同步的方式播放视频文件。 ffplay test.mp4 -sync ext 上面这个命令显式的指定了使用外部时钟为基准进行音视频同步的方式播放视频文件。

ffprobe

ffprobe是ffmpeg命令行中用来查看媒体文件格式的工具。 ffprobe常用的参数比较多,可以通过ffprobe --help来查看详细的帮助信息。

命令格式: ffprobe [文件名]

text
ffprobe /Users/xxx/Desktop/111.mp4

ffprobe version 4.4 Copyright (c) 2007-2021 the FFmpeg developers
  built with Apple clang version 12.0.5 (clang-1205.0.22.9)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/xuchuanren/Desktop/111.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Multimedia Cloud Transcode (cloud.baidu.com)
    comment         : Content Adaptive Encoding 3.0
  Duration: 00:00:41.52, start: 0.000000, bitrate: 163 kb/s  // 视频的时长是41秒52毫秒,开始播放时间是0,,整个文件的比特率是163Kbit/s
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 91 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
  // 上面这一行的信息是,第一个流是视频流,编码格式是h264格式(封装格式是AVC1),每一帧的数据表示为yuv420p,分辨率为1280*720.这路流的比特率为91Kbit/s,帧率为每秒钟25帧
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 65 kb/s (default)
  // 上面这一行的信息是,第二个流为音频流,编码方式为ACC(封装格式为MP4A),并且采用的Profile是LC规格,采样率是44.1KHz,声道是立体声,这路流的比特率是65Kbit/s
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

查看流的多媒体封装格式 ffprobe -show_format /Users/xxx/Desktop/111.mp4

text
[FORMAT]
filename=/Users/xxx/Desktop/111.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=41.518000
size=848895
bit_rate=163571
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Multimedia Cloud Transcode (cloud.baidu.com)
TAG:comment=Content Adaptive Encoding 3.0
[/FORMAT]

这个文件的格式有可能是MOV、MP4、M4A、3GP、3G2或者MJ2,之所以ffprobe会这么输出,是因为这几种封装格式在ffmpeg中所识别的标签基本相同,所以才会有这么多种显示方式 format字段说明 Image

查看每一帧信息 ffprobe -show_frames /Users/xxx/Desktop/111.mp4

text
[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=530432
pkt_pts_time=41.440000
pkt_dts=N/A
pkt_dts_time=N/A
best_effort_timestamp=530432
best_effort_timestamp_time=41.440000
pkt_duration=512
pkt_duration_time=0.040000
pkt_pos=846850
pkt_size=41
width=1280
height=720
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=P
coded_picture_number=1033
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=unknown
color_space=unknown
color_primaries=unknown
color_transfer=unknown
chroma_location=left
[/FRAME]

frame字段说明 Image

查看包信息 ffprobe -show_packets /Users/xxx/Desktop/111.mp4

text
[PACKET]
codec_type=audio
stream_index=1
pts=1827840
pts_time=41.447619
dts=1827840
dts_time=41.447619
duration=1024
duration_time=0.023220
size=176
pos=848485
flags=K_
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=1828864
pts_time=41.470839
dts=1828864
dts_time=41.470839
duration=1021
duration_time=0.023152
size=234
pos=848661
flags=K_
[/PACKET]

packet字段说明 Image

查看流信息 ffprobe -show_streams /Users/xxx/Desktop/111.mp4

text
ffprobe version 4.4 Copyright (c) 2007-2021 the FFmpeg developers
  built with Apple clang version 12.0.5 (clang-1205.0.22.9)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/xuchuanren/Desktop/111.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Multimedia Cloud Transcode (cloud.baidu.com)
    comment         : Content Adaptive Encoding 3.0
  Duration: 00:00:41.52, start: 0.000000, bitrate: 163 kb/s
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 91 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 65 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_tag_string=avc1
codec_tag=0x31637661
width=1280
height=720
coded_width=1280
coded_height=720
closed_captions=0
has_b_frames=2
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=31
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=unknown
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=25/1
avg_frame_rate=25/1
time_base=1/12800
start_pts=0
start_time=0.000000
duration_ts=530944
duration=41.480000
bit_rate=91747
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=1037
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=und
TAG:handler_name=VideoHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=44100
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/44100
start_pts=0
start_time=0.000000
duration_ts=1829885
duration=41.493991
bit_rate=65031
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=1788
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]

stream字段说明:

Image

overlay 技术简介

overlay 技术又称视频叠加技术。overlay 视频技术使用非常广泛,常见的例子有,电视 屏幕右上角显示的电视台台标,以及画中画功能。 画中画是指在一个大的视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内 容同时播放。 overlay 技术中涉及两个窗口,通常把较大的窗口称作背景窗口,较小的窗口称作前景 窗口,背景窗口或前景窗口里都可以播放视频或显示图片。 FFmpeg 中使用overlay 滤镜可实现视频叠加效果。 overlay 滤镜说明如下: 描述:前景窗口(第二输入)覆盖在背景窗口(第一输入)的指定位置。

语法:overlay[=x:y:rgb={0, 1} 参数x 和y 是可选的,默认为0。 参数rgb 参数也是可选的,其值为0 或1,默认为0。 参数说明: x 从左上角的水平坐标,默认值为0 y 从左上角的垂直坐标,默认值为0 rgb 值为0 表示输入颜色空间不改变,默认为0;值为1 表示将输 入的颜色空间设置为RGB 变量说明:如下变量可用在x 和y 的表达式中 main_w 或W 主输入(背景窗口)宽度 main_h 或H 主输入(背景窗口)高度 overlay_w 或w overlay 输入(前景窗口)宽度 overlay_h 或h overlay 输入(前景窗口)高度 //中间 ffmpeg -i ande_302.mp4 -vf "movie=logo.png[logo]; [in][logo]overlay=W/2-w/2:H/2-h/2[out]" -vcodec libx264 -acodec aac zzoutput8.mp4 //右下角 ffmpeg -i ande_302.mp4 -vf "movie=logo.png[logo]; [in][logo]overlay=W-w:H-h[out]" -vcodec libx264 -acodec aac zzoutput7.mp4


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!

相关文章

AndroidStudio使用教程(第六弹) →AndroidRuntime_ART与Dalvik →1.系统架构 →