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


14

O Handbrake é uma ferramenta incrível de compactação de vídeo, mas parece não preservar o tempo de captura original após a compactação de um vídeo. Alguma idéia de como consertar isso?


@slhck Sim, quero dizer Tempo de criação. Uso o Lightroom para gerenciar meus vídeos e, após a compactação, o tempo de Captura / Criação se torna Tempo de modificação.
pixelfreak

Respostas:


21

Você pode copiar os metadados existentes de um arquivo para outro sem precisar recodificar o vídeo usando o FFmpeg . Leva basicamente um segundo. Para fazer isso, vamos assumir 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 completo de metadados 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 dividir, faça o seguinte:

  • Pegue dois arquivos de entrada ( in.mp4e out.mp4), aos quais são atribuídos os IDs 0 e 1, respectivamente.
  • Mapeie apenas os fluxos de vídeo / áudio / legenda do arquivo 1 para a saída ( -map 1), para obtermos os fluxos de bits já convertidos
  • Mapeie 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ê poderia obviamente renomear fixed.mp4para 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

Aqui está o arquivo final após o mapeamento dos 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ê quiser fazer tudo com o FFmpeg:

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

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

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

  • Mude o valor de CRF para o vídeo. Menor significa melhor qualidade. 23 é o padrão e qualquer coisa abaixo de 18 provavelmente será visualmente sem perdas.
  • Mude a taxa de bits do áudio. Consulte o guia de codificação AAC para obter mais informações.

Leia o guia de codificação x264 no wiki do FFmpeg para obter mais informações.


1
Uau, isso é uma solução legal, mas parece um pouco assustador, desejo que o Handbrake faça isso nos bastidores. Obrigado!
pixelfreak

O comando de transferência de metadados funciona, mas o último comando para fazer a conversão também me deu um Unknown encoder 'libfaac'erro
pixelfreak

Então o seu ffmpeg não é compilado com o suporte FAAC. Tente em -c:a aac -strict experimentalvez disso.
slhck

5

Infelizmente, parece que o handbrake não pode fazer isso sozinho, mas, da mesma forma que no exemplo ffmpeg, os carimbos de data e hora podem ser copiados do original após a compactação usando o touchcomando unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

isso definirá o carimbo de data e hora no arquivo compactado para o mesmo que o arquivo de referência fornecido.


1
Ele definirá o carimbo de data e hora para o arquivo, sim, mas apenas no sistema de arquivos. Os dados EXIF ​​não terão o registro de data e hora correto "Original da data / hora".
Stephen Schrauger

3

Encontrei uma maneira mais fácil de fazer isso, usando um software diferente chamado Adapter: http://www.macroplant.com/adapter/

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


1
Não acho que o Adapter possa fazer isso. Acabei de testar a versão mais recente e não consigo encontrar a configuração para reter metadados em qualquer lugar. Além disso, ele não parece converter todos os tipos de arquivos de vídeo, como o MTS, etc.
jjj

muito ruim não é compatível com o formato m2ts da Sony
Diego Vieira

2

Estou usando o macOS Yosemite e o HandBrakeBatch - use-o para converter arquivos, mas clique na caixa "manter datas de criação e modificação de arquivos" no menu "Preferências".

Em seguida, importo os vídeos para o Lightroom 5, mas eles ainda não mantêm as datas de criação. Mas, o mais importante, os arquivos são mostrados no Finder com a data de criação correta. Por isso, selecionei todos eles na biblioteca do Lightroom → Metadados (coluna da caixa de diálogo direita) → Tempo de captura → Alterar para a data de criação do arquivo → Alterar tudo.

Eu tinha 850 vídeos antigos de família - tive que fazer esse processo em lotes de 100. O travão de mão trava com muitos arquivos.


Bom achado, posso me ver usando muito esse aplicativo.
Calum_b 22/10/16

Observe que o aplicativo não é mais mantido : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck

1

Criei um script bash que pode transferir em lote os metadados, touchconforme 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, pois outros arquivos / diretórios interferirão) e na mesma ordem. Depois, apenas copia os metadados e está tudo pronto. O script lista todos os pares de arquivos para que você possa verificar se há erros no final, se desejar.

O código pode não ser o mais legal, pois foi meu primeiro script bash adequado, 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, faça: sudo bash script.sh /sourcedir /converteddir


1

Se você quer dizer o tempo de modificação no nível do arquivo, tive o mesmo problema e consegui recuperá-lo com o exiftool .

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

Isso pega os metadados e FileModifyDatede input.mp4e os copia para output.mp4.

Para automatizar isso porque eu tinha um grande número de arquivos para transcodificar, criei uma ferramenta chamada Shrinkwrap que primeiro transcodifica com o FFmpeg (eu me afastei do HandBrake por precisar preservar mais metadados) e recuperei o carimbo de data / hora da modificação com o exiftool.


0

Após muita pesquisa, desisti principalmente 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 pelo Handbrake. Como a maioria dos meus vídeos tem data / hora no nome do arquivo, experimentei e consegui dois métodos para trabalhar. O primeiro e o melhor é usar o método de carimbo de data e hora do Advanced Renamer, que PODE alterar a data do arquivo modificado, criado e acessado, não apenas o nome do arquivo. https://www.advancedrenamer.com/download .

Também encontrei um script do powershell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ que poderia ser adaptado por um programador para outros formatos de nome de arquivo / data. No estado atual, ele funciona apenas se o nome do arquivo estiver estruturado exatamente como no exemplo.

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

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


0

O programa MyFFmpeg faz isso muito bem. Em suas opções, há uma opção para Manter a criação original / data de modificação do arquivo de origem .

Eu estava procurando isso porque tenho meus vídeos caseiros em um servidor Plex e os arquivos são organizados pela data de criação, o que é muito útil se você quiser ver coisas de um ano específico.

Infelizmente, essa não é uma opção gratuita, atualmente custa 20 euros ou cerca de 21 US. Eles têm uma avaliação para 10 usos antes que você precise comprar uma licença. Surpreendido, algumas das GUIs gratuitas do ffmpeg não possuem ou adicionam essa opção.


0

Tento manter a data de criação enquanto comprimo meus vídeos GoPro MP4 incrivelmente grandes no H.264.

Encontrei o programa HandBrakeBatch . É exatamente o que eu preciso para compactar mais de 1000 arquivos de uma só vez, mantendo a data de criação (metadados).

Não encontrou nenhum outro programa capaz de fazer isso. Tentei com FFmpeg, HandBrake e Wonderful Video Converter, mas não.


Note-se que HandBrakeBatch é não é mantida : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.