Jak sprawić, by hamulec ręczny zachował czas przechwytywania / czas tworzenia?

14

Hamulec ręczny to niesamowite narzędzie do kompresji wideo, ale wydaje się, że nie zachowuje oryginalnego czasu przechwytywania po skompresowaniu wideo. Jakiś pomysł jak to naprawić?

pixelfreak
źródło
@slhck Tak Mam na myśli czas utworzenia. Używam Lightroom do zarządzania moimi filmami, a po kompresji czas przechwytywania / tworzenia zmienia się w czas modyfikacji.
pixelfreak,

Odpowiedzi:

21

Możesz skopiować istniejące metadane z jednego pliku do drugiego bez konieczności ponownego kodowania wideo za pomocą FFmpeg . Zasadniczo zajmuje to sekundę. Aby to zrobić, załóżmy trzy pliki:

  • in.mp4 - oryginalny plik przed konwersją
  • out.mp4 - plik po konwersji hamulca ręcznego
  • fixed.mp4 - plik z „poprawionymi” metadanymi

Polecenie FFmpeg, aby skopiować pełny rekord metadanych do nowego pliku, to:

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

Objaśnienie składni:

Aby to rozbić, wykonuje następujące czynności:

  • Weź dwa pliki wejściowe ( in.mp4i out.mp4), którym przypisano odpowiednio identyfikatory 0 i 1.
  • Odwzoruj tylko strumienie wideo / audio / napisów z pliku 1 na wyjście ( -map 1), więc bierzemy strumienie bitów, które zostały już przekonwertowane
  • Odwzoruj tylko metadane z pliku 0 na wynik ( -map_metadata 0)
  • Użyj funkcji kopiuj kodek ( -c copy), aby skopiować wszystkie strumienie bitów zamiast ponownie kodować wideo.

Potem możesz oczywiście zmienić nazwę fixed.mp4na out.mp4.


Dowód:

Jako przykład, oto część rekordu metadanych mojego oryginalnego pliku:

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

Oto plik po konwersji hamulca ręcznego:

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

Oto końcowy plik po zmapowaniu metadanych:

$ 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    

Jeśli chcesz zrobić wszystko z FFmpeg:

W rzeczywistości nie trzeba używać hamulca ręcznego, jeśli można korzystać z FFmpeg, na którym i tak polega hamulec ręczny. W najprostszym przypadku możesz wykonać konwersję w następujący sposób:

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

Spowoduje to konwersję danych wejściowych z koderem x264 i dźwiękiem AAC na plik wyjściowy, kopiując oryginalne metadane. Aby zmienić jakość wydruku, możesz:

  • Zmień wartość CRF dla wideo. Niższa oznacza lepszą jakość. 23 jest domyślne, a wszystko poniżej 18 będzie prawdopodobnie wizualnie bezstratne.
  • Zmień szybkość transmisji dla dźwięku. Więcej informacji można znaleźć w przewodniku kodowania AAC .

Więcej informacji znajdziesz w przewodniku kodowania x264 na wiki FFmpeg.

slhck
źródło
1
Wow, to fajne obejście, wygląda jednak trochę zniechęcająco, chciałbym, żeby Handbrake zrobił to za kulisami. Dzięki!
pixelfreak
Polecenie transferu metadanych działa, ale ostatnie polecenie konwersji również dało mi Unknown encoder 'libfaac'błąd
pixelfreak
Zatem twoja ffmpeg nie jest kompilowana ze wsparciem FAAC. Spróbuj -c:a aac -strict experimentalzamiast tego.
slhck
5

Niestety wydaje się, że hamulec ręczny nie może zrobić tego sam, ale podobnie jak w przykładzie ffmpeg, znaczniki czasu można skopiować z oryginału po kompresji za pomocą touchpolecenia unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

ustawi to znacznik czasu w skompresowanym pliku na taki sam jak podany plik referencyjny.

André Fernandes
źródło
1
Ustawi znacznik czasu dla pliku, tak, ale tylko w systemie plików. Dane EXIF ​​nie będą miały prawidłowego znacznika czasu „Oryginalna data / czas”.
Stephen Schrauger
3

Znalazłem łatwiejszy sposób, aby to zrobić, używając innego oprogramowania o nazwie Adapter: http://www.macroplant.com/adapter/

Nie ma wszystkich zaawansowanych ustawień, takich jak HandBrake, ale wykonuje zadanie (również przy użyciu ffmpeg) i zachowuje potrzebne metadane.

pixelfreak
źródło
1
Nie sądzę, że Adapter jest w stanie to zrobić. Właśnie przetestowałem najnowszą wersję i nie mogę nigdzie znaleźć ustawienia zatrzymywania metadanych. Ponadto nie wydaje się konwertować wszystkich typów plików wideo, takich jak MTS itp.
jjj
szkoda, że ​​nie jest kompatybilny z formatem m2ts Sony
Diego Vieira
2

Używam macOS Yosemite i HandBrakeBatch - używaj go do konwertowania plików, ale kliknij pole „zachowaj daty utworzenia i modyfikacji pliku” w menu „Preferencje”.

Następnie importuję filmy do Lightroom 5, ale nadal nie zachowują dat utworzenia. Ale co najważniejsze, pliki są wyświetlane w Finderze z poprawną datą utworzenia. Więc wybrałem je wszystkie w bibliotece Lightroom → Metadane (prawa kolumna okna dialogowego) → Czas przechwytywania → Zmień datę utworzenia pliku → Zmień wszystko.

Miałem 850 starych rodzinnych filmów - musiałem wykonać ten proces w seriach po 100. Hamulec ręczny ulega awarii z dużą ilością plików.

Regis
źródło
Niezłe znalezisko, mogę zobaczyć, jak często korzystam z tej aplikacji.
calum_b
Pamiętaj, że aplikacja nie jest już obsługiwana : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck 10.01.2019
1

Zrobiłem skrypt bash, który może wsadowo przesyłać metadane, używając touchjak sugerowano powyżej. Aby to zadziałało, musisz mieć oryginalne i przekonwertowane pliki w osobnych katalogach, każdy z taką samą liczbą plików (katalogi mogą zawierać tylko pliki wideo, ponieważ inne pliki / katalogi będą kolidować) i w tej samej kolejności. Następnie kopiuje metadane i wszystko gotowe. Skrypt wyświetla wszystkie pary plików, więc możesz sprawdzić błędy na końcu, jeśli chcesz.

Kod może nie jest najładniejszy, ponieważ był to mój pierwszy właściwy skrypt bash, ale był dla mnie dość szybki i stabilny, więc oto:

#!/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

Aby uruchomić, wykonaj: sudo bash script.sh /sourcedir /converteddir

António Bezerra
źródło
1

Jeśli chodzi o czas modyfikacji na poziomie pliku, to miałem ten sam problem i byłem w stanie go odzyskać za pomocą exiftool .

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

Trwa to metadane i FileModifyDateod input.mp4i kopie go output.mp4.

Aby to zautomatyzować, ponieważ miałem dużą liczbę plików do transkodowania, stworzyłem narzędzie o nazwie Shrinkwrap, które najpierw transkoduje za pomocą FFmpeg (zrezygnowałem z HandBrake z powodu konieczności zachowania większej liczby metadanych), a następnie odzyskuje znacznik czasu modyfikacji exiftool.

bennetimo
źródło
0

Po wielu poszukiwaniach w większości zrezygnowałem z używania starych plików wideo z poprawną datą utworzenia / modyfikacji, aby zastąpić datę utworzenia / modyfikacji moich nowych plików wideo skompresowanych przez Handbrake. Ponieważ większość moich filmów ma datę / godzinę w nazwie pliku, eksperymentowałem i uzyskałem dwie metody działania. Pierwszym i najlepszym jest użycie metody znacznika czasu Advanced Renamer, która MOŻE zmienić datę pliku zmodyfikowaną, utworzoną i dostępną, nie tylko samą nazwę pliku. https://www.advancedrenamer.com/download .

Znalazłem również skrypt PowerShell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/, który może być dostosowany przez programistę do innych formatów nazw / dat. W obecnym stanie działa tylko wtedy, gdy nazwa pliku ma taką samą strukturę, jak w tym przykładzie.

Na szczęście moja liczba filmów bez daty modyfikacji w nazwie pliku jest wystarczająco mała, że ​​mogę je zmienić ręcznie, nie potrwa to zbyt długo.

Próbowałem użyć ffmpeg, ale jego polecenie map_metadata zmienia tylko dane w pliku, a nie datę modyfikacji, utworzoną z samego pliku. Tego rodzaju wewnętrzne metadane Hamulec ręczny już dobrze sobie radzi.

Eregos
źródło
0

Program MyFFmpeg robi to bardzo dobrze. W jego opcjach można wybrać opcję Zachowaj oryginalną datę utworzenia / modyfikacji z pliku źródłowego .

Szukałem tego, ponieważ mam moje domowe filmy na serwerze Plex, a pliki są uporządkowane według daty utworzenia, co jest bardzo przydatne, jeśli chcesz zobaczyć rzeczy z konkretnego roku.

Niestety nie jest to darmowa opcja, obecnie kosztuje 20 euro lub około 21 USA. Mają wersję próbną na 10 zastosowań, zanim będziesz musiał kupić licencję. Zaskoczony, niektóre darmowe GUI ffmpeg nie mają lub nie dodają tej opcji.

Houston
źródło
0

Staram się zachować datę utworzenia, kompresując moje niewiarygodnie duże filmy GoPro MP4 do H.264.

Znalazłem program HandBrakeBatch . Właśnie tego potrzebuję do skompresowania ponad 1000 plików za jednym razem, przy jednoczesnym zachowaniu daty utworzenia (metadane).

Nie znalazłem żadnych innych programów, które mogłyby to zrobić. Próbowałem z FFmpeg, HandBrake i Wonderful Video Converter, ale nie.

Jim
źródło
Pamiętaj, że HandBrakeBatch nie jest już obsługiwany : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck 10.01.2019