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ć?
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ć?
Odpowiedzi:
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ęcznegofixed.mp4
- plik z „poprawionymi” metadanymiPolecenie 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
Aby to rozbić, wykonuje następujące czynności:
in.mp4
i out.mp4
), którym przypisano odpowiednio identyfikatory 0 i 1.-map 1
), więc bierzemy strumienie bitów, które zostały już przekonwertowane-map_metadata 0
)-c copy
), aby skopiować wszystkie strumienie bitów zamiast ponownie kodować wideo.Potem możesz oczywiście zmienić nazwę fixed.mp4
na out.mp4
.
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
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:
Więcej informacji znajdziesz w przewodniku kodowania x264 na wiki FFmpeg.
Unknown encoder 'libfaac'
błąd
-c:a aac -strict experimental
zamiast tego.
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ą touch
polecenia unix:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
ustawi to znacznik czasu w skompresowanym pliku na taki sam jak podany plik referencyjny.
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.
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.
Zrobiłem skrypt bash, który może wsadowo przesyłać metadane, używając touch
jak 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
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 FileModifyDate
od input.mp4
i 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.
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.
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.
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.