답변:
FFmpeg를 사용하여 비디오를 다시 인코딩하지 않고도 한 파일에서 다른 파일로 기존 메타 데이터를 복사 할 수 있습니다 . 기본적으로 1 초가 걸립니다. 이를 위해 세 개의 파일을 가정 해 봅시다.
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
)을 가져옵니다 .-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
핸드 브레이크 변환 후 파일은 다음과 같습니다.
$ 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
실제로 핸드 브레이크가 의존하는 FFmpeg를 사용할 수 있다면 핸드 브레이크를 실제로 사용할 필요는 없습니다. 가장 간단한 경우 다음과 같이 변환을 수행 할 수 있습니다.
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
그러면 x264 인코더 및 AAC 오디오가있는 입력이 출력 파일로 변환되어 원본 메타 데이터가 복사됩니다. 출력 품질을 변경하기 위해 다음을 수행 할 수 있습니다.
자세한 내용은 FFmpeg 위키 에서 x264 인코딩 안내서 를 읽으십시오 .
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 사용) 필요한 메타 데이터를 유지합니다.
macOS Yosemite 및 HandBrakeBatch를 사용하고 있습니다. 파일을 변환하는 데 사용하지만 "환경 설정"메뉴에서 "파일 생성 및 수정 날짜 유지"상자를 클릭하십시오.
그런 다음 비디오를 Lightroom 5로 가져 오지만 여전히 제작 날짜는 유지하지 않습니다. 그러나 가장 중요한 것은 파일이 정확한 생성 날짜와 함께 Finder에 표시된다는 것입니다. 그래서 Lightroom 라이브러리 → 메타 데이터 (오른쪽 대화 상자 열) → 캡처 시간 → 파일 생성 날짜로 변경 → 모두 변경에서 모든 항목을 선택했습니다.
나는 850 개의 오래된 가족 비디오를 가지고 있었다 – 나는이 과정을 100 개의 묶음으로해야했다. 수동 브레이크는 많은 파일과 충돌한다.
touch
위에서 제안한대로 메타 데이터를 일괄 전송할 수있는 bash 스크립트를 만들었습니다 . 작동하려면 원본 파일과 변환 된 파일이 각각 동일한 수의 파일 (다른 파일 / 디렉토리가 방해하는 것처럼 비디오 파일 만 있어야 함)과 동일한 순서로 별도의 디렉토리에 있어야합니다. 그런 다음 메타 데이터 만 복사하면 모든 준비가 완료됩니다. 스크립트는 모든 파일 쌍을 나열하므로 원하는 경우 결국 오류를 확인할 수 있습니다.
코드는 첫 번째 적절한 bash 스크립트 였기 때문에 가장 까다로울 수는 없지만 매우 빠르고 안정적이므로 다음과 같습니다.
#!/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
.
트랜스 코딩 할 파일이 많을 때이를 자동화하기 위해 먼저 FFmpeg로 트랜스 코딩 하는 도구 ( Shrinkwrap) 라는 도구를 만들었습니다 (더 많은 메타 데이터를 보존해야하기 때문에 HandBrake에서 멀어짐). exiftool을 사용하여 수정 타임 스탬프를 복구합니다.
많은 검색을 한 후, 나는 새로운 핸드 브레이크 압축 비디오 파일의 생성 / 수정 날짜를 덮어 쓰기 위해 올바른 날짜 생성 / 수정 된 오래된 비디오 파일을 사용하는 것을 포기했습니다. 내 비디오의 대부분은 파일 이름에 날짜 / 시간이 있으므로 실험하고 작동하는 두 가지 방법이 있습니다. 첫 번째로 가장 좋은 방법 은 Advanced Renamer의 타임 스탬프 방법을 사용하는 것입니다.이 방법은 파일 이름뿐만 아니라 수정, 작성 및 액세스 된 파일 날짜를 변경할 수 있습니다. https://www.advancedrenamer.com/download .
또한 프로그래머가 다른 파일 이름 / 날짜 형식에 맞게 조정할 수있는 powershell 스크립트 https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ 을 발견했습니다 . 현재 상태에서는 파일 이름이 해당 예제와 정확히 일치하는 경우에만 작동합니다.
다행스럽게도 파일 이름에서 날짜를 수정하지 않은 비디오 수는 너무 적어서 수동으로 변경할 수 있으며 시간이 오래 걸리지 않습니다.
ffmpeg를 사용해 보았지만 map_metadata 명령은 파일 자체에서 작성된 날짜가 아닌 파일 내부의 데이터 만 변경합니다. 이런 종류의 내부 메타 데이터 핸드 브레이크는 이미 어쨌든 잘 작동합니다.
엄청나게 큰 GoPro MP4 비디오를 H.264로 압축하면서 제작 날짜를 유지하려고합니다.
HandBrakeBatch 프로그램을 찾았습니다 . 생성 날짜 (메타 데이터)를 유지하면서 한 번에 1000 개가 넘는 파일을 압축해야합니다.
이 작업을 수행 할 수있는 다른 프로그램을 찾지 못했습니다. FFmpeg, HandBrake 및 Wonderful Video Converter를 사용해 보았습니다.