Skip to content

编码功能

本节介绍 mpv 的视频转码和编码功能。

基本编码

输出到文件

bash
# 编码到文件
mpv input.mp4 --o=output.mp4

# 指定编码器
mpv input.mp4 --o=output.mp4 --ovc=libx264

编码选项

bash
# 视频编码器
--ovc=libx264
--ovc=libx265
--ovc=libvpx-vp9

# 音频编码器
--oac=libmp3lame
--oac=aac
--oac=libopus

# 输出格式
--of=mp4
--of=mkv
--of=webm

视频编码

H.264 编码

bash
# H.264 编码
mpv input.mp4 --o=output.mp4 --ovc=libx264 --ovcopts=preset=medium,crf=23

# 预设选项
--ovcopts=preset=ultrafast
--ovcopts=preset=superfast
--ovcopts=preset=veryfast
--ovcopts=preset=faster
--ovcopts=preset=fast
--ovcopts=preset=medium
--ovcopts=preset=slow
--ovcopts=preset=slower
--ovcopts=preset=veryslow

# CRF 值 (质量)
--ovcopts=crf=18  # 高质量
--ovcopts=crf=23  # 默认
--ovcopts=crf=28  # 低质量

H.265 编码

bash
# H.265 编码
mpv input.mp4 --o=output.mp4 --ovc=libx265 --ovcopts=preset=medium,crf=28

# H.265 选项
--ovcopts=preset=medium
--ovcopts=crf=28
--ovcopts=x265-params=log-level=error

VP9 编码

bash
# VP9 编码
mpv input.mp4 --o=output.webm --ovc=libvpx-vp9 --ovcopts=crf=31,b=0

# VP9 选项
--ovcopts=crf=31
--ovcopts=b=0
--ovcopts=threads=4

AV1 编码

bash
# AV1 编码
mpv input.mp4 --o=output.mp4 --ovc=libsvtav1 --ovcopts=crf=30

# AV1 选项
--ovcopts=crf=30
--ovcopts=preset=6

音频编码

MP3 编码

bash
# MP3 编码
mpv input.mp4 --o=output.mp3 --oac=libmp3lame --oacopts=b=192k

# MP3 选项
--oacopts=b=128k
--oacopts=b=192k
--oacopts=b=320k

AAC 编码

bash
# AAC 编码
mpv input.mp4 --o=output.mp4 --oac=aac --oacopts=b=192k

# AAC 选项
--oacopts=b=128k
--oacopts=b=192k
--oacopts=b=256k

Opus 编码

bash
# Opus 编码
mpv input.mp4 --o=output.opus --oac=libopus --oacopts=b=128k

# Opus 选项
--oacopts=b=64k
--oacopts=b=128k
--oacopts=b=192k

编码滤镜

视频滤镜

bash
# 缩放
mpv input.mp4 --o=output.mp4 --vf=lavfi=[scale=1280:720]

# 裁剪
mpv input.mp4 --o=output.mp4 --vf=lavfi=[crop=1280:720:0:0]

# 去噪
mpv input.mp4 --o=output.mp4 --vf=lavfi=[hqdn3d]

# 锐化
mpv input.mp4 --o=output.mp4 --vf=lavfi=[unsharp]

音频滤镜

bash
# 音量调整
mpv input.mp4 --o=output.mp4 --af=lavfi=[volume=0.5]

# 均衡器
mpv input.mp4 --o=output.mp4 --af=lavfi=[equalizer=f=1000:width_type=h:width=200:g=-10]

# 压缩器
mpv input.mp4 --o=output.mp4 --af=lavfi=[acompressor]

编码预设

预设配置

bash
# 高质量编码
profile=high-quality
ovc=libx264
ovcopts=preset=slow,crf=18

# 快速编码
profile=fast
ovc=libx264
ovcopts=preset=fast,crf=23

# 低文件大小
profile=small-file
ovc=libx265
ovcopts=preset=slow,crf=28

自定义预设

bash
# 创建预设文件
# ~/.config/mpv/encoding.conf
[high-quality]
ovc=libx264
ovcopts=preset=slow,crf=18
oac=aac
oacopts=b=192k

[fast]
ovc=libx264
ovcopts=preset=fast,crf=23
oac=aac
oacopts=b=128k

编码脚本

Lua 脚本示例

lua
-- 批量编码脚本
local mp = require 'mp'

local function encode_file(input, output, profile)
    mp.command(string.format(
        'mpv "%s" --o="%s" --profile="%s"',
        input, output, profile
    ))
end

-- 编码当前文件
mp.add_key_binding('ctrl+e', 'encode-current', function()
    local input = mp.get_property('path')
    local output = input:gsub('%..+$', '_encoded.mp4')
    
    encode_file(input, output, 'high-quality')
    mp.osd_message('编码完成: ' .. output)
end)

JavaScript 脚本示例

javascript
// 批量编码脚本
mp.add_key_binding('ctrl+e', 'encode-current', function() {
    const input = mp.get_property('path');
    const output = input.replace(/\.[^.]+$/, '_encoded.mp4');
    
    // 注意:JavaScript 中无法直接执行命令
    mp.osd_message('编码功能需要 Lua 脚本');
});

编码调试

编码信息

bash
# 显示编码信息
mpv --msg-level=all=v input.mp4 --o=output.mp4

# 显示编码统计
mpv --stats input.mp4 --o=output.mp4

编码测试

bash
# 测试编码
mpv --start=0 --end=10 input.mp4 --o=test.mp4

# 测试编码质量
mpv --start=0 --end=10 input.mp4 --o=test.mp4 --ovcopts=preset=slow,crf=18

编码故障排除

常见问题

  1. 编码失败

    • 检查编码器是否可用:mpv --ovc=help
    • 检查输出格式:mpv --of=help
  2. 编码速度慢

    • 使用快速预设:--ovcopts=preset=fast
    • 减少线程数:--ovcopts=threads=4
  3. 编码质量差

    • 降低 CRF 值:--ovcopts=crf=18
    • 使用慢速预设:--ovcopts=preset=slow

调试命令

bash
# 显示编码信息
mpv --msg-level=all=v input.mp4 --o=output.mp4

# 显示编码统计
mpv --stats input.mp4 --o=output.mp4

下一步