Mac OS 仅转格式,视频内容不变(比如 MKV 转 mp4)的解决方法以及讨论。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WesleyNZ
V2EX    macOS

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

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

    于是开始了折腾之路,在上一个帖子里
    根据 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  
       2023-12-25 15:35:35 +08:00
    看很多人推荐用 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  
       2023-12-27 09:01:27 +08:00
    不用 Docker 的话:

    ```
    find . \( -iname "*.ts" -or -iname "*.flv" \) -exec sh -c 'ffmpeg -i "$1" -c copy "${1%.*}.mp4" && touch -r "$1" "${1%.*}.mp4"' _ {} \;
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1320 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:12 PVG 01:12 LAX 10:12 JFK 13:12
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86