Como fazer o Handbrake preservar o tempo de captura / tempo de criação?

11

O Handbrake é uma incrível ferramenta de compactação de vídeo, mas não parece preservar o tempo de captura original depois que um vídeo é compactado. Alguma ideia de como consertar isso?

    
por pixelfreak 23.12.2012 / 10:13

8 respostas

18

Você pode copiar os metadados existentes de um arquivo para outro sem precisar recodificar o vídeo usando o FFmpeg . Basicamente leva um segundo. Para fazer isso, vamos supor três arquivos:

  • in.mp4 - o arquivo original antes da conversão
  • out.mp4 - o arquivo após a conversão do Handbrake
  • fixed.mp4 - o arquivo com metadados "corrigidos"

O comando FFmpeg para copiar o registro de metadados completo para o novo arquivo seria:

ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4

Explicação da sintaxe:

Para dividi-lo, isso faz o seguinte:

  • Pegue dois arquivos de entrada ( in.mp4 e out.mp4 ), aos quais são atribuídos os IDs 0 e 1, respectivamente.
  • Mapeie somente os fluxos de vídeo / áudio / legenda do arquivo 1 para a saída ( -map 1 ), portanto, pegamos os fluxos de bits que já foram convertidos
  • Mapear apenas os metadados do arquivo 0 para a saída ( -map_metadata 0 )
  • Use o codec de cópia ( -c copy ) para copiar todos os fluxos de bits em vez de recodificar o vídeo.

Depois disso, você pode obviamente renomear fixed.mp4 para out.mp4 .

Prova:

Como exemplo, aqui está parte do registro de metadados do meu arquivo original:

$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19

Aqui está o arquivo após a conversão do Handbrake:

$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35

Este é o arquivo final depois de mapear os metadados:

$ ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
[…]

$ mediainfo fixed.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19    

Se você quer fazer tudo com o FFmpeg:

Na verdade, você não precisa usar o Handbrake se puder usar o FFmpeg, no qual o Handbrake confia. No caso mais simples, você pode fazer sua conversão assim:

ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a libfdk_aac -vbr 4 -map_metadata 0 out.mp4

Isso converterá a entrada com o codificador x264 e o áudio FDK-AAC em um arquivo de saída, copiando os metadados originais. Para alterar a qualidade da saída, você pode:

  • Altere o valor do CRF para vídeo. Lower significa melhor qualidade. 23 é o padrão, e qualquer coisa abaixo de 18 provavelmente será visualmente sem perdas.
  • Altere o parâmetro VBR para áudio. Consulte o Guia de codificação do AAC para obter mais informações.

Leia o guia de codificação x264 no wiki do FFmpeg para saber mais e confira nosso superusuário entrada de blog sobre o FFmpeg para alguns guias e links gerais para respostas úteis.

    
por 24.12.2012 / 13:01
4

Infelizmente, parece que o handbrake não pode fazer isso sozinho, mas similarmente ao exemplo do ffmpeg, os timestamps podem ser copiados do original após a compressão usando o comando touch unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

isso definirá o registro de data e hora no arquivo compactado como o arquivo de referência fornecido.

    
por 11.08.2013 / 17:28
3

Encontrei uma maneira mais fácil de fazer isso usando um software diferente chamado Adapter : link

Ele não tem todas as configurações avançadas, como o HandBrake, mas faz o trabalho (também usa o ffmpeg) e retém os metadados que eu preciso.

    
por 28.12.2012 / 21:05
2

Eu levei tanto tempo que tive que compartilhar:

Estou usando o MAC OS X Yosemite

HandBrake Batch - link - use-o para converter arquivos, mas clique em "manter arquivo criação e modificação datas "caixa no menu" Preferências ".

Depois, importei os vídeos para o Lightroom 5, mas eles ainda não mantinham as datas de criação. Mas, mais importante, os arquivos mostrados no Finder com a data de criação correta. Então eu selecionei todos eles na biblioteca do Lightroom - > Metadados (coluna de diálogo à direita) - > Tempo de captura - > Alterar para data de criação do arquivo - > Alterar tudo.

E funcionou!

Eu tinha 850 vídeos familiares antigos - eu tive que fazer esse processo em 100/100. Handbrake trava com muitos arquivos.

Espero que ajude!

    
por 08.12.2014 / 15:54
1

Eu fiz um script bash que pode transferir em lote os metadados, usando touch como sugerido acima. Para que funcione, você deve ter seus arquivos originais e convertidos em diretórios separados, cada um com o mesmo número de arquivos (os diretórios devem ter apenas os arquivos de vídeo, como outros arquivos / diretórios irão interferir) e na mesma ordem. Então, apenas copia os metadados e você está pronto e pronto. O script lista todos os pares de arquivos para que você possa verificar erros no final, se quiser.

O código pode não ser o mais legal, já que foi meu primeiro script bash apropriado, mas tem sido bastante rápido e estável para mim, então aqui vai:

#!/bin/bash
#Sets IFS to \n to allow for filenames with spaces
IFS=$'\n'

#Source directory and converted direcotry
dir1=$1
dir2=$2

#Array with source filepaths
srcf=()
#Array with converted filepaths
cnvf=()

#Adds filepaths from the source directory to srcf array
for file in $(ls -1 $dir1); do
    srcf+=("$dir1/$file")
done
#Adds filepaths from the converted directory to cnvf array
for file in $(ls -1 $dir2); do
    cnvf+=("$dir2/$file")
done

#Checks if source and convert folders have the same number of files
if [ ${#srcf[*]} -eq ${#cnvf[*]} ]
then
    #Counter variable
    fnum=0
    #Loops through the arrays and runs touch command on pairs of files to transfer the metadata
    while [ $fnum -lt ${#srcf[*]} ]; do
        echo $fnum
        echo ${srcf[$fnum]} ${cnvf[$fnum]}
        touch -r ${srcf[$fnum]} ${cnvf[$fnum]}
        ((fnum++))
    done
else
    echo "The provided paths do not have the same number of files. Both paths must have the same number of files in the same order."
fi

Para executar do: sudo bash script.sh /sourcedir /converteddir

    
por 01.05.2018 / 02:43
0

Depois de muita pesquisa, eu praticamente desisti de usar arquivos de vídeo antigos com a data correta criada / modificada para substituir a data criada / modificada dos meus novos arquivos de vídeo compactados no Handbrake. Como a maioria dos meus vídeos tem data / hora no nome do arquivo, eu experimentei e consegui dois métodos para trabalhar. O primeiro e o melhor é usar o método de registro de data e hora do Advanced Renamer, que PODE alterar a data do arquivo modificada, criada e acessada, não apenas o próprio nome do arquivo. link .

Também encontrei um script link do PowerShell que poderia ser adaptado por um programador para outros formatos de nome de arquivo / data. Em seu estado atual, ele só funciona se o nome do arquivo estiver estruturado exatamente como no exemplo.

Felizmente, meu número de vídeos sem a data modificada no nome do arquivo é baixo o suficiente. Eu posso mudá-los manualmente, não demorará muito.

Eu tentei usar o ffmpeg, mas seu comando map_metadata apenas altera os dados dentro do arquivo, não a data de modificação, criada do próprio arquivo. Esse tipo de metadado interno do Handbrake já funciona bem de qualquer maneira.

    
por 11.04.2018 / 02:14
0

Wow eu tenho procurado e procurando, tentando e tentando com diferentes programas e sistemas, para tentar manter a data de criação, enquanto eu comprimir meus vídeos GOPRO mp4 incrivelmente grandes em h.264. E não muitas pessoas parecem saber sobre isso, mas eu encontrei o programa HandBrakeBatch ( link ) E é exatamente o que eu preciso, para compactar mais de 1000 arquivos de uma só vez, mantendo a data de criação (metadados). Não encontrei nenhum outro programa que seja capaz de fazer isso. Tentei com FFMPEG, HandBrake e Wonderful Video Converter, mas não. Espero que isso possa ser para ajudar alguém.

    
por 25.09.2018 / 09:06
0

Se você quer dizer a hora da modificação no nível do arquivo, então eu tive o mesmo problema, e pude recuperá-lo com exiftool .

exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4

Isso pega os metadados e FileModifyDate de input.mp4 e os copia para output.mp4 .

Para automatizar isso, como eu tinha um grande número de arquivos para transcodificar, criei uma ferramenta chamada Shrinkwrap que primeiro transcodifica com < href="https://www.ffmpeg.org/"> FFmpeg (eu mudei de HandBrake por causa da necessidade de preservar mais metadados), em seguida, recupera o timestamp de modificação com exiftool.

    
por 08.11.2018 / 23:34