Jak przekonwertować plik .mkv do pliku .mp4 bez strat?


119

Muszę przekonwertować plik wideo z kontenera Matroska na kontener MP4. Plik Matroska zawiera jedną ścieżkę wideo h.264 i jedną ścieżkę dźwiękową AC3. Powinno być możliwe wykonanie tego bezstratnie, ale jak to zrobić przy użyciu rodzimych narzędzi Ubuntu?

Transkodowanie nie jest opcją.


Zobacz to pytanie .
Binarylife

2
jest to szczególnie rozwiązanie do konwertowania plików Matroska, które nie będą odtwarzane w telewizorze Samsung, na pliki, które są z nim kompatybilne
Knocte

Przez lata uważałem to za bardzo przydatne jako Chromecastpodpory H.264z AAClub MP3w MP4pojemniku. Przesyłanie filmów z komputera jest bardzo łatwe, Chromecastjeśli masz Chrome z rozszerzeniem Google Cast. Po prostu przeciągnij i upuść MP4odpowiedni kodowanie strumienia do okna przeglądarki i rozpocznij transmisję strumieniową.
Seppo Erviälä

Odpowiedzi:


164

Być może najłatwiejszym narzędziem do tego jest ffmpeglub avconvz libav-toolspakietu. Libav to rozwidlenie FFmpeg, na które Ubuntu przestawił się na kilka lat, aż do Ubuntu 15.04. Jest to jeden z backendów wielu narzędzi GUI wymienionych w innych odpowiedziach.

Zmiana kontenera bez ponownego kodowania zawartości nie może być prostsza:

ffmpeg -i input.mkv -codec copy output.mp4
  • Automatycznie wykrywa konwersję kontenera Matroska do MP4 na podstawie nazw plików wejściowych / wyjściowych.

  • -codec copykopie strumieniowe lub „remiksowanie” strumieni od wejścia do wyjścia bez ponownego kodowania. Pomyśl o tym jak o kopiowaniu i wklejaniu.

  • Domyślne zachowanie wyboru strumienia polega na wybraniu tylko jednego strumienia na typ strumienia. Na przykład, jeśli na wejściu znajdują się dwa strumienie wideo i jeden strumień audio, wówczas wybrany zostanie tylko strumień wideo o największym rozmiarze klatki. Dodaj, -map 0jeśli chcesz wybrać wszystkie strumienie z wejścia.

  • Niektóre kontenery mogą nie obsługiwać niektórych formatów. Sprawdź, czy wybrany format kontenera , czy to jest mkv, mp4czy nawet aviobsługuje całą zawartość twoich plików (wideo, audio, napisy, dane itp.). Na przykład mp4nie obsługuje napisów ( .srtplików) SubRip .


6
Aby transkodować dźwięk do AAC, pozostawiając wideo jako AVC: avconv -i input.mkv -c:v copy -c:a libfaac output.mp4(Użyłem ffmpeg, zakładam, że avconv ma tę samą argumentację w wierszu poleceń)
camh

@camh: To, co powiedziałeś, działa, ale zwróć uwagę na 2 rzeczy: 1) Zostawi wideo takie, jakie jest, niezależnie od tego, czy jest to AVC czy coś innego; 2) Nie tylko konwertuje audio do AAC, ale także format kontenera z mkv na mp4
MestreLion

1
@AquariusPower: pamiętaj tylko, że OP nie chce ponownie mapować strumieni: chce tylko przekonwertować kontener i zachować wszystkie strumienie.
MestreLion,

2
@AquariusPower: czy próbowałeś po prostu -map 0uzyskać oba strumienie audio? Jak powiedziałem w odpowiedzi: „Domyślnym zachowaniem podczas wyboru strumienia jest wybranie tylko jednego strumienia na typ strumienia”
MestreLion

1
Użyj -c:s mov_textopcji, jeśli chcesz zachować np. srtścieżka napisów.
Seppo Erviälä

25

Uzyskaj potrzebne oprogramowanie

sudo apt-get install gpac mkvtoolnix

Wyodrębnij wideo i audio z pliku matroska

Najpierw musisz sprawdzić, jakie ścieżki zawiera plik matroska

mkvmerge --identify video.mkv

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

Następnie wyodrębnij wideo i audio zgodnie z ich utworami za pomocą:

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%

Audio i wideo Mux do kontenera 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

Musiałem dodać -fps 24opcję, ponieważ MP4Boxnie wykryłem poprawnie klatek wideo. W zależności od użycia AC3ścieżka audio powinna zostać ponownie zakodowana w coś innego przed multipleksowaniem.

Teraz przemieściłeś strumienie z kontenera Matroska do kontenera MP4 bez utraty jakości.

EDYCJA: MP4 oficjalnie nie obsługuje dźwięku AC3, więc ścieżkę audio należy przekonwertować na obsługiwany format (np. AAC, MP3), jeśli chcesz, aby plik mógł być odtwarzany przy użyciu czegoś innego niż VLC.


1
Czy to będzie działać ze ścieżkami z napisami?
CyberSkull,

11

Możesz użyć Avidemux

Ma dobry interfejs GUI.

Podczas konwersji z mkv na mp4 nie jest ponownie kodowany.

Konwersja jest wykonywana w ciągu minuty (dla 60-minutowego filmu).

  1. sudo apt-get install avidemux

  2. Otwórz plik mkv w avidemux.

  3. Wybierz tryb awaryjny, jeśli pojawi się monit.

  4. Pozostaw wideo jako kopię.

  5. Wybierz Plik-> Właściwości. Sprawdź, czy kodek audio jest aac.

    1. Jeśli kodek audio NIE jest aac, wybierz aac(faac).
    2. W przeciwnym razie pozostaw to jako copy. (Czasami przy użyciu tej opcji dźwięk może nie być zsynchronizowany lub zniekształcony, w takim przypadku wybierz opcję aac(faac)).
  6. Wybierz mp4dla formatu.

  7. Wybierz zapisz, wybierz lokalizację i wpisz nazwę pliku z .mp4rozszerzeniem.

Uwaga: Czasami (~ 10% szansa) może się nie powieść. Następnie użyj handbrake(re-encode).

Uwaga 2: istnieją dwa linki, które pomogą ci:

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


Działa jak urok. Miałem problemy z synchronizacją po zaakceptowaniu odpowiedzi, ale nie z tą.
moraes

działa bardzo dobrze
psychok7


-2

Ponieważ MPEG Part 14 obsługuje natywnie h.264 i AC3 bez transkodowania, możesz po prostu zmienić nazwę pliku, aby miał .mp4rozszerzenie zamiast .mkvrozszerzenia.


3
Może obsługiwać znajdujące się w nim kodeki, ale to nie znaczy, że będzie działać w aplikacji, która nie rozumie Matroski. Działa to tylko wtedy, gdy aplikacja obsługuje Matroskę i patrzy na magiczną liczbę zamiast rozszerzenia.
Arda Xi

Zmiana nazwy pliku nie spowoduje konwersji formatu kontenera i może wprowadzić w błąd aplikację (i użytkowników). Jak powiedział @ArdaXi, aplikacja nadal musiałaby obsługiwać Matroskę, aby ją odtworzyć.
MestreLion,

-2

Możesz wypróbować HANDBRAKE , dodając jego PPA, wpisując ten kod w terminalu:

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

To wydaje się być transkoderem wideo. Nie chcę ponownie kompresować ścieżki wideo, ponieważ jest ona już w formacie h.264.
Seppo Erviälä,

1
Hamulec ręczny to świetny transkoder, ale nigdy nie użyłbym go do konwersji formatu plików.
CyberSkull

1
Absolutnie uwielbiam Handbreak, ale niestety działa bezstratnie tylko w przypadku audio (i napisów). Nie mogłem znaleźć sposobu na skopiowanie wideo bez transkodowania, a OP specjalnie poprosił o bezstratną konwersję formatu.
MestreLion
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.