ffmpeg -i /file.mp4 -deadline good -movflags +frag_keyframe -map_metadata -1
-c:a libopus -c:v libvpx-vp9 -row-mt 1 -frame-parallel 1 -pix_fmt yuv420p
-map 0:a:0 -b:a:0 128k
-map 0:v:0 -filter:v:0 scale=-1:144 -r 30 -b:v:0 60k
-map 0:v:0 -filter:v:1 scale=-1:240 -r 40 -b:v:1 150k
-map 0:v:0 -filter:v:2 scale=-1:360 -r 50 -b:v:2 276k
-init_seg_name "init-$RepresentationID$.$ext$"
-media_seg_name "sg-$RepresentationID$-$Number%05d$.$ext$"
-dash_segment_type webm
-use_template 1 -use_timeline 1 -seg_duration 9
-adaptation_sets "id=0, streams=v id=1, streams=a"
-f dash /video/manifest.mpd
我们以帧大小为 360px 的输入视频为输入,创建 3 个质量为 144、240、360 的流。
好的,成功了。
据我理解,该代码的工作原理如下。
每个流都有一个输入文件
/file.mp4 -> 144
/file.mp4 -> 240
/file.mp4 -> 360
我正在尝试加快视频编码速度,因为我的电脑性能较差,并且想尝试让每个后续流的数据都来自前一个流。这样拍摄的就不是原始视频,而是之前的流。
在这种情况下,就需要改变顺序,不是从小到大,而是从分辨率较大到较小。但是,我们如何确保从前未来中获取数据来对下一次进行编码呢?
还有一个问题,让我们假设这是可能的并且有效。我们按以下顺序编码
/file.mp4 -> 360
360 -> 240
240 -> 144
如果输入视频的高度为 240,则将视频转换为 360 将是多余的,起始分辨率将为 240。
这样的情况怎么办,排除360流量?每次编写这样的代码,排除一个线程,检查高度,是非常昂贵和可怕的......
我尝试过这样的:
f"""ffmpeg -i /uploads/test.mp4 -deadline good -movflags +frag_keyframe -map_metadata -1 \
-map 0:a:0 -c:a libopus -b:a 128k \
-c:v libvpx-vp9 -speed 2 -tile-columns 2 -frame-parallel 1 -pix_fmt yuv420p \
-filter_complex \
"[0:v:0]scale='if(gte(ih,2160),-1,iw)':'if(gte(ih,2160),2160,ih)'[v2160]; \
[v2160]scale='if(gte(ih,1440),-1,iw)':'if(gte(ih,1440),1440,ih)'[v1440]; \
[v1440]scale='if(gte(ih,1080),-1,iw)':'if(gte(ih,1080),1080,ih)'[v1080]; \
[v1080]scale='if(gte(ih,720),-1,iw)':'if(gte(ih,720),720,ih)'[v720]; \
[v720]scale='if(gte(ih,480),-1,iw)':'if(gte(ih,480),480,ih)'[v480]; \
[v480]scale='if(gte(ih,360),-1,iw)':'if(gte(ih,360),360,ih)'[v360]; \
[v360]scale='if(gte(ih,240),-1,iw)':'if(gte(ih,240),240,ih)'[v240]; \
[v240]scale='if(gte(ih,144),-1,iw)':'if(gte(ih,144),144,ih)'[v144]" \
-map "[v2160]" -b:v:0 8000k -minrate:v:0 6000k -maxrate:v:0 10000k -bufsize:v:0 16000k -r:v:0 30 \
-map "[v1440]" -b:v:1 6000k -minrate:v:1 4500k -maxrate:v:1 7500k -bufsize:v:1 12000k -r:v:1 30 \
-map "[v1080]" -b:v:2 4000k -minrate:v:2 3000k -maxrate:v:2 5000k -bufsize:v:2 8000k -r:v:2 30 \
-map "[v720]" -b:v:3 2500k -minrate:v:3 2000k -maxrate:v:3 3000k -bufsize:v:3 5000k -r:v:3 30 \
-map "[v480]" -b:v:4 1500k -minrate:v:4 1200k -maxrate:v:4 2000k -bufsize:v:4 4000k -r:v:4 25 \
-map "[v360]" -b:v:5 1000k -minrate:v:5 800k -maxrate:v:5 1500k -bufsize:v:5 3000k -r:v:5 25 \
-map "[v240]" -b:v:6 600k -minrate:v:6 500k -maxrate:v:6 800k -bufsize:v:6 1600k -r:v:6 25 \
-map "[v144]" -b:v:7 400k -minrate:v:7 300k -maxrate:v:7 600k -bufsize:v:7 1200k -r:v:7 25 \
-init_seg_name "init-\$RepresentationID\$\.\$ext\$" \
-media_seg_name "sg-\$RepresentationID\$\-\$Number%05d\$\.\$ext\$" \
-dash_segment_type webm \
-use_template 1 -use_timeline 1 -seg_duration 9 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash /manifest.mpd"""
答案有误
[out#0/dash @ 0x8456ed0] Output with label 'v2160' does not exist in any defined filter graph, or was already used elsewhere.
Error opening output file /manifest.mpd.
Error opening output files: Invalid argument
他们说流不存在,我尝试了许多不同的命令,但都出现相同的错误。