iMovie (não sem perdas, mas melhor que antes)
O iMovie v10 (lançado algum tempo depois que a pergunta foi originalmente feita) agora é melhor para lidar com mais tipos de mídia, evitando assim importar recodificação para a maioria dos conteúdos H.264 (mp4, m4v, mov, AVHDC, mts, mt2s).
No entanto, ele ainda será recodificado na exportação, portanto, não pode ser tecnicamente sem perdas - outro recurso novo, no entanto, é a capacidade de personalizar a qualidade da exportação, que pode ser quase sem perdas. Eu suspeito que esta parte da resposta pode ser aplicada igualmente a outro software de edição de vídeo 'orientado pelo projeto' (por exemplo, Premiere ou Final Cut) porque eu acho que eles geralmente re-codificam na saída, embora sejam muito fáceis de usar para um corte preciso.
Pessoalmente, eu geralmente acho que uma única recodificação não é um grande problema, mas entendo que você especificamente pediu por uma solução sem perdas, então ...
Sem perdas (mas muito mais complicado!)
Existem limitações técnicas quanto à precisão com que você pode cortar um vídeo sem precisar recodificar pelo menos uma parte dele, e isso basicamente depende da frequência do i-frame. Se cada quadro é um i-frame, você pode cortar em qualquer lugar, mas se eles são apenas a cada poucos segundos, você só pode cortar sem perdas nesses i-frames sem perder conteúdo ou ter que re-codificar (pelo menos parte do stream) para que possa começar com um i-frame.
ffmpeg
Isso SO Q & amp; A especificamente levanta a questão de como cortar entre i-frames usando ffmpeg
. Eu não sei de nenhum aplicativo GUI para fazer isso, mas basicamente você executa um comando como o seguinte:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
As duas vezes especificadas são começar e duração e pode ser especificado como segundos ou hh:mm:ss.ss
, e as -acodec copy
e -vcodec copy
diga ao ffmpeg para não recodificar.
Eu não sei exatamente o que acontece se você cortar muito cedo, mas eu pensar o vídeo é basicamente vazio (ou talvez corrompido, dependendo do player) até encontrar um i-frame. Então você provavelmente vai querer encontrar o i-frame mais próximo antes do seu corte. Esta resposta resolve esse problema usando ffprobe
e awk
, embora um pouco desajeitado. Essencialmente você usa ffprobe
para digitalizar os quadros e encontrar o quadro-chave mais próximo flags=K
) antes do seu ponto de corte ideal. A saída completa para cada quadro do vídeo pode ser vista assim:
ffprobe -select_streams v -show_frames <INPUT>
A resposta vinculada fornece esse comando para encontrar um quadro-chave antes de um horário específico:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
E, finalmente, se você realmente precisar cortar algo entre dois i-frames, poderá dividir o vídeo e voltar a participar. Baseado no informações desta resposta deve ser algo como:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Onde list_of_videos.txt
é um arquivo de texto simples que lista os arquivos que você deseja concatenar.
Resumo
O iMovie provavelmente é bom o suficiente para a maioria dos casos (desde a v10) e é muito fácil.
O ffmpeg pode fazê-lo sem perdas (ou muito próximo do losslessly), com um pouco de mexer; O nível de dificuldade depende de quão exigente você é em relação ao ponto de partida preciso e à frequência de quadros i.