【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题
- 第三章 FFmpeg工具使用基础
- 3.1 ffmpeg常用命令
- 3.1.1
- 3.1.3 转码流程
- 3.2 ffprobe 常用命令
- 3.2.1 ffprobe常用参数
- 3.2.2 ffprobe 使用示例
- 3.3 ffplay常用命令
- 3.3.1 ffplay常用参数
- 3.3.2 ffplay高级参数
- 3.3.4 ffplay快捷键
- 第4章 封装与解封装
- 4.1 视频文件转MP4
- 4.1.4 MP4在FFmpeg中的Demuxer
- 4.2 视频文件转FLV
- 4.3 视频文件转MPEG-TS
- 4.4 视频文件转HLS
- 4.5 视频文件切片
- 4.5.3 使用ss与t参数切片
- 4.6 视频文件的音视频流提取
- 4.6.1 提前AAC音频流
- 4.6.2 提取H.264视频流
- 4.6.3 提取H.265视频流
- 4.7 系统资源使用情况
- 第5章 编码与转码
- 5.1 软编码 H.264
- 5.1.2 H.264编码举例
- 1. 编码器预设参数设置
- 2. H.264编码优化
- 3. H.264的profile和level设置
- 4. 控制场景切换时关键帧的插入
- 5. 设置x264内部参数
- 6. CBR设置
第三章 FFmpeg工具使用基础
3.1 ffmpeg常用命令
ffmpeg --help
ffmpeg -h
ffmpeg -h long 查看高级参数部分
ffmpeg -h full 产科全部参数部分
ffmpeg -h type=name
其中 type为 decoder/encoder/demuxer/muxer/filter/bsf/protocol 的一种
name为对应的组件的名字
ffmpeg -L 查看ffmpeg目前支持的license协议
ffmpeg -version 查看ffmpeg版本,以及子模块的详细版本信息
ffmpeg -formats 查看当前ffmpeg支持的容器文件格式,返回值如下:
File formats:D. = Demuxing supported.E = Muxing supported--D 3dostr 3DO STRE 3g2 3GP2 (3GPP2 file format)E 3gp 3GP (3GPP file format)...
共三列,
第一列 D表示 Demuxing, E表示 Muxing
第二列 容器格式在FFmpeg中使用的简短名字
第三列 容器文件格式的补充说明
ffmpeg -codecs 查看编解码格式的所有信息,如:
Codecs:D..... = Decoding supported.E.... = Encoding supported..V... = Video codec..A... = Audio codec..S... = Subtitle codec..D... = Data codec..T... = Attachment codec...I.. = Intra frame-only codec....L. = Lossy compression.....S = Lossless compression-------D.VI.S 012v Uncompressed 4:2:2 10-bitD.V.L. 4xm 4X Movie...
共三列,
第一列 D表示支持解码,E表示支持编码,以及编码的音频/视频/字幕/数据/附件类型,或者只有I帧的编码压缩格式,以及有损和无损压缩类型
第二列 Codec在FFmpeg中使用的简短名字
第三列 Codec格式的详细说明,如果一个Codec有多个对应实现,也会在小括号中显示出来
ffmpeg -encoders / ffmpeg -decoders
ffmpeg -h muxer=flv
ffmpeg -h demuxer=flv
ffmpeg -h encoder=h264
ffmpeg -h filter=colorkey
3.1.1
ffmpeg 中 AVFormatContext 的主要参数
参数 | 说明 |
---|---|
avioflags | 缓冲设置, 默认为0 direct: 无缓冲 |
probesize | probing size |
等等
ffmpeg 中 AVCodecContext 的主要参数
参数 | 说明 |
---|---|
b | 设置文件码流 |
ab | 设置音频码率(不同音频encoder有不同的默认值), |
g | 设置max gop size |
ar | 设置音频sample_rate, |
ac | 设置音频channel_count, |
bf | 设置连续编码B帧的个数,设置为0是无B帧 |
profile | 设置音视频的profle |
level | 设置音视频的level |
level | 设置音视频的level |
color_primaries | 设置视频的primaries (from 1 to 10) (default unspecified) |
color_trc | 设置视频的color transfer characteristics (from 1 to 18) (default unspecified) |
colorspace | 设置视频的colorspace,如 bt709, rgb 等 |
color_range | 设置视频的range mpeg: MPEG (219*2^(n-8)) jpeg: JPEG (2^n-1) |
更多信息查看ffmpeg -h full 的返回值 |
3.1.3 转码流程
ffmpeg -i input1.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4
3.2 ffprobe 常用命令
3.2.1 ffprobe常用参数
ffprobe -v 指定log级别, quiet/panic -> debug/ trace
ffprobe -show_format
ffprobe -show_streams 查看文件的流信息, 如视频codec, 帧率,位深,nal_length_size, profile/level, has_b_frames等
ffprobe -show_chpters
ffprobe -v trace -show_format -show_streams -show_chapters -of json video.mp4
3.2.2 ffprobe 使用示例
ffprobe -show_packets input.flv 查看多媒体数据包信息
ffprobe -show_data -show_packets input.flv 查看每一包信息以及包中的具体数据
ffprobe -show_format output.mp4 查看文件format信息
ffprobe -show_frames input.flv 查看视频的每一帧信息
ffprobe -of xml -show_streams input.flv 查看每一路stream的信息,xml的格式输出
此外,of还可以跟 ini/ json/ csv / flat 等信息
ffprobe -show_frames -select_streams v -of xml input.mp4 只查看视频信息
select_streams 后面可以跟 v a s,分别表示 视频/音频/字幕
如果不需要输出所有字段的信息,可以结合 show_entries来使用,如:
ffprobe -select_streams v -show_packets -show_entries packet=codec_type,pts_time,pos input.mp4
表示只输出 packet中的 codec_type/pst_time/pos等字段信息
ffprobe -v trace input.mp4 2>&1| findstr “parent:‘root’” 查看文件中box的位置信息
3.3 ffplay常用命令
3.3.1 ffplay常用参数
ffplay --help
与ffplay 相关的命令
x, y 设置显示窗口的宽高
s 设置视频显示宽高,主要用于播放yuv/rgb裸流, 有的版本没有这个信息
fs 强制全屏播放
an/vn/sn 屏蔽音频/视频/字幕
ss/t 设置seek开始的秒数/设置播放的时间长度
bytes: seek by byes, 0:off, 1:on, -1 auto
nodisp: 关闭显示窗口
f 强制使用某格式,主要用于rawvideo播放裸流
window_title 设置显示窗口的标题
af/vf 设置音频/视频滤镜
codec 强制使用某个codec, 主要针对存在多个视频codec的情况
autorotate 自动旋转视频
ffplay -ss 0 -t 10 input.mp4
ffplay -window_title “Hello, World” output.mp4
ffplay -window_title “播放测试” rtmp://up.v.test.com/live/stream //实际播放不了
3.3.2 ffplay高级参数
ast/vst/sst 设置将要播放音频/视频/字幕流
stats 输出多媒体播放状态 //没发现有啥作用
autoexit 播放完成后自动退出ffplay, 默认不自动退出
exitonkeydown/exitonmousedown 有按键事件/鼠标按键事件后退出ffplay
loop 设置播放循环次数
framedrop cpu占用过高时,自动丢帧
infbuf 设置无极限的播放器buffer,主要用于流媒体播放场景
vf 设置视频滤镜
acodec/vcodec/scodec 强制使用某个codec
time xxx // window上无法使用time统计耗时信息
ffplay -vcodec h264 output.mp4 强制使用h264解码器解码非h264码流会报错
ffmpeg -vst 4 -ast 5 test.ts 针对ts流中有多路节目时,选择对应的音频流和视频流
ffplay -window_title “Test Movie” -vf “subtitles=input.srt” output.mp4
播放视频时,带上 input.srt的字幕文件
input.srt内容可以为
1
00:00:00.000 --> 00:00::30.000
Test first 30 second2
00:00:00.301 --> 00:00::60.000
Test second 30 second3
00:01:01.000 --> 00:01::10.000
Test end
3.3.3 ffplay的数据可视化分析应用
ffplay -showmode 1 output.mp3 //音频的波形以振幅的形式显示出来
ffplay -debug vis_mb_type -window_title “show vis_mb_type” -ss 20 -t 10 -autoexit output.mp4
注: 较新的版本上的 AVCodecContext 帮助中,其-debug没有 vis_mb_type, 只有 qp/mb_type 等信息,不是打印在视频的宏块上,而是直接打印在log里面,如下图,打印的是720x960(每帧45x60个宏块)视频的qp信息,
下面时某一帧每个宏块的qp值
ffplay -vismv pf output.mp4 // 没有 vismv 这个命令
ffplay -flags2 +export_mvs video.mp4 -vf codecview=mv=pf+bf+bb // 这个可以将mv信息显示在画面上,如果没有 flags参数,单纯使用 codecview filter,还是无效果
3.3.4 ffplay快捷键
ffplay播放过程中的一些快捷键
快捷键 | 功能 |
---|---|
f | 全屏/非全屏切换 |
f | 全屏/非全屏切换 |
s | 逐帧显示图像,(暂停的状态时) |
w | 显示图像和声音波形之间切换 |
← / → | 后退10s/前进10s |
↑ / ↓ | 前进60s/后台60s |
鼠标右键单击 | seek至指定位置 |
鼠标左键双击 | 切换全屏/非全屏 |
m | 静音切换 |
功能键区(非小键盘)的 9和0 | 增大和减小音量 |
小键盘区的 / 和 * | 增大和减小音量 |
p | 暂停/恢复播放 |
q和 ESC | 退出播放 |
第4章 封装与解封装
4.1 视频文件转MP4
4.1.4 MP4在FFmpeg中的Demuxer
ffmpeg -h demuxer=mp4
个人觉得有用的信息
ignore_editlist 忽略EditList box信息,默认不开启,
如果同一个视频,ffplay播放音视频不同步,其他播放器正常,可能是mp4的 editlist box里面的参数缘故,设置这个参数再尝试一下
ffmpeg -h muxer=mp4
个人觉得有用的信息
movflags
faststart 设置将moov box置于文件的开头,
dash 将MP4封装为fragment mp4,以便兼容DASH
ffmpeg -i input.flv -c copy -f mp4 output.mp4
ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4
ffmpeg -i input.flv -c copy -f mp4 -movflags dash output.mp4
ffmpeg -re -i input.mp4 -c copy -movflags isml+frag_keyframe -f ismv Stream //与普通mp4的差异就是,Stream里面的 compatible_brands为 ismlpiff, 这里的 -re 表示 每秒只读取1s的input.mp4数据来处理,所以视频有多长,转码时间就会有多长,为了加快速度,可以取消到 -re 这个命令
ffmpeg -i input.mp4 -c:v libx265 -c:a aac -crf 25 -tag:v hvc1 outputh265.mp4
与不加 -tag:v hvc1生成的普通Mp4相比,
普通MP4视频生成 hev1 box, 这里生成 hvc1 box
4.2 视频文件转FLV
ffmpeg -h muxer=flv 查看 flv muxer的使用信息
ffmpeg -i input_ac3.mp4 -c copy -f flv output.flv
ffmpeg -i input_ac3.mp4 -vcodec copy -acodec aac -f flv output.flv
ffmpeg -i input.mp4 -c copy -f flv -flvflags add_keyframe_index output.flv
相比默认 不加 flvflags的命令,生成的flv文件,多了存放关键帧信息的metadata
ffprobe -v trace -i output.flv // 查看flv信息
4.3 视频文件转MPEG-TS
TS/PS 分为三层
- ES层: 单独的音频流视频流组成的Elementary Stream, ES
- PES层: 将ES按一定的规则进行封装,如H.264的AU作为拆分单元,打上时间戳,组成分组的基本数据流 Packetized Elementary Stream, PES,
- TS/PS 层: 将PES包进行切分再封装成固定大小(一般为188 Byte)的传输流 Transport Stream, TS
ffmpeg -h muxer=mpegts 查看mpegts muxer的帮助信息
4.4 视频文件转HLS
ffmpeg -h muxer=hls 查看hls muxer的help信息
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8
实操发现是否加 -bsf:v h264_mp4toannexb, 效果一样,ffmpeg内部会自动把MP4中nal的长度头更换为起始码的头
- start_number参数
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8 // 设置m3u8中的切片从 300开始
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8
每一个切片,几乎都是10s
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:11.066667,
output0.ts
#EXTINF:10.166667,
output1.ts
#EXTINF:10.000000,
output2.ts
#EXTINF:6.166667,
output3.ts
#EXT-X-ENDLIST
ffmpeg -i input.mp4 -c copy -f hls -hls_list_size 3 output.m3u8
只保留了最多3片的切片
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:13
#EXTINF:2.266667,
output13.ts
#EXTINF:2.300000,
output14.ts
#EXTINF:1.600000,
output15.ts
#EXT-X-ENDLIST
hls_wrap 参数已经废弃
ffmpeg -i input.mp4 -c copy -f hls -hls_base_url http://192.168.0.1/lives/ output1.m3u8
从生成的m3u8来看,每个分片都加了 http://192.168.0.1/lives/ 的前缀
D:\_Video>type output1.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.800000,
http://192.168.0.1/lives/output111.ts
#EXTINF:1.833333,
http://192.168.0.1/lives/output112.ts
#EXTINF:2.266667,
http://192.168.0.1/lives/output113.ts
#EXTINF:2.300000,
http://192.168.0.1/lives/output114.ts
#EXTINF:1.600000,
http://192.168.0.1/lives/output115.ts
#EXT-X-ENDLIST
ffmpeg -i input.mp4 -c copy -vframes 1000 -f hls -hls_segment_filename test_output-%d.ts output.m3u8
可以看出,切片名字不再是默认的 output1.ts, output2.ts 这些ts
而是指定的 test_output-%d.ts
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:9
#EXTINF:3.066667,
test_output-9.ts
#EXTINF:3.300000,
test_output-10.ts
#EXTINF:1.800000,
test_output-11.ts
#EXTINF:1.833333,
test_output-12.ts
#EXTINF:2.100000,
test_output-13.ts
#EXT-X-ENDLIST
ffmpeg -f lavfi -i testsrc2=s=176x144:r=15 -vcodec libx264 -g 30 -r:v 15 -f hls -hls_time 2 -hls_list_size 4 -hls_flags delete_segments -t 30 output-test.m3u8
D:\_Video>type output-test.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:2.000000,
output-test11.ts
#EXTINF:2.000000,
output-test12.ts
#EXTINF:2.000000,
output-test13.ts
#EXTINF:2.000000,
output-test14.ts
#EXT-X-ENDLIST
-t 30 指定要生成30s的视频,hls_time 为2,指定切片duration为2s, 故一共有15个切片
从 output-test0 - output-test14
而这是了 delete_segment, 且 hls_list_size 4, 故前11个切片都删了,只保留最后4个
ffmpeg -i input.mp4 -c copy -f hls -hls_flags round_durations output.m3u8
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:2,
output11.ts
#EXTINF:2,
output12.ts
#EXTINF:2,
output13.ts
#EXTINF:2,
output14.ts
#EXTINF:2,
output15.ts
#EXT-X-ENDLIST
每一片的切片时长变为了整数,而不是浮点数了
ffmpeg -i input.mp4 -c copy -f hls -hls_flags discont_start -bsf:v h264_mp4toannexb output.m3u8
生成的m3u8文件中,实际并没有 discontinuity 标签, why?
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.800000,
output11.ts
#EXTINF:1.833333,
output12.ts
#EXTINF:2.266667,
output13.ts
#EXTINF:2.300000,
output14.ts
#EXTINF:1.600000,
output15.ts
#EXT-X-ENDLIST
ffmpeg -i input.mp4 -c copy -vframes 2000 -f hls -hls_flags omit_endlist -bsf:v h264_mp4toannexb output.m3u8
生成的 m3u8文件中,没有 endlist 标签
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.800000,
output11.ts
#EXTINF:1.833333,
output12.ts
#EXTINF:2.266667,
output13.ts
#EXTINF:2.300000,
output14.ts
#EXTINF:1.600000,
output15.ts
ffmpeg -i input.mp4 -c copy -f hls -hls_time 2 -hls_flags split_by_time output.m3u8
hls_time设置的切片duration已经生效,几乎都是2s,
由于不是根据关键帧分隔的,所有播放某些片段是,会先花屏或者报错,直至遇到I帧
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:14
#EXTINF:2.033333,
output14.ts
#EXTINF:1.966667,
output15.ts
#EXTINF:2.000000,
output16.ts
#EXTINF:2.133333,
output17.ts
#EXTINF:1.400000,
output18.ts
#EXT-X-ENDLIST
ffmpeg -re -i input.mp4 -c copy -vframes 2000 -f hls -strftime 1 -bsf:v h264_mp4toannexb output.m3u8
strftime参数用于设置HLS切片文件名,以生成TS切片文件时的系统时间作为文件名。
注意必须要加 -re参数,要不文件1s内生成完毕,所有的文件名都是同一个
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.800000,
output-20250125232835.ts
#EXTINF:1.833333,
output-20250125232837.ts
#EXTINF:2.266667,
output-20250125232838.ts
#EXTINF:2.300000,
output-20250125232841.ts
#EXTINF:1.600000,
output-20250125232843.ts
#EXT-X-ENDLIST
ffmpeg -i input.mp4 -c copy -f hls -hls_time 3 -hls_list_size 0 -method PUT -t 30 http://127.0.0.1/test/output_test.m3u8
没有搭建推流服务器,等搭建了Nginx后再试(todo)
ffmpeg -i input.mp4 =b:a:0 32k -b:a:1 64k -b:v:0 1000k -map 0:a -map 0:a -map 0:v -f hls -var_stream_map "a:0,agroup:aud_ow,default:yes,language:ENG a:1,agroup:aud_high,language:CHN v:0,agroup:aud_low" -master_pl_name master.m3u8 -t 30 output%v.m3u8
此命令一共生成4个m3u8文件, master.m3u8和 output0.m3u8, output1.m3u8, output2.m3u8,
其中 output0.m3u8和 output1.m3u8中关联的都是音频,output2.m3u8中关联的是视频,
直接播放master.m3u8时,播放的是无声视频,尚不清楚如何播放出相关的音频
内容分别为:
D:\_Video>type master.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_aud_ow",NAME="audio_0",DEFAULT=YES,LANGUAGE="ENG",URI="output0.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_aud_high",NAME="audio_1",DEFAULT=NO,LANGUAGE="CHN",URI="output1.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1100000,RESOLUTION=720x960,CODECS="avc1.64001f"
output2.m3u8D:\_Video>type output0.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.996911,
output011.ts
#EXTINF:1.996922,
output012.ts
#EXTINF:1.996911,
output013.ts
#EXTINF:1.996922,
output014.ts
#EXTINF:0.023222,
output015.ts
#EXT-X-ENDLISTD:\_Video>type output1.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.996911,
output111.ts
#EXTINF:1.996922,
output112.ts
#EXTINF:1.996911,
output113.ts
#EXTINF:1.996922,
output114.ts
#EXTINF:0.023222,
output115.ts
#EXT-X-ENDLISTD:\_Video>type output2.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:10
#EXTINF:1.033333,
output210.ts
#EXTINF:2.033333,
output211.ts
#EXTINF:3.333333,
output212.ts
#EXTINF:0.900000,
output213.ts
#EXTINF:1.466667,
output214.ts
#EXT-X-ENDLIST
4.5 视频文件切片
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 test_output-%d.mp4
此命令生成一堆切片好的mp4文件
如下命令查看第一个切片文件的最后三个pts_time,
ffprobe -v quiet -show_packets -select_streams v test_output-0.mp4 | findstr pts_time > 0.txt
type 0.txt | find /c /v "" > tmp.txt && set /p line=<tmp.txt && set /a last=%line%-10
more +%last% 0.txt
为
pts_time=2.632682
pts_time=2.766016
pts_time=2.699349
pts_time=2.666016
pts_time=2.732682
pts_time=2.932682
pts_time=2.832682
pts_time=2.799349
pts_time=2.866016
pts_time=2.899349
···
ffprobe -v quiet -show_packets -select_streams v test_output-1.mp4 | findstr pts_time > 1.txt
for /l %l in (1,1,10) do @for /f “tokens=1,2* delims=:” %a in (‘findstr /n /r “^” 1.txt ^| findstr /r “^%l:”’) do @echo %b
···
为
pts_time=2.966016
pts_time=3.099349
pts_time=3.032682
pts_time=2.999349
pts_time=3.066016
pts_time=3.232682
pts_time=3.166016
pts_time=3.132682
pts_time=3.199349
pts_time=3.366016
可以看出 test_output-0.mp4的最后一帧时间戳为 2.932682
test_output-1.mp4的第一帧时间戳为 2.966016
是相邻的
- 生成 ffconcat格式的索引文件
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type ffconcat -segment_list output.lst test_output-%d.mp4
生成的 output.lst 内容如下:
D:\_Video>type output.lst
ffconcat version 1.0
file test_output-0.mp4
file test_output-1.mp4
file test_output-2.mp4
file test_output-3.mp4
file test_output-4.mp4
file test_output-5.mp4
file test_output-6.mp4
file test_output-7.mp4
file test_output-8.mp4
file test_output-9.mp4
file test_output-10.mp4
file test_output-11.mp4
file test_output-12.mp4
file test_output-13.mp4
file test_output-14.mp4
file test_output-15.mp4
- 生成FLAT格式索引文件
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type flat -segment_list filelist.txt test_output-%d.mp4
生成的 filelist.txt的内容如下:
D:\_Video>type filelist.txt
test_output-0.mp4
test_output-1.mp4
test_output-2.mp4
test_output-3.mp4
test_output-4.mp4
test_output-5.mp4
test_output-6.mp4
test_output-7.mp4
test_output-8.mp4
test_output-9.mp4
test_output-10.mp4
test_output-11.mp4
test_output-12.mp4
test_output-13.mp4
test_output-14.mp4
test_output-15.mp4
- 生成 csv格式索引文件
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type csv -segment_list filelist.csv test_output-%d.mp4
生成的 filelist.txt的内容如下:
D:\_Video>type filelist.csv
test_output-0.mp4,0.000000,2.966667
test_output-1.mp4,2.966667,4.833333
test_output-2.mp4,4.833333,6.866667
test_output-3.mp4,6.866667,8.833333
test_output-4.mp4,8.833333,11.133333
test_output-5.mp4,11.133333,14.466667
test_output-6.mp4,14.466667,17.133333
test_output-7.mp4,17.133333,19.566667
test_output-8.mp4,19.566667,21.300000
test_output-9.mp4,21.300000,24.366667
test_output-10.mp4,24.366667,27.666667
test_output-11.mp4,27.666667,29.466667
test_output-12.mp4,29.466667,31.300000
test_output-13.mp4,31.300000,33.566667
test_output-14.mp4,33.566667,35.866667
test_output-15.mp4,35.866667,37.466667
- 生成 M3U8索引文件
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type m3u8 -segment_list output.m3u8 test_output-%d.mp4
生成的 output.m3u8 的内容如下:
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:4
#EXTINF:2.966667,
test_output-0.mp4
...
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 -reset_timestamps 1 test_output-%d.mp4
ffprobe -v quiet -show_packets -select_streams v test_output-1.mp4 | findstr pts_time > 1.txt
发现test_output_1.mp4的其实时间戳已经变为了0
pts_time=0.000000
pts_time=0.133333
pts_time=0.066667
pts_time=0.033333
pts_time=0.100000
ffmpeg -i input.mp4 -c copy -f segment -segment_format mp4 -segment_times 3,9,12 test_output-%d.mp4
所有查看切片视频文件,前三片的duration几乎为 3s/6s/3s
4.5.3 使用ss与t参数切片
- 使用ss指定剪切开头
ffmpeg -ss 8 -i input.mp4 -c copy output.ts
从第8s位置开始切片,随后查看原始视频和切片后视频,duration相差几乎8s
D:\_Video>ffprobe -v quiet -show_format input.mp4 | findstr duration
duration=37.400000D:\_Video>ffprobe -v quiet -show_format output.ts | findstr duration
duration=30.690433
- 使用 t 指定视频总长度
ffmpeg -i input.mp4 -c copy -t 10 -copyts output.ts
查看转码前后文件信息,转码后文件duration几乎为10s
D:\_Video>ffprobe -v quiet -show_format input.mp4 | findstr "start_time duration"
start_time=0.000000
duration=37.400000D:\_Video>ffprobe -v quiet -show_format output.ts | findstr "start_time duration"
start_time=1.465667
duration=10.134333
- 使用 output_ts_offset 指定输出 start_time
ffmpeg -i input.mp4 -c copy -t 10 -output_ts_offset 120 output.ts
可以看出转码后的文件的其实时间戳几乎为 120s
D:\_Video>ffprobe -v quiet -show_format input.mp4 | findstr "start_time duration"
start_time=0.000000
duration=37.400000D:\_Video>ffprobe -v quiet -show_format output.ts | findstr "start_time duration"
start_time=121.399000
duration=10.134333
4.6 视频文件的音视频流提取
4.6.1 提前AAC音频流
ffmpeg -i input.mp4 -vn -acodec copy output.aac
4.6.2 提取H.264视频流
ffmpeg -i input.mp4 -vcodec copy -an output.h264
注意:input.mp4里面的视频流必须是H.264格式才能这样做
4.6.3 提取H.265视频流
ffmpeg -i input.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc output.hevc
注意:input.mp4里面的视频流必须是H.265格式才能这样做, 另,最新ffmpeg中,不需要加 -bsf hevc_mp4toannexb 参数,内部会自动处理,将长度头转换成起始码头
4.7 系统资源使用情况
注意:
ffmpeg -re -i input.mp4 -c copy -f mpegts output.ts 不涉及转码,只涉及转封装
比命令
ffmpeg -re -i input.mp4 -vcodec libx264 -acodec copy -f mpegts output.ts 既转码又转封装
的负载要轻,后条命令需要大量的转码计算。
第5章 编码与转码
5.1 软编码 H.264
ffmpeg -h encoder=libx264 查看libx264编码的使用说明
附:
x264 window bin 下载地址
x265 window bin 下载地址
5.1.2 H.264编码举例
1. 编码器预设参数设置
x264 --fullhelp 查看preset参数包含的集中预设参数
- ultrafast 最开的编码方式
- superfast 超级快的编码方式
- veryfast 非常快的编码方式
- faster
- fast
- medium
- slow
- slower
- veryslow
- placebo
查看help中关于preset的参数
- ultrafast:--no-8x8dct --aq-mode 0 --b-adapt 0--bframes 0 --no-cabac --no-deblock--no-mbtree --me dia --no-mixed-refs--partitions none --rc-lookahead 0 --ref 1--scenecut 0 --subme 0 --trellis 0--no-weightb --weightp 0- superfast:--no-mbtree --me dia --no-mixed-refs--partitions i8x8,i4x4 --rc-lookahead 0--ref 1 --subme 1 --trellis 0 --weightp 1- veryfast:--no-mixed-refs --rc-lookahead 10--ref 1 --subme 2 --trellis 0 --weightp 1- faster:--no-mixed-refs --rc-lookahead 20--ref 2 --subme 4 --weightp 1- fast:--rc-lookahead 30 --ref 2 --subme 6--weightp 1- medium:Default settings apply.- slow:--direct auto --rc-lookahead 50 --ref 5--subme 8 --trellis 2- slower:--b-adapt 2 --direct auto --me umh--partitions all --rc-lookahead 60--ref 8 --subme 9 --trellis 2- veryslow:--b-adapt 2 --bframes 8 --direct auto--me umh --merange 24 --partitions all--ref 16 --subme 10 --trellis 2--rc-lookahead 60- placebo:--bframes 16 --b-adapt 2 --direct auto--slow-firstpass --no-fast-pskip--me tesa --merange 24 --partitions all--rc-lookahead 60 --ref 16 --subme 11--trellis 2
随后分别测试 ultrafast和medium级别的转码速度
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -b:v 2000k output_ultrafast.mp4
转码速度约为10.1倍速
frame= 1122 fps=304 q=-1.0 Lsize= 10989kB time=00:00:37.36 bitrate=2409.1kbits/s speed=10.1x
video:10369kB audio:587kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.294363%
[libx264 @ 0000028a77241340] frame I:5 Avg QP:19.80 size: 33589
[libx264 @ 0000028a77241340] frame P:1117 Avg QP:21.62 size: 9355
[libx264 @ 0000028a77241340] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0000028a77241340] mb P I16..4: 4.5% 0.0% 0.0% P16..4: 22.2% 0.0% 0.0% 0.0% 0.0% skip:73.4%
[libx264 @ 0000028a77241340] final ratefactor: 25.50
[libx264 @ 0000028a77241340] coded y,uvDC,uvAC intra: 46.1% 26.5% 5.1% inter: 12.1% 4.1% 0.1%
[libx264 @ 0000028a77241340] i16 v,h,dc,p: 47% 26% 11% 16%
[libx264 @ 0000028a77241340] i8c dc,h,v,p: 56% 20% 18% 5%
[libx264 @ 0000028a77241340] kb/s:2271.13
[aac @ 0000028a771003c0] Qavg: 1228.998
再测试 medium基本的转码,转码速度约为2.43倍速
ffmpeg -i input.mp4 -c:v libx264 -preset medium -b:v 2000k output_medium.mp4
frame= 1122 fps= 73 q=-1.0 Lsize= 11075kB time=00:00:37.30 bitrate=2432.4kbits/s speed=2.43x
video:10447kB audio:587kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.368136%
[libx264 @ 0000021dc16a1740] frame I:36 Avg QP: 4.22 size: 43106
[libx264 @ 0000021dc16a1740] frame P:343 Avg QP: 6.77 size: 17844
[libx264 @ 0000021dc16a1740] frame B:743 Avg QP:10.07 size: 4071
[libx264 @ 0000021dc16a1740] consecutive B-frames: 5.1% 15.7% 12.6% 66.7%
[libx264 @ 0000021dc16a1740] mb I I16..4: 62.8% 18.4% 18.8%
[libx264 @ 0000021dc16a1740] mb P I16..4: 2.0% 5.4% 3.6% P16..4: 13.4% 8.2% 6.0% 0.0% 0.0% skip:61.5%
[libx264 @ 0000021dc16a1740] mb B I16..4: 0.1% 0.5% 0.5% B16..8: 12.4% 3.9% 1.5% direct: 1.3% skip:79.8% L0:49.7% L1:37.7% BI:12.5%
[libx264 @ 0000021dc16a1740] final ratefactor: 12.31
[libx264 @ 0000021dc16a1740] 8x8 transform intra:35.5% inter:49.4%
[libx264 @ 0000021dc16a1740] coded y,uvDC,uvAC intra: 58.3% 38.9% 24.9% inter: 8.1% 3.3% 1.1%
[libx264 @ 0000021dc16a1740] i16 v,h,dc,p: 81% 10% 4% 5%
[libx264 @ 0000021dc16a1740] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 19% 11% 4% 4% 6% 5% 7% 6%
[libx264 @ 0000021dc16a1740] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 24% 10% 5% 6% 6% 6% 6% 5%
[libx264 @ 0000021dc16a1740] i8c dc,h,v,p: 68% 16% 14% 3%
[libx264 @ 0000021dc16a1740] Weighted P-Frames: Y:2.9% UV:1.5%
[libx264 @ 0000021dc16a1740] ref P L0: 65.9% 9.7% 15.8% 8.5% 0.1%
[libx264 @ 0000021dc16a1740] ref B L0: 84.2% 13.1% 2.7%
[libx264 @ 0000021dc16a1740] ref B L1: 98.2% 1.8%
[libx264 @ 0000021dc16a1740] kb/s:2288.19
[aac @ 0000021dbf7ab280] Qavg: 1228.998
对比生成的转码文件,medium比ultrafast的画质会稍微好点
由于原始视频画质太差,好的不太明显
2. H.264编码优化
除了preset参数,还有 tune 参数,即
film 用于高质量的电脑内容,使用低强度的deblocking
animation 用于动画片,使用高强度的deblocking和更多的参考帧
grain 保留老的,有颗粒的电影素材中的颗粒结构
stillimage 适用于类似幻灯片这种变换较慢的内容
psnr
ssim
fastdecode 允许通过禁止某些过滤器、CABAC等来加速解码
zerolatency 适用于快速编码和低延时流媒体。
- film (psy tuning):--deblock -1:-1 --psy-rd <unset>:0.15
- animation (psy tuning):--bframes {+2} --deblock 1:1--psy-rd 0.4:<unset> --aq-strength 0.6--ref {Double if >1 else 1}
- grain (psy tuning):--aq-strength 0.5 --no-dct-decimate--deadzone-inter 6 --deadzone-intra 6--deblock -2:-2 --ipratio 1.1--pbratio 1.1 --psy-rd <unset>:0.25--qcomp 0.8
- stillimage (psy tuning):--aq-strength 1.2 --deblock -3:-3--psy-rd 2.0:0.7
- psnr (psy tuning):--aq-mode 0 --no-psy
- ssim (psy tuning):--aq-mode 2 --no-psy
- fastdecode:--no-cabac --no-deblock --no-weightb--weightp 0
- zerolatency:--bframes 0 --force-cfr --no-mbtree--sync-lookahead 0 --sliced-threads--rc-lookahead 0
3. H.264的profile和level设置
profile涉及的编码参数为
- baseline:--no-8x8dct --bframes 0 --no-cabac--cqm flat --weightp 0No interlaced.No lossless.
- main:--no-8x8dct --cqm flatNo lossless.
- high:No lossless.
- high10:No lossless.Support for bit depth 8-10.
- high422:No lossless.Support for bit depth 8-10.Support for 4:2:0/4:2:2 chroma subsampling.
- high444:Support for bit depth 8-10.Support for 4:2:0/4:2:2/4:4:4 chroma subsampling.
ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline -level 3.1 output_baseline.ts
ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level 3.1 output_high.ts
查看两次生成的码流的B帧情况
统计码流B帧数量
D:\_Video>ffprobe -v quiet -show_frames -select_streams v output_baseline.ts | findstr "pict_type=B" | find /c /v ""
0D:\_Video>ffprobe -v quiet -show_frames -select_streams v output_high.ts | findstr "pict_type=B" | find /c /v ""
743
4. 控制场景切换时关键帧的插入
ffmpeg -i input.mp4 -c:v libx264 -g 50 -t 60 output.mp4
ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 -y output2.mp4
查看I帧间隔信息
D:\_Video>ffprobe -v quiet -select_streams v -show_packets -i output.mp4 | findstr /N "K__"
12:flags=K__
272:flags=K__
610:flags=K__
1143:flags=K__
1351:flags=K_
...D:\_Video>ffprobe -v quiet -select_streams v -show_packets -i output2.mp4 | findstr /N "K__"
12:flags=K__
662:flags=K__
1312:flags=K__
1962:flags=K__
2612:flags=K__
3262:flags=K__
可以看出,后者生成的码流的I帧间隔更均匀,每隔 650/13=50帧出现一个I帧
因为前者遇到场景切换时会自动插入IDR帧,后者的 sc_threshold 0 关闭了场景切换判定
13的来由,每个PACKET的信息占13行
[PACKET]
codec_type=video
stream_index=0
pts=0
pts_time=0.000000
dts=-1024
dts_time=-0.066667
duration=512
duration_time=0.033333
size=8368
pos=48
flags=K__
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=512
pts_time=0.033333
dts=-512
dts_time=-0.033333
duration=512
duration_time=0.033333
size=268
pos=8416
flags=___
[/PACKET]
5. 设置x264内部参数
ffmpeg -i input.mp4 -vframes 500 -c:v libx264 -x264-params “bframes=0” -g 50 -sc_threshold 0 output_nb.mp4
转码过程中,可以看到没有生成B帧
[libx264 @ 00000244b9931740] frame I:10 Avg QP:14.86 size: 11698
[libx264 @ 00000244b9931740] frame P:490 Avg QP:21.12 size: 2144
[libx264 @ 00000244b9931740] mb I I16..4: 62.9% 28.4% 8.7%
[libx264 @ 00000244b9931740] mb P I16..4: 2.0% 3.6% 0.6% P16..4: 11.3% 1.9% 0.6% 0.0% 0.0% skip:79.9%
[libx264 @ 00000244b9931740] 8x8 transform intra:50.5% inter:81.2%
ffmpeg -i input.mp4 -vframes 500 -c:v libx264 -x264-params “bframes=3:b-adapt=0” -g 20 -sc_threshold 0 output_b.mp4
6. CBR设置
P152 TODO
相关文章:
【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…...
2025.1.26机器学习笔记:C-RNN-GAN文献阅读
2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目: C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊: NIPS作者: Olof Mogren发表时间…...
嵌入式蓝桥杯电子赛嵌入式(第14届国赛真题)总结
打开systic 生成工程编译查看是否有问题同时打开对应需要的文档 修改名称的要求 5.简单浏览赛题 选择题,跟单片机有关的可以查相关手册 答题顺序 先从显示开始看 1,2 所以先打开PA1的定时器这次选TIM2 从模式、TI2FP2二通道、内部时钟、1通道设为直接2通道设置…...
【机器学习】深入探索SVM:支持向量机的原理与应用
目录 🍔 SVM引入 1.1什么是SVM? 1.2支持向量机分类 1.3 线性可分、线性和非线性的区分 🍔 小结 学习目标 知道SVM的概念 🍔 SVM引入 1.1什么是SVM? 看一个故事,故事是这样子的: 在很久以前的情人节…...
Leetcode40: 组合总和 II
题目描述: 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 代码思路ÿ…...
项目测试之MockMvc
文章目录 基础基础概念Mockxxx一般实现文件位置 实战MockMvc与Test注解不兼容RequestParams参数RequestBody参数 基础 基础概念 定义:是Spring框架提供的一种用于测试Spring MVC控制器的工具,它允许开发者在不启动完整的web服务器的情况下,…...
网易Android开发面试题200道及参考答案 (下)
说明原码、反码、补码的概念 原码:是一种简单的机器数表示法。对于有符号数,最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值。比如,对于 8 位二进制数,+5 的原码是 00000101,-5 的原码是 10000101。原码的优点是直观,容易理解,但在进行加减法运算时,…...
PHP根据IP地址获取地理位置城市和经纬度信息
/** 根据IP地址 获取地理位置*/ function getLocationByIP($ip) {$url "http://ip-api.com/json/{$ip}?langzh-CN&fieldsstatus,message,country,countryCode,region,regionName,city,lat,lon,timezone,isp,org,as";$response file_get_contents($url);$data …...
AI Agent的多轮对话:提升用户体验的关键技巧
在前面的文章中,我们讨论了 AI Agent 的各个核心系统。今天,我想聊聊如何实现一个好用的多轮对话系统。说实话,这个话题我琢磨了很久,因为它直接影响到用户体验。 从一个槽点说起 还记得我最开始做对话系统时的一个典型场景&…...
在docker上部署nacos
一、首先下载nacos的docker镜像 docker pull nacos:2.5.0 二、然后下载nacos的安装包,这里是为了拿到他的配置文件。下载完解压缩后,以备后用 https://download.nacos.io/nacos-server/nacos-server-2.5.0.zip?spm5238cd80.6a33be36.0.0.2eb81e5d7mQ…...
ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载
AI修复老照片,试试吧,不一定好~~哈哈 2023年4月曾用过ComfyUI,当时就感慨这个工具和虚幻的蓝图很像,以后肯定是专业人玩的。 2024年我写代码去了,AI做图没太关注,没想到,现在ComfyUI真的变成了工…...
Win11画图工具没了怎么重新安装
有些朋友想要简单地把图片另存为其他格式,或是进行一些编辑,但是发现自己的Win11系统里面没有画图工具,这可能是因为用户安装的是精简版的Win11系统,解决方法自然是重新安装一下画图工具,具体应该怎么做呢?…...
Git Bash 配置 zsh
博客食用更佳 博客链接 安装 zsh 安装 Zsh 安装 Oh-my-zsh github仓库 sh -c "$(curl -fsSL https://install.ohmyz.sh/)"让 zsh 成为 git bash 默认终端 vi ~/.bashrc写入: if [ -t 1 ]; thenexec zsh fisource ~/.bashrc再重启即可。 更换主题 …...
《STL基础之hashtable》
【hashtable导读】STL为大家提供了丰富的容器,hashtable也是值得大家学习和掌握的基础容器,而且面试官经常会把它和hashmap混在一起,让同学们做下区分。因此关于hashtable的一些特性,比如:底层的数据结构、插入、查找元…...
Vue3组件重构实战:从Geeker-Admin拆解DataTable的最佳实践
一、前言 背景与动机 在当前的开发实践中,我们选择了开源项目 Geeker-Admin 作为前端框架的二次开发基础。其内置的 ProTable.vue 组件虽然提供了一定程度的开箱即用性,但在实际业务场景中逐渐暴露出设计上的局限性,尤其是其将 搜索条件表单…...
小智 AI 聊天机器人
小智 AI 聊天机器人 (XiaoZhi AI Chatbot) 👉参考源项目复现 👉 ESP32SenseVoiceQwen72B打造你的AI聊天伴侣!【bilibili】 👉 手工打造你的 AI 女友,新手入门教程【bilibili】 项目目的 本…...
关于圆周率的新认知
从自然对数底 的泰勒展开, 可以得出 的展开式, 它可以被认为是,以 0 为周期的单位 1 ,以 1 为周期的单位 1 ,以 2 为周期的单位 1 等所有自然数为周期的单位 1 分阶段合成(体现为阶乘的倒数)之…...
【趋势】《2024—2026金融科技十大趋势预测》一览
本白皮书基于新华三在金融行业的前沿实践和IDC的全球研究成果,深入分析了金融科技领域的十大关键趋势,旨在为金融机构提供前瞻性的战略指导和业务创新的参考。 导言 当前,在地缘政治冲突加剧、商业经济市场环境高度不确定、数字化业务加速发展的背景下,金融行业处于深度变…...
vim 中粘贴内容时提示: -- (insert) VISUAL --
目录 问题现象:解决方法:问题原因: 问题现象: 使用 vim 打开一个文本文件,切换到编辑模式后,复制内容进行粘贴时有以下提示: 解决方法: 在命令行模式下禁用鼠标支持 :set mouse …...
CAPL高级应用
CAPL高级应用 目录 CAPL高级应用1. 引言2. 多线程编程2.1 多线程编程简介2.2 多线程编程实现3. 数据库操作3.1 数据库操作简介3.2 数据库操作实现4. 网络通信4.1 网络通信简介4.2 网络通信实现5. 案例说明5.1 案例1:多线程编程实现5.2 案例2:数据库操作实现5.3 案例3:网络通…...
基于微信小程序的网上订餐管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
python的设计模式
设计模式是解决软件设计中常见问题的可重用解决方案。Python 作为一种灵活且强大的编程语言,支持多种设计模式的实现。以下是 Python 中常见的几种设计模式及其示例: 1. 单例模式(Singleton Pattern) 确保一个类只有一个实例&…...
EventBus事件总线的使用以及优缺点
EventBus EventBus (事件总线)是一种组件通信方法,基于发布/订阅模式,能够实现业务代码解耦,提高开发效率 发布/订阅模式 发布/订阅模式是一种设计模式,当一个对象的状态发生变化时,所有依赖…...
C++解决走迷宫问题:DFS、BFS算法应用
文章目录 思路:DFSBFSBFS和DFS的特点BFS 与 DFS 的区别BFS 的优点BFS 时间复杂度深度优先搜索(DFS)的优点深度优先搜索(DFS)的时间复杂度解释:空间复杂度总结:例如下面的迷宫: // 迷宫的表示:0表示可以走,1表示障碍 vector<vector<int>> maze = {{0, 0,…...
2025春招 SpringCloud 面试题汇总
大家好,我是 V 哥。SpringCloud 在面试中属于重灾区,不仅是基础概念、组件细节,还有高级特性、性能优化,关键是项目实践经验的解决方案,都是需要掌握的内容,正所谓打有准备的仗,秒杀面试官&…...
PostGIS笔记:PostgreSQL 数据库与用户 基础操作
数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异,只是说在 Windows 上虽然也能运行良好,但在性能、稳定性、功能扩展等方面&#x…...
Selenium配合Cookies实现网页免登录
文章目录 前言1 方案一:使用Chrome用户数据目录2 方案二:手动获取并保存Cookies,后续使用保存的Cookies3 注意事项 前言 在进行使用Selenium进行爬虫、网页自动化操作时,登录往往是一个必须解决的问题,但是Selenium每次…...
HarmonyOS简介:HarmonyOS核心技术理念
核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架,通过多层次的开放能力提供统一接入标准,实现三方框架快速…...
Unity URP 获取/设置 Light-Indirect Multiplier
Unity URP 获取/设置 Light-Indirect Multiplier 他喵的代码的字段名称叫:bounceIntensity ~~~~~~...
计算机网络 (60)蜂窝移动通信网
一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于,将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域,称为蜂窝小区。每个小区设置一个基站,负责本小区内移…...
解决.NET程序通过网盘传到Linux和macOS不能运行的问题
问题描述:.net程序用U盘传到虚拟机macOS和Linux可以正常运行,但是网盘传过去就不行。 解决方法: 这是文件权限的问题。当你通过U盘将文件传输到虚拟机的macOS和Linux系统时,文件的权限和所有权可能得到了保留或正确设置。但如果…...
LeetCode | 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1…...
渗透测试技法之口令安全
一、口令安全威胁 口令泄露途径 代码与文件存储不当:在软件开发和系统维护过程中,开发者可能会将口令以明文形式存储在代码文件、配置文件或注释中。例如,在开源代码托管平台 GitHub 上,一些开发者由于疏忽,将包含数据…...
【C语言】main函数解析
一、前言 在学习编程的过程中,我们很早就接触到了main函数。在Linux系统中,当你运行一个可执行文件(例如 ./a.out)时,如果需要传入参数,就需要了解main函数的用法。本文将详细解析main函数的参数ÿ…...
Vue3笔记——(二)
015 生命周期 组件的生命周期: 【时刻】 【调用特定的函数】 vue2生命周期 创建 beforeCreate、 created 挂载 beforeMounte、mounted 更新 beforeUpdate、updated 销毁 beforeDestroy、destroyed 生命周期、生命周期函数、生命周期钩子 vue3生命周期 创建 setup 挂…...
linux文件I/O
open 用于打开一个文件并返回一个文件描述符。文件描述符是一个整数,它在后续的文件操作中用于标识文件。 原型: int open(const char *pathname, int flags, mode_t mode);pathname:要打开的文件的路径flags:指定文件打开方式…...
利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)
Problem: 19. 删除链表的倒数第 N 个结点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲找到倒数第k个节点,即是找到正数的第n-k1、其中n为单链表中节点的个数个节点。 2.为实现只遍历一次单链表,我们先可以使一个指针p1指向链表头部再让其先走k步…...
MySQL 8 不开通 CLONE 插件,建立主从关系
文章目录 前言一、主库操作二、从库操作三、主库操作四、测试总结 前言 MySQL 版本:8.0.36 MySQL 8 通过 CLONE 插件,搭建主从数据库详情参考链接文章 主库不开通 CLONE 插件,如何建立主从关系呢?本文简单介绍一下 一、主库操作…...
活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!
Code Without Barriers 上海活动回顾 Code Without Barriers:AI & DATA 深入探索人工智能与数据如何变革行业 2025年1月16日,微软开发者社区 Code Without Barriers (CWB)携手 She Rewires 她原力在大中华区的首场活动“AI &…...
Direct Preference Optimization (DPO): 一种无需强化学习的语言模型偏好优化方法
论文地址:https://arxiv.org/pdf/2305.18290 1. 背景与挑战 近年来,大规模无监督语言模型(LM)在知识获取和推理能力方面取得了显著进展,但如何精确控制其行为仍是一个难题。 现有的方法通常通过**强化学习从人类反馈&…...
搜狐Android开发(安卓)面试题及参考答案
ViewModel 的作用及原理是什么? ViewModel 是 Android 架构组件中的一部分,主要作用是在 MVVM 架构中充当数据与视图之间的桥梁。它负责为视图准备数据,并处理与数据相关的业务逻辑,让视图(Activity、Fragment 等)专注于展示数据和与用户交互。比如在一个新闻应用中,Vie…...
蓝牙的一些基础知识(TODO)
前阵工作中遇到的。 iOS 和 iPadOS 支持的蓝牙描述文件 - 官方 Apple 支持 (中国) 在树莓派上定制蓝牙 Profile 通常需要修改或创建自定义的 Bluetooth 服务 (Profile) 来实现特定的功能,例如定制 Audio Sink、HID(Human Interface Device)、…...
Redis实战(黑马点评)——涉及session、redis存储验证码,双拦截器处理请求
项目整体介绍 数据库表介绍 基于session的短信验证码登录与注册 controller层 // 获取验证码PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {return userService.sendCode(phone, session);}// 获…...
WPF常见面试题解答
以下是WPF(Windows Presentation Foundation)面试中常见的问题及解答,涵盖基础概念、高级功能和实际应用,帮助你更好地准备面试: 基础概念 什么是WPF? WPF是微软开发的用于构建桌面应用程序的UI框架&#x…...
Nginx前端后端共用一个域名如何配置
在 Nginx 中配置前端和后端共用一个域名的情况,通常是通过路径或子路径将请求转发到不同的服务。以下是一个示例配置,假设: 前端静态文件在 /var/www/frontend/。 后端 API 服务运行在 http://127.0.0.1:5000。 域名是 example.comÿ…...
DeepSeek-R1-Distill-Qwen-1.5B:最佳小型LLM?
DeepSeek掀起了生成式AI领域的风暴。 首先推出DeepSeek-v3,现在推出DeepSeek-R1,这两款模型都打破了所有基准,并且完全开源。 但今天我们不是在讨论这两款超级模型,而是讨论DeepSeek-R1的一个蒸馏版本——DeepSeek-R1-Distill-Qwen-1.5B,它可能是今天被低估的版本,虽然…...
wampserver + phpstrom 调试配置
step 1 点击任务栏wampserver图标->php->php.ini[apache module] 在文件最后面,确保这些值被定义且跟以下的一样 xdebug.mode debug xdebug.start_with_request yes xdebug.client_port 9003 xdebug.client_host 127.0.0.1step 2 按如下配置 step3 下断点,运行即…...
MySQL分表自动化创建的实现方案(存储过程、事件调度器)
《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略,它将数据分散存储在多…...
RabbitMQ 架构分析
文章目录 前言一、RabbitMQ架构分析1、Broker2、Vhost3、Producer4、Messages5、Connections6、Channel7、Exchange7、Queue8、Consumer 二、消息路由机制1、Direct Exchange2、Topic Exchange3、Fanout Exchange4、Headers Exchange5、notice5.1、备用交换机(Alter…...
Spring Boot 无缝集成SpringAI的函数调用模块
这是一个 完整的 Spring AI 函数调用实例,涵盖从函数定义、注册到实际调用的全流程,以「天气查询」功能为例,结合代码详细说明: 1. 环境准备 1.1 添加依赖 <!-- Spring AI OpenAI --> <dependency><groupId>o…...