Como converter um arquivo .mkv para arquivo .mp4 sem perdas?

119

Preciso converter um arquivo de vídeo do contêiner Matroska para o contêiner mp4. O arquivo Matroska contém uma trilha de vídeo h.264 e uma trilha sonora AC3. Deve ser possível fazer isso sem perdas, mas como fazê-lo com as ferramentas nativas do Ubuntu?

A transcodificação não é uma opção.

Seppo Erviälä
fonte
Veja esta pergunta .
Binarylife
2
isto é especialmente uma solução para converter arquivos Matroska que não vai jogar em uma TV Samsung, para arquivos que são compatíveis com ele
knocte
Ao longo dos anos, achei isso muito útil como Chromecastsuporte H.264com AACou MP3em um MP4contêiner. É muito fácil transmitir vídeos do seu computador para Chromecastse você tiver o Chrome com a extensão do Google Cast. Basta arrastar e soltar um MP4com as codificações de fluxo corretas em uma janela do navegador e começar a transmitir.
Seppo Erviälä

Respostas:

164

Talvez a ferramenta mais fácil para isso seja ffmpeg, ou avconvdo libav-toolspacote. O Libav é um fork do FFmpeg, para o qual o Ubuntu mudou por alguns anos até o Ubuntu 15.04. É um dos backends de muitas das ferramentas da GUI mencionadas em outras respostas.

Alterar o contêiner sem reconfigurar o conteúdo não poderia ser mais simples:

ffmpeg -i input.mkv -codec copy output.mp4
  • Ele detecta automaticamente uma conversão de contêiner Matroska para MP4 com base nos nomes dos arquivos de entrada / saída.

  • -codec copycópias de fluxo, ou "re-muxes", os fluxos da entrada para a saída sem recodificação. Pense nisso como copiar e colar.

  • O comportamento padrão de seleção de fluxo é selecionar apenas um fluxo por tipo de fluxo. Por exemplo, se sua entrada tiver dois fluxos de vídeo e um fluxo de áudio, somente o fluxo de vídeo com o maior tamanho de quadro será selecionado. Adicione -map 0se você quiser selecionar todos os fluxos da entrada.

  • Alguns contêineres podem não suportar alguns formatos. Portanto, verifique se o formato do contêiner escolhido , seja ele mkv, mp4ou mesmo avitem suporte para todo o conteúdo de seus arquivos (vídeo, áudio, legendas, dados, etc.). Por exemplo, mp4não suporta legendas ( .srtarquivos) de SubRip .

MestreLion
fonte
6
Para transcodificar o áudio para AAC, deixando o vídeo como AVC: avconv -i input.mkv -c:v copy -c:a libfaac output.mp4(eu usei ffmpeg, presumo avconv tem os mesmos argumentos de linha de comando aqui)
CAMH
@camh: O que você disse funciona, mas observe duas coisas: 1) Ele deixará o vídeo como está, independentemente de ser AVC ou outra coisa; 2) Ele não só irá converter o áudio para AAC, mas também o formato do recipiente de mkv para mp4
MestreLion
1
@AquariusPower: saiba que o OP não deseja remapear os fluxos: ele deseja converter apenas o contêiner e manter todos os fluxos.
MestreLion 15/09/2015
2
@AquariusPower: você já tentou simplesmente -map 0obter os dois fluxos de áudio? Como eu disse na resposta: "O comportamento padrão de seleção de fluxo é selecionar apenas um fluxo por tipo de fluxo"
MestreLion 16/09/15
1
Use a -c:s mov_textopção se você precisar manter, por exemplo. srtfaixa de legenda.
Seppo Erviälä 16/03/19
25

Obtenha o software necessário

sudo apt-get install gpac mkvtoolnix

Extrair vídeo e áudio do arquivo matroska

Primeiro, você precisa verificar quais faixas o arquivo matroska contém com

mkvmerge --identify video.mkv

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

Em seguida, extraia o vídeo e o áudio de acordo com as faixas com:

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%

Mux áudio e vídeo em mp4 container

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

Eu tive que adicionar a -fps 24opção porque MP4Boxnão detectou fps de vídeo corretamente. Dependendo do uso, AC3a faixa de áudio deve ser recodificada em outra coisa antes do muxing.

Agora você removeu os fluxos do contêiner matroska para o contêiner mp4 sem perder nenhuma qualidade.

EDIT: MP4 não suporta oficialmente áudio AC3, portanto a faixa de áudio deve ser convertida em um formato compatível (por exemplo, AAC, MP3) se você quiser que o arquivo seja reproduzido com outra coisa que não o VLC.

Seppo Erviälä
fonte
1
Isso funcionará com faixas de legendas?
precisa saber é o seguinte
11

Você pode usar o Avidemux

Tem uma boa interface gráfica.

Ao converter de mkv para mp4, ele não é recodificado.

A conversão é feita dentro de um minuto (para um vídeo de 60 minutos).

  1. sudo apt-get install avidemux

  2. Abra o arquivo mkv no avidemux.

  3. Selecione o modo de segurança, se solicitado.

  4. Deixe o vídeo como cópia.

  5. Escolha Arquivo-> Propriedades. Verifique se o codec de áudio está aac.

    1. Se o codec de áudio NÃO for aac, selecione aac(faac).
    2. Caso contrário, deixe como copy. (Às vezes, usando esta opção, o áudio pode estar fora de sincronia ou distorcido; nesse caso, selecione aac(faac).)
  6. Selecione mp4para o formato.

  7. Selecione salvar, escolha o local e digite um nome de arquivo com .mp4a extensão.

Nota: Às vezes (~ 10% de chance), pode falhar. Então use handbrake(re-encode).

Nota 2: existem dois links que ajudam você:

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
fonte
Funcionou como um encanto. Eu tive problemas de sincronização após a resposta aceita, mas não com esta.
Moraes
funciona muito bem
psychok7
-2

Como o MPEG Part 14 oferece suporte nativo a h.264 e AC3 sem transcodificação, você pode simplesmente renomear o arquivo para que ele tenha uma .mp4extensão em vez de uma .mkvextensão.

Richard
fonte
3
Pode suportar os codecs internos, mas isso não significa que funcionará em um aplicativo que não entende o Matroska. Isso só funcionaria se o aplicativo oferecer suporte ao Matroska e examinar o número mágico em vez da extensão.
Arda Xi
Renomear o arquivo não converterá o formato do contêiner e poderá confundir o aplicativo (e os usuários). Como o @ArdaXi disse, o aplicativo ainda precisaria dar suporte ao Matroska para reproduzi-lo.
MestreLion
-2

Você pode tentar o HANDBRAKE adicionando seu PPA digitando este código no terminal:

sudo add-apt-repository ppa:stebbins/handbrake-releases
13east
fonte
Este parece ser um transcodificador de vídeo. Não quero compactar a faixa de vídeo novamente, pois ela já está no formato h.264.
Seppo Erviälä
1
O Handbrake é um ótimo transcodificador, mas eu nunca o usaria para conversão de formatos de arquivo.
CyberSkull
1
Adoro o Handbreak, mas infelizmente ele só funciona sem perdas para áudio (e legendas). Não consegui encontrar uma maneira de copiar o vídeo sem transcodificá-lo, e o OP solicitou especificamente a conversão de formato sem perdas.
MestreLion