AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1261385
Accepted
Metallizer
Metallizer
Asked: 2020-07-24 03:30:43 +0800 CST2020-07-24 03:30:43 +0800 CST 2020-07-24 03:30:43 +0800 CST

批量 FFmpeg 编码 - 基于比特率的可变 CRF

  • 772

我在运行 Ubuntu 的 VM 实例中使用 ffmpeg 将我从各种流媒体站点下载的一些视频编码到 HEVC。目前我使用 bash 脚本来转换目录中的所有这些文件。这些视频的总比特率在 300 kb/s 到 1500 kb/s 之间变化。在我的测试中,对所有这些视频使用相同的 CRF 会在高比特率视频的情况下产生更大的输出文件,或者在低比特率的情况下产生低质量的视频。目前我手动检查比特率并将类似的比特率文件移动到一个目录并每次都相应地更改 CRF。这是我用来检索比特率的命令:

find . -name "*.mp4" -print0 | xargs -0 -i{} sh -c " echo -n '{} ' && ffmpeg -i '{}' 2>&1 | sed -n -e 's/^.*bitrate: //p' "

这是 bash 脚本。

#!/bin/bash -e
for i in ~/ffmpeg/*.mp4;    
do    
ffmpeg -i "$i" -c:v libx265 -crf 26 -c:a libopus -b:a 48k -vbr on -compression_level 10 -frame_duration 60 -application audio "${i%.*}.mkv"    
mv "${i%.*}.mkv" ~/ffmpeg/hevc    
rm -f -- "$i"    
done

如何根据此 bash 脚本中的比特率范围动态更改 CRF?比如,如果总比特率高于 950 = crf 26,如果总比特率在 750 到 949 之间 = crf 24,如果总比特率在 500 到 749 之间 = crf 22,如果总比特率低于 499 = crf 18。

scripts command-line bash ffmpeg encoding
  • 1 1 个回答
  • 1076 Views

1 个回答

  • Voted
  1. Best Answer
    pa4080
    2020-07-24T05:01:25+08:002020-07-24T05:01:25+08:00

    这是 - 您的想法组合成一个脚本:

    #!/bin/bash
    
    # Script name: /usr/local/bin/ffscript.sh
    # Usage:       go into the source directory and execute `ffscript.sh`  
                                                                                          
    for file in *.mp4
    do
            # Use command substitution `$()` in order to get the bit rate of the mp4 file as variable
            BIT_RATE=$(ffmpeg -i "$file" 2>&1 | sed -n -e 's/^.*bitrate: //p' | sed -r 's#([0-9]+)\skb/s#\1#')
            echo; echo "$BIT_RATE"
    
            SRC_FILE="$file"
            NEW_FILE="${file%.*}.mkv"
    
            if   (( BIT_RATE > 950 )); then CFR='26'
            elif (( BIT_RATE > 750 )); then CFR='24'
            elif (( BIT_RATE > 500 )); then CFR='22'
            else CFR='18'; fi
    
            echo "$CFR";
    
            # Remove the leading echo below in order to do the actions
            echo ffmpeg -i "$SRC_FILE" -c:v libx265 -crf "$CFR" -c:a libopus -b:a 48k -vbr on -compression_level 10 -frame_duration 60 -application audio "$NEW_FILE"
            echo mv "$NEW_FILE" ~/ffmpeg/hevc/
            echo rm -f -- "$SRC_FILE"
    done
    
    • 5

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve