如何将.mkv文件无损地转换成.mp4文件?


119

我需要将视频文件从Matroska容器转换为mp4容器。Matroska文件包含一个h.264视频轨道和一个AC3声音轨道。应该可以无损地执行此操作,但是如何使用本机Ubuntu工具执行此操作?

转码不是一种选择。


看到这个问题
Binarylife 2011年

2
这是一种特别解决方案,可将无法在三星电视中播放的Matroska文件转换为与其兼容的文件
knocte 2015年

多年以来,我发现它非常适合用作容器或容器中的Chromecast支撑。如果您使用的是带有Google Cast扩展程序的Chrome浏览器,则可以很容易地将视频从计算机流式传输到计算机上。只需将具有正确流编码的拖放到浏览器窗口并开始流。H.264AACMP3MP4ChromecastMP4
SeppoErviälä16年

Answers:


164

也许最简单的工具是ffmpeg,或avconvlibav-tools包装中获得。Libav是FFmpeg的分支,在Ubuntu 15.04之前,Ubuntu一直使用FFmpeg。它是其他答案中提到的许多GUI工具的后端之一。

更改容器而不重新设置内容再简单不过了:

ffmpeg -i input.mkv -codec copy output.mp4
  • 它根据输入/输出文件名自动检测从Matroska到MP4的容器转换。

  • -codec copy从输入到输出的流复制或“重新混合”,而无需重新编码。将其视为复制和粘贴。

  • 默认的流选择行为是每种流类型仅选择一个流。例如,如果您的输入有两个视频流和一个音频流,则仅会选择具有最大帧大小的视频流。-map 0如果要从输入中选择所有流,请添加。

  • 某些容器可能不支持某些格式。因此,请检查您选择的容器格式是否为mkvmp4甚至avi是否支持文件中的所有内容(视频,音频,字幕,数据等)。例如,mp4不支持SubRip字幕(.srt文件)。


6
要将音频转码为AAC,将视频保留为AVC :(avconv -i input.mkv -c:v copy -c:a libfaac output.mp4我使用ffmpeg,我假设avconv在此处具有相同的命令行参数)
camh 2012年

@camh:您说的是行得通的,但请注意以下两点:1)无论是AVC还是其他内容,它都会保持视频不变。2)它不仅将音频转换为AAC,还将容器格式从mkv转换为mp4
MestreLion 2012年

1
@AquariusPower:请注意,OP不想重新映射流:他只想转换容器并保留所有流。
MestreLion

2
@AquariusPower:您是否尝试过简单地同时-map 0获得两个音频流?正如我在回答中所说的:“默认的流选择行为是,每个流类型仅选择一个流”
MestreLion 2015年

1
-c:s mov_text如果您需要保留例如,请使用选项。srt字幕轨道。
SeppoErviälä17年

25

获取所需的软件

sudo apt-get install gpac mkvtoolnix

从Matroska文件中提取视频和音频

首先,您需要检查matroska文件包含的曲目

mkvmerge --identify video.mkv

File 'video.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AC3)

然后根据以下内容提取视频和音频:

mkvextract tracks video.mkv 1:video.h264 2:audio.ac3

Extracting track 1 with the CodecID 'V_MPEG4/ISO/AVC' to the file 'video.h264'. Container format: AVC/h.264 elementary stream
Extracting track 2 with the CodecID 'A_AC3' to the file 'audio.ac3'. Container format: Dolby Digital (AC3)
Progress: 100%

将音频和视频复用到mp4容器

MP4Box -fps 24 -add video.h264 -add audio.ac3 video.mp4

AVC-H264 import - frame size 1280 x 720 at 24.000 FPS
Import results: 31671 samples - Slices: 5672 I 125048 P 122648 B - 32288 SEI - 4936 IDR
AC3 import - sample rate 48000 - 6 channels
Saving to video.mp4: 0.500 secs Interleaving

我必须添加-fps 24选项,因为MP4Box未正确检测到视频fps。根据使用情况,AC3在混合之前应将音轨重新编码为其他形式。

现在,您已将流从matroska容器重新混合到mp4容器中,而不会损失任何质量。

编辑:MP4并不正式支持AC3音频,因此,如果您希望文件可以使用VLC以外的其他格式播放,则应将音轨转换为受支持的格式(例如AAC,MP3)。


1
这可以与字幕轨道一起使用吗?
Cyber​​Skull 2012年

11

您可以使用Avidemux

它具有良好的GUI界面。

从mkv转换为mp4时,不会重新编码。

转换在一分钟内完成(对于60分钟的视频)。

  1. sudo apt-get install avidemux

  2. 在avidemux中打开mkv文件。

  3. 如果出现提示,请选择安全模式。

  4. 将视频保留为副本。

  5. 选择“文件”->“属性”。检查音频编解码器是否为aac

    1. 如果音频编解码器不是aac,请选择aac(faac)
    2. 否则,将其保留为copy。(有时使用此选项,音频可能不同步或失真,在这种情况下,请选择aac(faac)。)
  6. 选择mp4格式。

  7. 选择保存,选择位置,然后输入.mp4扩展名作为文件名。

注意:有时(〜10%的机会)它可能会失败。然后使用handbrake(re-encode)

注意2:有两个链接可以帮助您:

http://www.ubuntugeek.com/avidemux-free-video-editor-designed-for-simple-cutting-filtering-and-encoding-tasks.html

http://www.ubuntugeek.com/how-to-convert-mkv-file-into-mp4-file-using-avidemux.html


像魅力一样工作。按照接受的答案,我遇到了同步问题,但是这个问题却没有。
moraes 2012年

效果很好
psychok7


-2

由于MPEG Part 14本机支持h.264和AC3,而无需进行代码转换,因此您可以简单地重命名文件,使其具有.mp4扩展名而不是.mkv扩展名。


3
它可能支持内部的编解码器,但这并不意味着它将在不了解Matroska的应用程序中运行。仅当应用程序支持Matroska并查看幻数而不是扩展名时,这才起作用。
Arda Xi

重命名文件不会转换容器格式,并且可能会使应用程序(和用户)感到困惑。正如@ArdaXi所说,该应用程序仍需要支持Matroska才能播放。
MestreLion

-2

您可以通过在终端中键入以下代码来添加PPA 来尝试HANDBRAKE

sudo add-apt-repository ppa:stebbins/handbrake-releases

这似乎是视频转码器。我不想再次压缩视频轨道,因为它已经是h.264格式。
SeppoErviälä11年

1
手刹是一个很棒的代码转换器,但我绝不会将其用于文件格式转换。
Cyber​​Skull 2012年

1
我绝对喜欢Handbreak,但不幸的是,它仅对音频(和字幕)无损起作用。我找不到一种无需转码就可以复制视频的方法,OP特别要求无损格式转换。
MestreLion,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.