RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1609084
Accepted
Дмитрий Варзанов
Дмитрий Варзанов
Asked:2025-03-21 17:12:34 +0000 UTC2025-03-21 17:12:34 +0000 UTC 2025-03-21 17:12:34 +0000 UTC

视频编码,顺序,输入文件=前一个流数据

  • 772
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

他们说流不存在,我尝试了许多不同的命令,但都出现相同的错误。

ffmpeg
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    Intelligent Shade of Blue
    2025-03-22T00:48:26Z2025-03-22T00:48:26Z

    这不是一个完整的答案,但它可能会给你所需要的推动力......你可以使用-filter_complex:

    ffmpeg -i earth.mp4 -filter_complex "
        [0:v]scale=-1:360,split=2[u360][v360];
        [u360]scale=-1:240,split=2[u240][v240];
        [u240]scale=-1:144[v144]" \
    -map "[v360]" -c:v h264 v360.mkv \
    -map "[v240]" -c:v h264 v240.mkv \
    -map "[v144]" -c:v h264 v144.mkv
    

    工作原理:获取原始流并将其高度缩小至 360 像素 (u360)。我们制作了两个副本(t360 和 v360)。其中一个将被编解码器使用。我们将第二个减少到240像素(t240)。我们制作了两个副本(u240 和 v240)。 ETC。

    更新:

    要根据输入文件的分辨率有选择地选择流,我会执行以下操作:

    #!/bin/bash
    
    codec=(
        -i "$1"
        -deadline good -movflags +frag_keyframe -map_metadata -1
        -c:a libopus -b:a 128k -map a:0
        -c:v libvpx-vp9 -speed 2 -tile-columns 2 -frame-parallel 1 -pix_fmt yuv420p
    )
    stream=(
        ["2160"]="-b:v:X 8000k -minrate:v:X 6000k -maxrate:v:X 10000k -bufsize:v:X 16000k -r:v:X 30"
        ["1440"]="-b:v:X 6000k -minrate:v:X 4500k -maxrate:v:X  7500k -bufsize:v:X 12000k -r:v:X 30"
        ["1080"]="-b:v:X 4000k -minrate:v:X 3000k -maxrate:v:X  5000k -bufsize:v:X  8000k -r:v:X 30"
         ["720"]="-b:v:X 2500k -minrate:v:X 2000k -maxrate:v:X  3000k -bufsize:v:X  5000k -r:v:X 30"
         ["480"]="-b:v:X 1500k -minrate:v:X 1200k -maxrate:v:X  2000k -bufsize:v:X  4000k -r:v:X 25"
         ["360"]="-b:v:X 1000k -minrate:v:X  800k -maxrate:v:X  1500k -bufsize:v:X  3000k -r:v:X 25"
         ["240"]="-b:v:X  600k -minrate:v:X  500k -maxrate:v:X   800k -bufsize:v:X  1600k -r:v:X 25"
         ["144"]="-b:v:X  400k -minrate:v:X  300k -maxrate:v:X   600k -bufsize:v:X  1200k -r:v:X 25"
    )
    output=(
        -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
    )
    
    # stream heights sorted numerically in reverse order
    hh=$(printf "%s\n" ${!stream[@]} | sort -rn)
    # input file height
    ih=$(ffprobe -of flat -select_streams v:0 -show_entries stream=height "$1" 2>/dev/null | cut -d= -f2)
    
    filter=
    param=()
    
    n=0 # stream index
    s="0:v:0"
    for h in $hh; do
        ((h > ih)) && continue
    
        filter+="[$s]scale=-1:$h,split[u$h][v$h];"
        param+=(-map "[v$h]" `echo ${stream[$h]} | sed "s/X/$n/g"`)
        s="u$h"
        ((n++))
    done
    # remove last split, as it's not needed
    filter=$(echo $filter | sed "s/,split\[$s\]//")
    
    ffmpeg -i "$1" "${codec[@]}" -filter_complex "$filter" "${param[@]}" "${output[@]}"
    

    我认为该代码非常不言自明,因此我按原样呈现它。

    • 2

相关问题

  • 如何在 FreeBSD 13 上回滚 ffmpeg 版本?

  • 如何将两个 FFMpeg 命令合并为一个?(管道)

  • 如何在 FFmpeg 中裁剪图像?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5