V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WesleyNZ
V2EX  ›  macOS

Mac OS 仅转格式,视频内容不变( 比如 MKV 转 mp4)的解决方法以及讨论。

  •  
  •   WesleyNZ · 2020-05-31 06:09:15 +08:00 · 3451 次点击
    这是一个创建于 1635 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我电脑里有一些 [ H264 视频编码,Vorbis 音频编码] 的 mkv 视频
    我的目标是转换这个 MKV 格式到 mp4 格式,并且可以预览,且 [声音相对于原视频无损] 。

    于是开始了折腾之路,在上一个帖子里 https://v2ex.com/t/676849#reply64
    根据 v 友遇见我尝试了如下方法:

    1.直接用 ffmpeg(brew 安装,终端命令执行,无可视化界面)转换视频,可以做到只更换容器,将 mkv 转化成 mp4.
    但是用这种方法 [原视频因为用 vorbis 编码的音频] 导致 预览 Preview 的 mp4 文件没有声音,但是打开以后可以正常播放。
    如果想实现我的目标,参数设置太复杂--划重点 因为对于每个文件 我都不知道应该怎么设置 aac 的码率,因为各个文件都不一样 你总不能都设置成最高的,这样我还要分别去测试,很麻烦。 我搜了很久也找不到办法,就算找到了 也没有批处理的办法,必须一个一个转换 所以这条路 走不通。


    2. Handbrake 是完全不支持 [仅更换容器] 的,它的每一次执行都进行了转码,这在官方文件里有。在上述帖子里有写 这条路行不通。

    3.有人推荐了 Videoproc,正好在搞活动,6 刀买入序列号。
    结果 坑爹的事情来了,图片解释一切,我简单说下:
    Videoproc 支持 [视频直接转换容器,不进行重新编码] ,然而对于 [ vorbis 音频编码部分] ,可以转化为 AAC 但是最高音质是 160kpbs,但是我的源文件音频的码率是 1061kbps,损失太大了 无法接受

    https://v2ex.com/i/0Ig7mLYG.png

    另外要序列号的留言 这软件对我来说没用了。

    4.最后是 mp4tools,使用了以后,用花了 10 刀买入了
    可以实现 [视频直接转换容器,不进行重新编码] , 而 [ vorbis 音频编码部分] 转换为 aac 文件,码率可以自选,最高可以 640kbps, 并且在我选择 640kbps 以后,如果源文件音频信息没有 640kbps 那么大 他会自动选择最高的音质,完美解决我的问题。

    https://v2ex.com/i/3Q7L36rK.jpeg

    另外谁能告诉我为什么帖子另外两张图片无法插入??
    33 条回复    2023-12-27 09:01:27 +08:00
    WesleyNZ
        1
    WesleyNZ  
    OP
       2020-05-31 06:17:12 +08:00
    3.有人推荐了 Videoproc,正好在搞活动,6 刀买入序列号。
    结果 坑爹的事情来了,图片解释一切,我简单说下:
    Videoproc 支持 [视频直接转换容器,不进行重新编码] ,然而对于 [ vorbis 音频编码部分] ,可以转化为 AAC 但是最高音质是 160kpbs,但是我的源文件音频的码率是 1061kbps,损失太大了 无法接受
    https://v2ex.com/i/0Ig7mLYG.png

    另外要序列号的留言 这软件对我来说没用了。
    kokutou
        2
    kokutou  
       2020-05-31 06:20:55 +08:00
    我能想到一个办法。。。
    写个脚本先用 ffmpeg 获取音频码率,再判断下,然后再 ffmpeg -c:v copy -c:a aac 就行了。。
    或者更简单粗暴的,ffmpeg 转出来 acc 音频轨放第一轨道,原始 vorbis 放第二轨道。。
    WesleyNZ
        3
    WesleyNZ  
    OP
       2020-05-31 06:29:27 +08:00 via iPhone
    @kokutou 第二个如何实现呢?而且问题是我 1061 帧率的那个文件 真实肯定没那么高。写脚本,每个文件判断 手动再执行,我做不到。
    WesleyNZ
        4
    WesleyNZ  
    OP
       2020-05-31 06:30:51 +08:00 via iPhone
    @kokutou 而且 Vorbis 音频比如说 400Kbps 你怎么知道转换出来的 aac 也是呢? aac 本身就是有损压缩,我怎么知道多少码率是相对源文件无损呢?
    xiaket
        5
    xiaket  
       2020-05-31 06:45:49 +08:00   ❤️ 1
    多熟悉一下命令行吧, 这真不是什么复杂的需求.
    yuzo555
        6
    yuzo555  
       2020-05-31 07:44:35 +08:00
    libfdk_aac 支持 vbr,效果我没试过,理论上应该能按质量出音频(不过 libfdk_aac 有一些使用限制,最好看清楚 LICENSE 再使用)。
    ffmpeg 自带的 aac 也支持质量模式 -q:a 不过效果应该是没有 libfdk_aac 好。
    yzwduck
        7
    yzwduck  
       2020-05-31 08:41:20 +08:00   ❤️ 1
    楼主是否正确判读了源音频的规格?
    根据 vorbis (Xiph) 官方编码器的设定,最高质量 q10 的码率是 500kbit/s,但 OP 说源文件音频的码率是 1061 kbps,是不是在哪个地方搞错了?
    locoz
        8
    locoz  
       2020-05-31 08:42:42 +08:00 via Android
    试试 obs 自带的那个小工具
    gggxxxx
        9
    gggxxxx  
       2020-05-31 08:52:06 +08:00   ❤️ 1
    楼主思路不明确啊,既然想保持原样为什么要去转它呢。
    目标是播放的话,直接装 vlc 什么都解决了。
    一定要转的话,mp4 格式有要求和限制的,Vorbis 转 aac 是对的。
    yzwduck
        10
    yzwduck  
       2020-05-31 09:02:54 +08:00   ❤️ 1
    @WesleyNZ #4 很难确定两个不同算法的有损压缩之间转换,会损失多少信息。
    题外话,44.1/48 kHz 16 bit 的音频,在有损压缩码率 240 kbps 以上时,就很难听出它与原始音频的差异了,更何况楼主用的是 24 kHz 的音频。如果真的在意这部分的差异的话,就应该全程使用无损压缩算法。
    KevinM
        11
    KevinM  
       2020-05-31 10:11:33 +08:00 via iPad   ❤️ 1
    Vorbis 跟 AAC 都是 lossy compression,因此你的要求不可能成立。
    @yzwduck 指出的也很對,Vorbis 的 nominal bitrate 最高到 q10 也只有 500Kbps,儘管可能是 variable bitrate 報告了最大值,但你原來的音頻可能有些非標準做法。
    建議直接最高質量轉 AAC 就行了,你聽不出區別的,實在要追求「無損」,照 @kokutou 存兩條音軌就行了,AAC 做默認(第一),Preview 應該就能預覽了。
    starrystarry
        12
    starrystarry  
       2020-05-31 11:27:58 +08:00
    ffmpeg -i input.mkv -c:v copy -c:a alac_at -tag:v avc1 output.mov
    注意是 .mov 不是 .mp4 (都能预览),-tag:v avc1 也是必须的。
    starrystarry
        13
    starrystarry  
       2020-05-31 11:43:17 +08:00
    MP4 容器能接受的无损音频格式只有 ALAC,Preview.app 能播放的无损音频格式也只有 ALAC 。AAC 是有损压缩,无论你设置多少码率都是有损。Vorbis 的 600Kbps 一定是大于 AAC 的 6000000000000Kbps 音质
    WesleyNZ
        14
    WesleyNZ  
    OP
       2020-05-31 12:04:43 +08:00 via iPhone
    @KevinM 如何保留两条音轨?同时如何设置默认音轨?
    WesleyNZ
        15
    WesleyNZ  
    OP
       2020-05-31 12:05:23 +08:00 via iPhone
    @starrystarry 后面这个道理我懂
    WesleyNZ
        16
    WesleyNZ  
    OP
       2020-05-31 12:06:52 +08:00 via iPhone
    @yzwduck 你看一下我贴出来的图片里链接 里面告诉你码率了。
    yzwduck
        17
    yzwduck  
       2020-05-31 12:47:34 +08:00 via Android
    @WesleyNZ 你的第一张截图里只能看出 Input #0 的码率是 1102 kb/s,但是实际的音频需要看 Stream #0:1 和 Stream #0:2 的码率。
    chenpei466
        18
    chenpei466  
       2020-05-31 12:49:42 +08:00
    permute
    WesleyNZ
        19
    WesleyNZ  
    OP
       2020-05-31 12:52:54 +08:00
    @chenpei466 这个软件 完全没法用的。。
    WesleyNZ
        20
    WesleyNZ  
    OP
       2020-05-31 12:53:11 +08:00
    @yzwduck 我有软件的 log,等我截个图给你看。
    WesleyNZ
        21
    WesleyNZ  
    OP
       2020-05-31 12:56:53 +08:00
    @yzwduck 这是那个 1061 的码率转换设置,你帮我分析一下是不是已经 [音频转码从 vorbis 到 aac,已经有足够码率了]
    求帮我解释一下这个图大概有什么意思,谢谢。
    https://v2ex.com/i/2dibX90K.jpeg
    WesleyNZ
        22
    WesleyNZ  
    OP
       2020-05-31 13:05:54 +08:00
    @yzwduck https://v2ex.com/i/Mk841069.png 不好意思 图片在这里,麻烦帮我看一下,然后 too many bits-- clamping to max 是指的,重新编码的 aac 是已经取了最高的采样标准?
    yzwduck
        23
    yzwduck  
       2020-05-31 13:56:08 +08:00   ❤️ 1
    没有。
    如果楼主看了日志都没注意到音频在编码时被重采样了的话,只能麻烦楼主先自行学习一下数字音频和流媒体的基本概念,再和其他人继续讨论了。

    [声音相对原视频无损] 的两种简单做法,1 )使用无损压缩算法来二次编码,2 )复制原有音频流。如果想用有损压缩二次编码的话,算一下 hash 看有没有信息损失,或者算一下 SNR 看损失了多少。

    EOF
    WesleyNZ
        24
    WesleyNZ  
    OP
       2020-05-31 15:55:30 +08:00 via iPhone
    @yzwduck 我知道重新采样了 我想知道最终的损失是多少?
    hronro
        25
    hronro  
       2020-05-31 16:57:12 +08:00 via iPhone
    为啥不用开源的 MP4Box 呢?比 ffmpeg 简单好用
    WesleyNZ
        26
    WesleyNZ  
    OP
       2020-05-31 18:37:48 +08:00 via iPhone
    @hronro 我昨天急着用 请问你说的这个软件是图形界面吗?
    QingStone
        27
    QingStone  
       2020-06-01 00:11:26 +08:00 via Android
    小丸工具箱,试试?
    pperlee
        28
    pperlee  
       2020-06-01 16:48:20 +08:00
    不要贪图图形界面。
    hronro
        29
    hronro  
       2020-06-01 18:08:35 +08:00
    @WesleyNZ #26 不是
    yangxin0
        30
    yangxin0  
       2020-06-01 20:28:07 +08:00 via iPhone
    不就是 remux
    WesleyNZ
        31
    WesleyNZ  
    OP
       2020-06-01 20:30:42 +08:00 via iPhone
    @pperlee 嗯嗯 谢谢建议
    yangtze
        32
    yangtze  
       332 天前
    看很多人推荐用 ffmpeg ,但没人详细说明,我做一个补充:

    ```
    docker run --rm -it --entrypoint /bin/sh -v $(pwd):/config linuxserver/ffmpeg \
    -c 'find /config \( -iname "*.ts" -or -iname "*.flv" \) -exec sh -c "ffmpeg -i \"\$1\" -c copy \"\${1%.*}.mp4\" && touch -r \"\$1\" \"\${1%.*}.mp4\"" _ {} \;'
    ```

    **以下基于 ChatGPT4 解释**

    这个 Docker 命令使用 `linuxserver/ffmpeg` 镜像在一个 Docker 容器内执行视频文件格式转换。它旨在批量转换目录中的 `.ts` 和 `.flv` 文件(包括这些扩展名的所有大小写变体)到 `.mp4` 格式,同时保留原始文件的修改日期。

    命令解释如下:

    - `docker run --rm -it`: 运行一个 Docker 容器,并在退出时自动删除它。`-it` 选项用于交互式运行,以便查看输出。
    - `--entrypoint /bin/sh`: linuxserver/ffmpeg 默认入口是 ffmpeg ,需要将容器的入口点设置为 `/bin/sh`,允许运行自定义 shell 命令。
    - `-v $(pwd):/config`: 将当前目录(`$(pwd)`)挂载到容器的 `/config` 目录。这意味着您应在执行此命令的目录中存放需要转换的视频文件。
    - `find /config \( -iname "*.ts" -or -iname "*.flv" \)`: 查找 `/config` 目录中所有以 `.ts` 或 `.flv` 结尾的文件,不区分大小写。
    - `-exec sh -c "ffmpeg -i \"\$1\" -c copy \"\${1%.*}.mp4\" && touch -r \"\$1\" \"\${1%.*}.mp4\"" _ {}`: 对每个找到的文件执行 `ffmpeg` 命令进行格式转换,然后使用 `touch -r` 命令使新的 `.mp4` 文件保持与原文件相同的修改日期。
    yangtze
        33
    yangtze  
       330 天前
    不用 Docker 的话:

    ```
    find . \( -iname "*.ts" -or -iname "*.flv" \) -exec sh -c 'ffmpeg -i "$1" -c copy "${1%.*}.mp4" && touch -r "$1" "${1%.*}.mp4"' _ {} \;
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1197 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:05 · PVG 02:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.