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

2020-05-31 06:09:15 +08:00
 WesleyNZ
我电脑里有一些 [ 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

另外谁能告诉我为什么帖子另外两张图片无法插入??
3449 次点击
所在节点    macOS
33 条回复
WesleyNZ
2020-05-31 12:56:53 +08:00
@yzwduck 这是那个 1061 的码率转换设置,你帮我分析一下是不是已经 [音频转码从 vorbis 到 aac,已经有足够码率了]
求帮我解释一下这个图大概有什么意思,谢谢。
https://v2ex.com/i/2dibX90K.jpeg
WesleyNZ
2020-05-31 13:05:54 +08:00
@yzwduck https://v2ex.com/i/Mk841069.png 不好意思 图片在这里,麻烦帮我看一下,然后 too many bits-- clamping to max 是指的,重新编码的 aac 是已经取了最高的采样标准?
yzwduck
2020-05-31 13:56:08 +08:00
没有。
如果楼主看了日志都没注意到音频在编码时被重采样了的话,只能麻烦楼主先自行学习一下数字音频和流媒体的基本概念,再和其他人继续讨论了。

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

EOF
WesleyNZ
2020-05-31 15:55:30 +08:00
@yzwduck 我知道重新采样了 我想知道最终的损失是多少?
hronro
2020-05-31 16:57:12 +08:00
为啥不用开源的 MP4Box 呢?比 ffmpeg 简单好用
WesleyNZ
2020-05-31 18:37:48 +08:00
@hronro 我昨天急着用 请问你说的这个软件是图形界面吗?
QingStone
2020-06-01 00:11:26 +08:00
小丸工具箱,试试?
pperlee
2020-06-01 16:48:20 +08:00
不要贪图图形界面。
hronro
2020-06-01 18:08:35 +08:00
@WesleyNZ #26 不是
yangxin0
2020-06-01 20:28:07 +08:00
不就是 remux
WesleyNZ
2020-06-01 20:30:42 +08:00
@pperlee 嗯嗯 谢谢建议
yangtze
330 天前
看很多人推荐用 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
328 天前
不用 Docker 的话:

```
find . \( -iname "*.ts" -or -iname "*.flv" \) -exec sh -c 'ffmpeg -i "$1" -c copy "${1%.*}.mp4" && touch -r "$1" "${1%.*}.mp4"' _ {} \;
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/677104

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX