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ą.

Seppo Erviälä
źródło
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 .

MestreLion
źródło
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.

Seppo Erviälä
źródło
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

loksena
źródło
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.

Richard
źródło
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
13east
źródło
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