Handbrake เป็นเครื่องมือบีบอัดวิดีโอที่ยอดเยี่ยม แต่ดูเหมือนจะไม่รักษาเวลาการจับภาพดั้งเดิมหลังจากวิดีโอถูกบีบอัด ความคิดวิธีการแก้ไขปัญหานี้?
Handbrake เป็นเครื่องมือบีบอัดวิดีโอที่ยอดเยี่ยม แต่ดูเหมือนจะไม่รักษาเวลาการจับภาพดั้งเดิมหลังจากวิดีโอถูกบีบอัด ความคิดวิธีการแก้ไขปัญหานี้?
คำตอบ:
คุณสามารถคัดลอกข้อมูลเมตาที่มีอยู่จากไฟล์หนึ่งไปยังอีกโดยไม่จำเป็นต้อง Re-encode วิดีโอโดยใช้FFmpeg โดยทั่วไปใช้เวลาหนึ่งวินาที ในการทำเช่นนี้สมมติว่ามีสามไฟล์:
in.mp4
- ไฟล์ต้นฉบับก่อนการแปลงout.mp4
- ไฟล์หลังจากการแปลงเบรกมือfixed.mp4
- ไฟล์ที่มีข้อมูลเมตาที่ "แก้ไข"คำสั่ง FFmpeg เพื่อคัดลอกเรคคอร์ดข้อมูลเมตาที่สมบูรณ์ไปยังไฟล์ใหม่จะเป็น:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
หากต้องการทำลายมันให้ทำสิ่งต่อไปนี้:
in.mp4
และout.mp4
) ซึ่งกำหนด ID 0 และ 1 ตามลำดับ-map 1
) ดังนั้นเราจึงใช้บิตสตรีมที่ถูกแปลงแล้ว-map_metadata 0
)-c copy
) เพื่อคัดลอกบิตสตรีมทั้งหมดแทนที่จะเข้ารหัสวิดีโออีกครั้งหลังจากนั้นคุณจะเห็นได้ชัดว่าจะเปลี่ยนชื่อไปfixed.mp4
out.mp4
ตัวอย่างเช่นนี่เป็นส่วนหนึ่งของบันทึกข้อมูลเมตาของไฟล์ต้นฉบับของฉัน:
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
นี่คือไฟล์หลังจากการแปลง Handbrake:
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
นี่คือไฟล์สุดท้ายหลังจากจับคู่ข้อมูลเมตา:
$ 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
ที่จริงแล้วคุณไม่จำเป็นต้องใช้ Handbrake ถ้าคุณสามารถใช้ FFmpeg ได้ซึ่ง Handbrake ยังคงใช้งานอยู่ ในกรณีที่ง่ายที่สุดคุณสามารถทำการแปลงแบบนี้:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
สิ่งนี้จะแปลงอินพุตด้วยตัวเข้ารหัส x264 และเสียง AAC ไปยังไฟล์เอาต์พุตคัดลอกข้อมูลเมตาดั้งเดิม ในการเปลี่ยนคุณภาพของเอาต์พุตคุณสามารถ:
อ่านคู่มือการเข้ารหัส x264บน FFmpeg wiki สำหรับข้อมูลเพิ่มเติม
Unknown encoder 'libfaac'
ข้อผิดพลาด
-c:a aac -strict experimental
แทน
น่าเสียดายที่ดูเหมือนว่าเบรคมือไม่สามารถทำได้ด้วยตัวเอง แต่ในทำนองเดียวกันกับตัวอย่าง ffmpeg การประทับเวลาสามารถคัดลอกได้จากต้นฉบับหลังจากการบีบอัดโดยใช้touch
คำสั่ง unix:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
สิ่งนี้จะตั้งค่าการประทับเวลาของไฟล์บีบอัดให้เหมือนกับไฟล์อ้างอิงที่กำหนด
ฉันพบวิธีที่ง่ายกว่าในการทำเช่นนี้โดยใช้ซอฟต์แวร์อื่นที่เรียกว่าAdapter
: http://www.macroplant.com/adapter/
ไม่มีการตั้งค่าขั้นสูงทั้งหมดเช่น HandBrake แต่ใช้งานได้ (เช่นการใช้ ffmpeg) และเก็บ metadata ที่ฉันต้องการ
ฉันใช้ macOS Yosemite และHandBrakeBatch - ใช้เพื่อแปลงไฟล์ แต่คลิกที่กล่อง "เก็บการสร้างไฟล์และวันที่แก้ไข" ในเมนู "การตั้งค่า"
จากนั้นฉันนำเข้าวิดีโอไปยัง Lightroom 5 แต่พวกเขายังคงไม่สร้างวันที่ แต่ที่สำคัญที่สุดคือไฟล์ที่แสดงใน Finder พร้อมวันที่สร้างที่ถูกต้อง ดังนั้นฉันจึงเลือกทั้งหมดในไลบรารี Lightroom → Metadata (คอลัมน์โต้ตอบด้านขวา) →เวลาการจับภาพ→เปลี่ยนเป็นวันที่สร้างไฟล์→เปลี่ยนทั้งหมด
ฉันมีวิดีโอครอบครัวเก่า 850 รายการ - ฉันต้องทำกระบวนการนี้ด้วยแบทช์ 100 มือเบรกมือเกิดปัญหากับไฟล์จำนวนมาก
ฉันสร้างสคริปต์ทุบตีที่สามารถถ่ายโอนชุดข้อมูลเมตาโดยใช้touch
ตามที่แนะนำข้างต้น เพื่อให้ใช้งานได้คุณจะต้องมีไฟล์ต้นฉบับและไฟล์ที่แปลงแล้วในแต่ละไดเรกทอรีที่มีจำนวนไฟล์เท่ากัน (ไดเรกทอรีจะต้องมีไฟล์วิดีโอเท่านั้นเนื่องจากไฟล์ / ไดเรกทอรีอื่นจะรบกวน) และในลำดับเดียวกัน จากนั้นมันก็แค่คัดลอกเมทาดาทาและคุณก็พร้อมแล้ว สคริปต์แสดงรายการไฟล์คู่ทั้งหมดเพื่อให้คุณสามารถตรวจสอบข้อผิดพลาดในที่สุดหากคุณต้องการ
รหัสอาจไม่เรียบร้อยเพราะเป็นสคริปต์ทุบตีที่เหมาะสมครั้งแรกของฉัน แต่มันก็ค่อนข้างเร็วและเสถียรสำหรับฉันดังนั้นนี่จะไป:
#!/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
เมื่อต้องการเรียกใช้ให้ทำ: sudo bash script.sh /sourcedir /converteddir
ถ้าคุณหมายถึงเวลาปรับเปลี่ยนในระดับไฟล์แล้วผมมีปัญหาเดียวกันและก็สามารถที่จะกู้คืนได้ด้วยexiftool
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
นี้จะใช้เวลาเมตาและFileModifyDate
จากและคัดลอกไปinput.mp4
output.mp4
เพื่อให้สิ่งนี้เป็นแบบอัตโนมัติเมื่อฉันมีไฟล์จำนวนมากที่ต้องการแปลงรหัสฉันสร้างเครื่องมือที่ชื่อว่าShrinkwrapที่แปลงรหัสครั้งแรกด้วยFFmpeg (ฉันย้ายออกจาก HandBrake เพราะต้องการรักษาข้อมูลเมตาเพิ่มเติม) จากนั้นกู้คืนการประทับเวลาด้วย exiftool
หลังจากการค้นหามากฉันส่วนใหญ่ยอมแพ้ในการใช้ไฟล์วิดีโอเก่าที่มีวันที่สร้าง / แก้ไขที่ถูกต้องเพื่อเขียนทับวันที่สร้าง / แก้ไขไฟล์วิดีโอบีบอัด Handbrake ใหม่ของฉัน เนื่องจากวิดีโอส่วนใหญ่ของฉันมีวันที่ / เวลาในชื่อไฟล์ฉันจึงทดลองและมีสองวิธีในการทำงาน สิ่งแรกและดีที่สุดคือการใช้วิธีการประทับเวลาของ Ren Rener ขั้นสูงซึ่งสามารถเปลี่ยนวันที่สร้างแก้ไขและเข้าถึงไฟล์ได้ไม่เพียง แต่ชื่อไฟล์เท่านั้น https://www.advancedrenamer.com/download
ฉันยังพบสคริปต์ powershell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ซึ่งสามารถดัดแปลงโดยโปรแกรมเมอร์สำหรับรูปแบบชื่อ / วันที่อื่น ๆ ในสถานะปัจจุบันมันใช้งานได้ก็ต่อเมื่อชื่อไฟล์มีโครงสร้างตรงตามที่ปรากฏในตัวอย่างนั้น
โชคดีที่จำนวนวิดีโอของฉันที่ไม่มีวันที่แก้ไขในชื่อไฟล์นั้นต่ำพอที่ฉันจะสามารถเปลี่ยนได้ด้วยตนเองไม่นานเกินไป
ฉันพยายามใช้ ffmpeg แต่คำสั่ง map_metadata จะเปลี่ยนเฉพาะข้อมูลภายในไฟล์ไม่ใช่วันที่แก้ไข แต่สร้างไฟล์เอง Handbrake ภายในแบบนั้นก็ใช้ได้ดีอยู่แล้ว
โปรแกรมMyFFmpegทำได้ดีมาก ในตัวเลือกของมันมีทางเลือกที่จะให้สร้างต้นฉบับ / ดัดแปลงวันจากแฟ้มแหล่งที่มา
ฉันกำลังมองหาสิ่งนี้เพราะฉันมีโฮมวิดีโอของฉันบนเซิร์ฟเวอร์เพล็กซ์และไฟล์ถูกจัดเรียงตามวันที่สร้างซึ่งมีประโยชน์มากถ้าคุณต้องการดูเนื้อหาจากปีที่เฉพาะเจาะจง
น่าเสียดายที่นี่ไม่ใช่ตัวเลือกฟรีขณะนี้มีค่าใช้จ่าย 20 ยูโรหรือประมาณ 21 US พวกเขามีการทดลองใช้งาน 10 ครั้งก่อนที่คุณจะต้องซื้อใบอนุญาต แปลกใจที่ ffmpeg GUIs ฟรีบางตัวไม่มีหรือเพิ่มตัวเลือกนี้
ฉันพยายามคงวันที่สร้างไว้ในขณะที่ฉันบีบอัดวิดีโอ GoPro MP4 ที่มีขนาดใหญ่อย่างไม่น่าเชื่อของฉันลงใน H.264
ผมพบว่าโปรแกรมHandBrakeBatch มันเป็นสิ่งที่ฉันต้องการในการบีบอัดไฟล์มากกว่า 1,000 ไฟล์ในครั้งเดียวในขณะที่รักษาวันที่สร้าง (ข้อมูลเมตา)
ไม่พบโปรแกรมอื่น ๆ ที่สามารถทำได้ ทดลองใช้ FFmpeg, HandBrake และ Wonderful Video Converter แต่ไม่