El freni harika bir video sıkıştırma aracıdır, ancak bir video sıkıştırıldıktan sonra orijinal çekim süresini korumaz gibi görünüyor. Bunu nasıl düzeltebileceğine dair bir fikrin var mı?
El freni harika bir video sıkıştırma aracıdır, ancak bir video sıkıştırıldıktan sonra orijinal çekim süresini korumaz gibi görünüyor. Bunu nasıl düzeltebileceğine dair bir fikrin var mı?
Yanıtlar:
FFmpeg kullanarak videoyu yeniden kodlamanıza gerek kalmadan mevcut meta verileri bir dosyadan diğerine kopyalayabilirsiniz . Temelde bir saniye sürer. Bunu yapmak için üç dosya olduğunu varsayalım:
in.mp4
- dönüşümden önceki orijinal dosyaout.mp4
- El Freni dönüşümünden sonraki dosyafixed.mp4
- "düzeltilmiş" meta verilere sahip dosyaTüm meta veri kaydını yeni dosyaya kopyalamak için FFmpeg komutu şöyle olur:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
Bunu yıkmak için aşağıdakileri yapar:
in.mp4
ve out.mp4
) alın .-map 1
) eşleyin, böylece zaten dönüştürülmüş bit akışlarını alırız-map_metadata 0
)-c copy
Videoyu yeniden kodlamak yerine tüm bit akışlarını kopyalamak için copy codec bileşenini ( ) kullanın.Bundan sonra, belli ki adlandırmak olabilir fixed.mp4
için out.mp4
.
Örnek olarak, orijinal dosyamın meta veri kaydının bir parçası:
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
El Freni dönüşümünden sonraki dosya:
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
İşte meta verileri eşledikten sonraki son dosya:
$ 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
Aslında, el freninin yine de kullandığı FFmpeg'i kullanabiliyorsanız el frenini kullanmanıza gerek yoktur. En basit durumda dönüşümünüzü şu şekilde yapabilirsiniz:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
Bu, orijinal meta verileri kopyalayarak x264 kodlayıcı ve AAC ses ile girişi bir çıkış dosyasına dönüştürür. Çıktının kalitesini değiştirmek için şunları yapabilirsiniz:
Daha fazla bilgi için FFmpeg wiki'sindeki x264 kodlama kılavuzunu okuyun .
Unknown encoder 'libfaac'
hata verdi
-c:a aac -strict experimental
Bunun yerine deneyin .
Ne yazık ki el freni kendi başına yapamıyor gibi görünüyor, ancak ffmpeg örneğine benzer şekilde, zaman damgaları touch
unix komutu kullanılarak sıkıştırmadan sonra orijinalden kopyalanabilir :
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
bu, sıkıştırılmış dosyadaki zaman damgasını verilen referans dosyasıyla aynı olacak şekilde ayarlar.
Aradım Farklı yazılım kullanarak, bunu yapmak için daha kolay bir yol buldum Adapter
: http://www.macroplant.com/adapter/
HandBrake gibi tüm gelişmiş ayarlara sahip değildir, ancak işi yapar (ayrıca ffmpeg kullanarak) ve ihtiyacım olan meta verileri korur.
MacOS Yosemite ve HandBrakeBatch kullanıyorum - dosyaları dönüştürmek için kullanın, ancak "Tercihler" menüsündeki "dosya oluşturma ve değişiklik tarihlerini koru" kutusuna tıklayın.
Sonra videoları Lightroom 5'e aktarıyorum, ancak yine de oluşturma tarihlerini tutmuyorlar. Ancak, en önemlisi, dosyalar Finder'da doğru Oluşturma tarihiyle gösterilir. Bu yüzden hepsini Lightroom kütüphanesinde seçtim → Meta veriler (sağ iletişim sütunu) → Çekim Zamanı → Dosyanın oluşturulma tarihine değiştir → Tümünü Değiştir.
850 eski aile videom vardı - bu işlemi 100'lük gruplar halinde yapmak zorunda kaldım. El freni çok sayıda dosyayla çöküyor.
touch
Yukarıda önerilen şekilde kullanarak meta verileri toplu olarak aktarabilen bir bash betiği yaptım . Çalışması için, orijinal ve dönüştürülmüş dosyalarınızı her biri aynı sayıda dosyaya (diğer dosyalar / dizinler karışacağından, yalnızca video dosyalarına sahip olmalıdır) ve aynı sırayla sahip olmalısınız. Sonra sadece meta verileri kopyalar ve hazırsınız. Komut dosyası tüm dosya çiftlerini listeler, böylece isterseniz hataları kontrol edebilirsiniz.
İlk uygun bash betiğim olduğu için kod en güzel olmayabilir, ancak benim için oldukça hızlı ve kararlıydı, işte gidiyor:
#!/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
Çalıştırmak için: sudo bash script.sh /sourcedir /converteddir
Dosya düzeyinde değişiklik zamanını kastediyorsanız, aynı problemi yaşadım ve exiftool ile kurtarmayı başardım .
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
Bu, meta verileri alır ve ' FileModifyDate
den alır input.mp4
ve kopyalar output.mp4
.
Kodlamak için çok sayıda dosyam olduğu için bunu otomatikleştirmek için , ilk olarak FFmpeg ile kod dönüştüren Shrinkwrap adlı bir araç oluşturdum (daha fazla meta veri korumaya ihtiyaç duyduğum için HandBrake'den uzaklaştım), sonra exiftool ile değişiklik zaman damgasını kurtardı.
Çok fazla arama yaptıktan sonra, çoğunlukla yeni El Freni sıkıştırılmış video dosyalarımın oluşturulduğu / değiştirildiği tarihin üzerine yazmak için doğru tarih oluşturulmuş / değiştirilmiş eski video dosyalarını kullanmaktan vazgeçtim. Videolarımın çoğunda dosya adında tarih / saat olduğundan, denedim ve çalışmak için iki yöntemim var. Birincisi ve en iyisi , sadece dosya adının kendisini değil, değiştirilen, oluşturulan ve erişilen dosya tarihini değiştirebilen Gelişmiş Yeniden Adlandırma'nın zaman damgası yöntemini kullanmaktır. https://www.advancedrenamer.com/download .
Ayrıca https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ adlı bir powershell betiği buldum . Mevcut durumunda yalnızca dosya adı tam olarak bu örnekteki gibi yapılandırılmışsa çalışır.
Neyse ki dosya adında değiştirilme tarihi olmayan video sayım yeterince düşük. Bunları manuel olarak değiştirebiliyorum, çok uzun sürmeyecek.
Ben ffmpeg kullanmayı denedim, ancak map_metadata komutu sadece dosyanın içindeki verileri değiştirir, değiştirilme tarihi değiştirmez. Bu tür dahili meta veriler Handbrake zaten zaten iyi.
MyFFmpeg programı bunu çok iyi yapıyor. Seçeneklerinde Orijinal Oluşturma / Değiştirme Tarihini Kaynak Dosyadan Koruma seçeneği vardır .
Bunu aradım çünkü bir Plex sunucusunda ev videolarım var ve dosyalar oluşturma tarihine göre düzenleniyor, bu da belirli bir yıldaki şeyleri görmek istiyorsanız çok yararlı.
Ne yazık ki bu ücretsiz bir seçenek değil, şu anda 20 Euro veya yaklaşık 21 ABD'ye mal oluyor. Bir lisans satın almadan önce 10 kullanımlık bir deneme sürümü var. Bazı ücretsiz ffmpeg GUI'lerinde bu seçenek bulunmuyor veya eklenmiyor.
İnanılmaz derecede büyük GoPro MP4 videolarımı H.264'e sıkıştırırken oluşturma tarihini korumaya çalışıyorum.
HandBrakeBatch programını buldum . Oluşturma tarihini (meta veri) tutarken, bir seferde 1000'den fazla dosyayı sıkıştırmam gerekiyor.
Bunu yapabilen başka bir program bulamadınız. FFmpeg, HandBrake ve Wonderful Video Converter ile çalıştı, ama hayır.