DSM 7.1.1 42962 Update 6 AME 코덱 및 트랜스코딩
DSM 7.1.1 42962 Update 6 및, 2024년 3월 27일 자 기준으로 가장 최신 버전인 DSM 7.2.1 69057 Update 4의
Advanced Media Extensions, Video Station 트랜스코딩, Synology Photo의 얼굴 인식을 활성화하는 방법을 기재한다.
이를 통해 Synology Photo에서 HEIC, HEVC 파일을 읽어 들일 수 있게 된다.
설치과정
1. 헤놀로지
먼저, 패키지 센터에서 Advanced Media Extensions를 제거하고 설치한다.
설치 후 열지는 않는다.
Synology Photo와 Video Station도 설치한다.
또한, 패키지 센터에서 설정에 진입하여, 패키지 소스에 다음 내용을 추가한다.
이름 : synocommunity
위치 : http://packages.synocommunity.com
추가된 커뮤니티 탭에서 FFmpeg를 검색하여 4, 5, 6을 모두 설치한다.
제어판 > 터미널 및 SNMP에서 SSH 서비스를 활성화한다.
2. 시놀로지 데모
https://demo.synology.com/ko-kr/dsm
위 링크에 접속하여 시놀로지 데모 (한국어판)를 실행한다.
패키지 센터에서 Advanced Media Extensions을 열고 (기본적으로 설치돼 있음) 라이센스 가져오기를 클릭한다.
이메일 인증이 가능한 아무 계정으로, 새 시놀로지 계정을 생성하여 로그인한다.
설치가 완료되었다면, 제어판 > 작업 스케줄러 > 생성 > 트리거 된 작업 사용자 정의 스크립트를 생성한다.
일반에서 사용자는 root가 아닌 demouser로 설정한다.
작업 설정에서 사용자 정의 스크립트에 다음 내용을 추가하고 저장한다.
cd /volume1/homes/
tar -cvf AMEPack.tar /volume1/@appstore/CodecPack/pack
이후 생성한 스크립트를 실행한다.
파일 스테이션의 homes에 진입하면, AMEPack.tar이 보일 것이다.
용량은 AAC가 빠진 HEVC 코덱만 존재하기에, 77MB 혹은 80MB 가량일 것이다.
해당 파일을 다운로드한다.
이제 시놀로지 데모는 종료하여도 된다.
3. 다시 헤놀로지
다운로드한 AMEPack.tar 파일을 헤놀로지에 업로드한다.
SSH로 해당 경로에 접속하여야 하기에, 접속하기 편한 경로로 설정한다.
가능하다면 AMEPack.tar 파일이 존재하는 폴더에는 다른 파일이 없게 하는 것이 좋다.
파일의 경로는 속성의 위치에서 확인할 수 있다.
4. 헤놀로지 SSH
이후 SSH에 접속하여 sudo -i를 입력해 root로 로그인한다.
다음 명령어를 입력하여 작업 환경을 root 경로로 변경한다.
cd /
다음 명령어를 입력하여, AMEPack.tar 파일을 root 경로로 이동한다.
필자의 예시는 다음과 같다.
mv volume1/Archive-Main/_XPEnology/AME/AMEPack.tar /
다음 명령어를 입력하여 root 경로의 AMEPack.tar의 압축을 해제한다.
tar -xvf /AMEPack.tar
정상적으로 실행된 경우, Volume1/@appstore 경로에 압축이 해제된다.
5. AME Patch
AME 코덱을 과거 버전 (DSM 7.0 이전)으로 속여, 시놀로지 로그인을 우회한다.
ame72.py 원본 코드
import hashlib
import os
r = ['669066909066906690', 'B801000000', '30']
s_old = [(0x1F28, 0), (0x48F5, 1), (0x4921, 1), (0x4953, 1), (0x4975, 1), (0x9AC8, 2)]
s_new = [(0x3718, 0), (0x60a5, 1), (0x60d1, 1), (0x6111, 1), (0x6137, 1), (0xB5f0, 2)]
prefix = '/var/packages/CodecPack/target/usr'
so = prefix + '/lib/libsynoame-license.so'
print("Patching")
with open(so, 'r+b') as fh:
full = fh.read()
if hashlib.md5(full).digest().hex() in ['fcc1084f4eadcf5855e6e8494fb79e23', '923fd0d58e79b7dc0f6c377547545930']:
print("MD5 match older version not AME 1.1.0-51005 date: 21/06/2023")
for x in s_old:
fh.seek(x[0] + 0x8000, 0)
fh.write(bytes.fromhex(r[x[1]]))
elif hashlib.md5(full).digest().hex() in ['09e3adeafe85b353c9427d93ef0185e9']:
print("MD5 match version AME 1.1.0-51005 date: 21/06/2023")
for x in s_new:
fh.seek(x[0] + 0x8000, 0)
fh.write(bytes.fromhex(r[x[1]]))
else:
print("MD5 mismatch, not matching any version of AME")
exit(1)
lic = '/usr/syno/etc/license/data/ame/offline_license.json'
os.makedirs(os.path.dirname(lic), exist_ok=True)
with open(lic, 'w') as licf:
licf.write('[{"appType": 14, "appName": "ame", "follow": ["device"], "server_time": 1666000000, "registered_at": 1651000000, "expireTime": 0, "status": "valid", "firstActTime": 1651000001, "extension_gid": null, "licenseCode": "0", "duration": 1576800000, "attribute": {"codec": "hevc", "type": "free"}, "licenseContent": 1}, {"appType": 14, "appName": "ame", "follow": ["device"], "server_time": 1666000000, "registered_at": 1651000000, "expireTime": 0, "status": "valid", "firstActTime": 1651000001, "extension_gid": null, "licenseCode": "0", "duration": 1576800000, "attribute": {"codec": "aac", "type": "free"}, "licenseContent": 1}]')
print("Checking whether patch is successful...")
ret = os.system(prefix + "/bin/synoame-bin-check-license")
if ret == 0:
print("Successful, updating codecs...")
os.system(prefix + "/bin/synoame-bin-auto-install-needed-codec")
print("Done")
else:
print(f"Patch is unsuccessful, retcode = {ret}")
위 첨부 파일을 다운로드하여, 마찬가지로 root 경로로 옮긴다.
sudo -i
cd /
필자의 경우 다음과 같다.
mv volume1/Archive-Main/_XPEnology/AME72/ame72.py /
다음 명령어를 입력하여, ame72.py 파일을 파이썬으로 실행시킨다.
python ame72.py
정상적으로 실행된 경우, 위와 같이 출력된다.
codecpatch72.sh 원본 코드
#!/bin/sh
set -eo pipefail;
shopt -s nullglob;
#variables
bin_file="synocodectool"
conf_file="activation.conf"
conf_path="/usr/syno/etc/codec"
conf_string='{"success":true,"activated_codec":["hevc_dec","ac3_dec","h264_dec","h264_enc","aac_dec","aac_enc","mpeg4part2_dec","vc1_dec","vc1_enc"],"token":"123456789987654abc"}'
opmode="patchhelp"
#arrays
declare -A binhash_version_list=(
["cde88ed8fdb2bfeda8de52ef3adede87a72326ef"]="6.0-7321-0_6.0.3-8754-8"
["ec0c3f5bbb857fa84f5d1153545d30d7b408520b"]="6.1-15047-0_6.1.1-15101-4"
["1473d6ad6ff6e5b8419c6b0bc41006b72fd777dd"]="6.1.2-15132-0_6.1.3-15152-8"
["26e42e43b393811c176dac651efc5d61e4569305"]="6.1.4-15217-0_6.2-23739-2"
["1d01ee38211f21c67a4311f90315568b3fa530e6"]="6.2.1-23824-0_6.2.3-25426-3"
["c2f07f4cebf0bfb63e3ca38f811fd5b6112a797e"]="7.0.1-42216-0_7.0.1-42218-3"
["796ac7fab2dcad7978a0e8ae48abc9150aba916c"]="7.1-42661-0_7.1-42661-0"
["22445f5b0d8b6714954b50930c47b8805cf32b98"]="7.1-42661-0_7.1-42661-0"
["18461b62813166652fd64a96e06237fde81925f7"]="7.1.1-42962-0_7.1.1-42962-6"
["d316d5b2b080346b4bc197ad5ad7994ac043a15d"]="7.2-64570-0_7.2-64570-1"
["a205aa337d808213cf6d4d839b035cde0237b424"]="7.2.1-69057-0_7.2.1-69057-4"
)
declare -A patchhash_binhash_list=(
["e5c1a65b3967968560476fcda5071fd37db40223"]="cde88ed8fdb2bfeda8de52ef3adede87a72326ef"
["d58f5b33ff2b6f2141036837ddf15dd5188384c6"]="ec0c3f5bbb857fa84f5d1153545d30d7b408520b"
["56ca9adaf117e8aae9a3a2e29bbcebf0d8903a99"]="1473d6ad6ff6e5b8419c6b0bc41006b72fd777dd"
["511dec657daa60b0f11da20295e2c665ba2c749c"]="26e42e43b393811c176dac651efc5d61e4569305"
["93067026c251b100e27805a8b4b9d8f0ae8e291c"]="1d01ee38211f21c67a4311f90315568b3fa530e6"
["873749b00e1624df4b01335e0b69102acc185eb9"]="c2f07f4cebf0bfb63e3ca38f811fd5b6112a797e"
["06d543b2aab5ea73600ca96497febdad96dc7864"]="796ac7fab2dcad7978a0e8ae48abc9150aba916c"
["3a5ed18dc41ff243f3481b6e3cf4770651df0b54"]="22445f5b0d8b6714954b50930c47b8805cf32b98"
["4bfa2a72da607752435e432545f98f1a0b3815a8"]="18461b62813166652fd64a96e06237fde81925f7"
["8ffe49d91dc0fcd3268ff1afcbc9132d1ae634d1"]="d316d5b2b080346b4bc197ad5ad7994ac043a15d"
["1f4491bf5f27f0719ddebdcab6ff4eff56c64b2c"]="a205aa337d808213cf6d4d839b035cde0237b424"
)
declare -A binhash_patch_list=(
["cde88ed8fdb2bfeda8de52ef3adede87a72326ef"]="00002dc0: 27000084c0eb4cb9b6000000badd6940\n00003660: 24f0000000e8961e000084c00f84b400"
["ec0c3f5bbb857fa84f5d1153545d30d7b408520b"]="00002dc0: 27000084c0eb4cb9b7000000bafd6940\n000036f0: 0000e8291e000084c0eb1eb9ec000000"
["1473d6ad6ff6e5b8419c6b0bc41006b72fd777dd"]="00002dc0: 27000084c0eb4cb9b7000000baad6a40\n000036f0: 0000e8291e000084c0eb1eb9ec000000"
["26e42e43b393811c176dac651efc5d61e4569305"]="00002dc0: 27000084c0eb4cb9ba000000badf6a40\n00003710: f0000000e8271e000084c0eb1eb9ef00"
["1d01ee38211f21c67a4311f90315568b3fa530e6"]="00002dc0: 27000084c0eb4cb9bd000000baf76a40\n00003720: 24f0000000e8261e000084c0eb1eb9f2"
["c2f07f4cebf0bfb63e3ca38f811fd5b6112a797e"]="00002dc0: 000084c0eb2141b8c1000000b9586c40\n00003780: 1d000084c0e90d0100009041b8f60000"
["796ac7fab2dcad7978a0e8ae48abc9150aba916c"]="000035b0: 74cd4889efe8f623000084c0eb004c8d\n000040a0: fdffff4c89efe80519000084c0eb0048"
["22445f5b0d8b6714954b50930c47b8805cf32b98"]="00003850: e7e89a27000084c0eb00488dac249000\n00004340: fdffff4c89efe8a51c000084c0eb0048"
["18461b62813166652fd64a96e06237fde81925f7"]="000038e0: e7e89a27000084c0eb00488dac249000\n000043d0: fdffff4c89efe8a51c000084c0eb0048"
["d316d5b2b080346b4bc197ad5ad7994ac043a15d"]="00004220: 08fdffffe87722000084c090e9000000\n00004390: ffe80a21000084c090e900000000488b"
["a205aa337d808213cf6d4d839b035cde0237b424"]="00004220: 08fdffffe87722000084c090e9000000\n00004390: ffe80a21000084c090e900000000488b"
)
declare -a binpath_list=()
declare -a path_list=(
"/usr/syno/bin"
"/volume1/@appstore/VideoStation/bin"
"/volume2/@appstore/VideoStation/bin"
"/volume3/@appstore/VideoStation/bin"
"/volume1/@appstore/MediaServer/bin"
"/volume2/@appstore/MediaServer/bin"
"/volume3/@appstore/MediaServer/bin"
"/volume1/@appstore/SurveillanceStation/bin"
"/volume2/@appstore/SurveillanceStation/bin"
"/volume3/@appstore/SurveillanceStation/bin"
"/volume1/@appstore/CodecPack/bin"
"/volume2/@appstore/CodecPack/bin"
"/volume3/@appstore/CodecPack/bin"
"/volume1/@appstore/AudioStation/bin"
"/volume2/@appstore/AudioStation/bin"
"/volume3/@appstore/AudioStation/bin"
)
declare -a versions_list=(
"6.0 7321-0"
"6.0 7321-1"
"6.0 7321-2"
"6.0 7321-3"
"6.0 7321-4"
"6.0 7321-5"
"6.0 7321-6"
"6.0 7321-7"
"6.0.1 7393-0"
"6.0.1 7393-1"
"6.0.1 7393-2"
"6.0.2 8451-0"
"6.0.2 8451-1"
"6.0.2 8451-2"
"6.0.2 8451-3"
"6.0.2 8451-4"
"6.0.2 8451-5"
"6.0.2 8451-6"
"6.0.2 8451-7"
"6.0.2 8451-8"
"6.0.2 8451-9"
"6.0.2 8451-10"
"6.0.2 8451-11"
"6.0.3 8754-0"
"6.0.3 8754-1"
"6.0.3 8754-2"
"6.0.3 8754-3"
"6.0.3 8754-4"
"6.0.3 8754-5"
"6.0.3 8754-6"
"6.0.3 8754-7"
"6.0.3 8754-8"
"6.1 15047-0"
"6.1 15047-1"
"6.1 15047-2"
"6.1.1 15101-0"
"6.1.1 15101-1"
"6.1.1 15101-2"
"6.1.1 15101-3"
"6.1.1 15101-4"
"6.1.2 15132-0"
"6.1.2 15132-1"
"6.1.3 15152-0"
"6.1.3 15152-1"
"6.1.3 15152-2"
"6.1.3 15152-3"
"6.1.3 15152-4"
"6.1.3 15152-5"
"6.1.3 15152-6"
"6.1.3 15152-7"
"6.1.3 15152-8"
"6.1.4 15217-0"
"6.1.4 15217-1"
"6.1.4 15217-2"
"6.1.4 15217-3"
"6.1.4 15217-4"
"6.1.4 15217-5"
"6.1.4 15217-0"
"6.1.5 15254-0"
"6.1.5 15254-1"
"6.1.6 15266-0"
"6.1.6 15266-1"
"6.1.7 15284-0"
"6.1.7 15284-1"
"6.1.7 15284-2"
"6.1.7 15284-3"
"6.2 23739-0"
"6.2 23739-1"
"6.2 23739-2"
"6.2.1 23824-0"
"6.2.1 23824-1"
"6.2.1 23824-2"
"6.2.1 23824-3"
"6.2.1 23824-4"
"6.2.1 23824-5"
"6.2.1 23824-6"
"6.2.2 24922-0"
"6.2.2 24922-1"
"6.2.2 24922-2"
"6.2.2 24922-3"
"6.2.2 24922-4"
"6.2.2 24922-5"
"6.2.2 24922-6"
"6.2.3 25423-0"
"6.2.3 25426-0"
"6.2.3 25426-2"
"6.2.3 25426-3"
"7.0.1 42218-0"
"7.0.1 42218-1"
"7.0.1 42218-2"
"7.0.1 42218-3"
"7.1 42661-0"
"7.1 42661-1"
"7.1 42661-2"
"7.1 42661-3"
"7.1 42661-4"
"7.1.1 42951"
"7.1.1 42962-0"
"7.1.1 42962-1"
"7.1.1 42962-2"
"7.1.1 42962-3"
"7.1.1 42962-4"
"7.1.1 42962-5"
"7.1.1 42962-6"
"7.2 64570-0"
"7.2 64570-1"
"7.2.1 69057-0"
"7.2.1 69057-1"
"7.2.1 69057-2"
"7.2.1 69057-3"
"7.2.1 69057-4"
)
#functions
print_usage() {
printf "
SYNOPSIS
patch.sh [-h] [-p|-r|-l]
DESCRIPTION
Patch to enable transcoding without a valid serial in DSM 6+
-h Print this help message
-p Patch synocodectool
-r Restore from original from backup
-l List supported DSM versions
"
}
check_path () {
for i in "${path_list[@]}"; do
if [ -e "$i/$bin_file" ]; then
binpath_list+=( "$i/$bin_file" )
fi
done
}
check_version () {
local ver="$1"
for i in "${versions_list[@]}" ; do
[[ "$i" == "$ver" ]] && return 0
done || return 1
}
list_versions () {
for i in "${versions_list[@]}"; do
echo "$i"
done
return 0
}
patch_menu() {
local options=("$@")
echo "Available binaries to patch/restore:"
local PS3="Please choose which binary you want to patch/restore:"
select option in "${options[@]}" "Quit"; do
if [[ $REPLY = "$(( ${#options[@]}+1 ))" ]] ; then
echo "Goodbye"
exit 0
fi
bin_path="$option"
break
done
}
restore_menu() {
local options=("$@")
echo "Available backups to restore:"
local PS3="Please choose which binary you want to restore to $bin_path:"
select option in "${options[@]}" "Quit"; do
if [[ $REPLY = "$(( ${#options[@]}+1 ))" ]] ; then
echo "Goodbye"
exit 0
fi
backup_file="$option"
break
done
}
patch_common () {
source "/etc/VERSION"
dsm_version="$productversion $buildnumber-$smallfixnumber"
if [[ ! "$dsm_version" ]] ; then
echo "Something went wrong. Could not fetch DSM version"
exit 1
fi
echo "Detected DSM version: $dsm_version"
if ! check_version "$dsm_version" ; then
echo "Patch for DSM Version ($dsm_version) not found."
echo "Patch is available for versions: "
list_versions
exit 1
fi
echo "Patch for DSM Version ($dsm_version) AVAILABLE!"
check_path
if ! (( ${#binpath_list[@]} )) ; then
echo "Something went wrong. Could not find synocodectool"
exit 1
fi
patch_menu "${binpath_list[@]}"
}
patch () {
patch_common
local backup_path="${bin_path%??????????????}/backup"
local synocodectool_hash="$(sha1sum "$bin_path" | cut -f1 -d\ )"
if [[ "${binhash_version_list[$synocodectool_hash]+isset}" ]] ; then
local backup_identifier="${synocodectool_hash:0:8}"
if [[ -f "$backup_path/$bin_file.$backup_identifier" ]]; then
backup_hash="$(sha1sum "$backup_path/$bin_file.$backup_identifier" | cut -f1 -d\ )"
if [[ "${binhash_version_list[$backup_hash]+isset}" ]]; then
echo "Restored synocodectool and valid backup detected (DSM ${binhash_version_list[$backup_hash]}) . Patching..."
echo -e "${binhash_patch_list[$synocodectool_hash]}" | xxd -r - "$bin_path"
echo "Patched successfully"
echo "Creating spoofed activation.conf.."
if [ ! -e "$conf_path/$conf_file" ] ; then
mkdir -p $conf_path
echo "$conf_string" > "$conf_path/$conf_file"
chattr +i "$conf_path/$conf_file"
echo "Spoofed activation.conf created successfully"
exit 0
else
chattr -i "$conf_path/$conf_file"
rm "$conf_path/$conf_file"
echo "$conf_string" > "$conf_path/$conf_file"
chattr +i "$conf_path/$conf_file"
echo "Spoofed activation.conf created successfully"
exit 0
fi
else
echo "Corrupted backup and original synocodectool detected. Overwriting backup..."
mkdir -p "$backup_path"
cp -p "$bin_path" \
"$backup_path/$bin_file.$backup_identifier"
exit 0
fi
else
echo "Detected valid synocodectool. Creating backup.."
mkdir -p "$backup_path"
cp -p "$bin_path" \
"$backup_path/$bin_file.$backup_identifier"
echo "Patching..."
echo -e "${binhash_patch_list[$synocodectool_hash]}" | xxd -r - "$bin_path"
echo "Patched"
echo "Creating spoofed activation.conf.."
if [ ! -e "$conf_path/$conf_file" ] ; then
mkdir -p $conf_path
echo "$conf_string" > "$conf_path/$conf_file"
chattr +i "$conf_path/$conf_file"
echo "Spoofed activation.conf created successfully"
exit 0
else
chattr -i "$conf_path/$conf_file"
rm "$conf_path/$conf_file"
echo "$conf_string" > "$conf_path/$conf_file"
chattr +i "$conf_path/$conf_file"
echo "Spoofed activation.conf created successfully"
exit 0
fi
fi
elif [[ "${patchhash_binhash_list[$synocodectool_hash]+isset}" ]]; then
local original_hash="${patchhash_binhash_list[$synocodectool_hash]}"
local backup_identifier="${original_hash:0:8}"
if [[ -f "$backup_path/$bin_file.$backup_identifier" ]]; then
backup_hash="$(sha1sum "$backup_path/$bin_file.$backup_identifier" | cut -f1 -d\ )"
if [[ "$original_hash"="$backup_hash" ]]; then
echo "Valid backup and patched synocodectool detected. Skipping patch."
exit 0
else
echo "Patched synocodectool and corrupted backup detected. Skipping patch."
exit 1
fi
else
echo "Patched synocodectool and no backup detected. Skipping patch."
exit 1
fi
else
echo "Corrupted synocodectool detected. Please use the -r option to try restoring it."
exit 1
fi
}
rollback () {
patch_common
local backup_path="${bin_path%??????????????}/backup"
local synocodectool_hash="$(sha1sum "$bin_path" | cut -f1 -d\ )"
if [[ "${patchhash_binhash_list[$synocodectool_hash]+isset}" ]] ; then
local original_hash="${patchhash_binhash_list[$synocodectool_hash]}"
local backup_identifier="${original_hash:0:8}"
if [[ -e "$backup_path/$bin_file.$backup_identifier" ]] ; then
local backup_hash="$(sha1sum "$backup_path/$bin_file.$backup_identifier" | cut -f1 -d\ )"
if [[ "$original_hash" = "$backup_hash" ]]; then
cp -p "$backup_path/$bin_file.$backup_identifier" \
"$bin_path"
echo "Backup restored successfully (DSM ${binhash_version_list[$backup_hash]})"
exit 0
else
echo "No valid backup found for patched synocodectool currently in use. You can download the original file for DSM ${binhash_version_list[$original_hash]} from https://github.com/stl88083365/synocodectool-patch/."
exit 1
fi
else
echo "No backups found for patched synocodectool currently in use. You can download the original file for DSM ${binhash_version_list[$original_hash]} from https://github.com/stl88083365/synocodectool-patch/."
exit 1
fi
elif [[ "${binhash_version_list[$synocodectool_hash]+isset}" ]]; then
echo "Detected unpatched original synocodectool. Restoring not neccessary!"
exit 0
else
echo "Detected corrupted synocodectool."
local backup_files=( "$backup_path"/* )
if (( ${#backup_files[@]} )); then
restore_menu "${backup_files[@]}"
echo "Checking Hash.."
local backup_hash="$(sha1sum "$backup_file" | cut -f1 -d\ )"
if [[ "${binhash_version_list[$backup_hash]+isset}" ]]; then
cp -p "$backup_file" \
"$bin_path"
echo "Backup restored successfully (DSM ${binhash_version_list[$backup_hash]})"
exit 0
else
echo "Not a valid backup. You can either try restoring another backup or download the original file for DSM $dsm_version from https://github.com/stl88083365/synocodectool-patch/."
exit 1
fi
else
echo "No backups found. You can download the original file for DSM $dsm_version from https://github.com/stl88083365/synocodectool-patch/."
exit 1
fi
fi
}
#main()
if (( $EUID != 0 )); then
echo "Please run as root"
exit 1
fi
while getopts "prhl" flag; do
case "${flag}" in
p) opmode="patch";;
r) opmode="patchrollback" ;;
h) opmode="${opmode}" ;;
l) opmode="listversions" ;;
*) echo "Incorrect option specified in command line" ; exit 2 ;;
esac
done
case "${opmode}" in
patch) patch ;;
patchrollback) rollback ;;
patchhelp) print_usage ; exit 2 ;;
listversions) list_versions ;;
*) echo "Incorrect combination of flags. Use option -h to get help."
exit 2 ;;
esac
위 첨부 파일을 다운로드하여, 마찬가지로 root 경로로 옮긴다.
출처는 GitHub wirgen SynoCodecTool-Patch이다.
대응되는 버전은 2024년 3월 27일 자 기준으로 최신 버전인 DSM 7.2.1 69057 Update 4까지 가능하다.
최저는 DSM 6.0 7321 Update 0이다.
필자의 버전인 DSM 7.1.1 42962 Update 6을 포함한다.
sudo -i
cd /
필자의 경우 다음과 같다.
mv volume1/Archive-Main/_XPEnology/CodecPatch72/codecpatch72.sh /
다음 명령어를 입력하여, codecpatch72.sh 파일을 부착한다.
sh codecpatch72.sh -p
1, 2, 3 모두를 설치할 때까지 반복한다.
정상적으로 실행된 경우, 위와 같이 출력된다.
다음 명령어를 입력하여 Video Station의 FFMPEG 패치를 진행한다.
출처는 GitHub AlexPresso VideoStation-FFMPEG-Patcher이며,
다음 명령어로 최신 버전의 설치가 가능하다.
2024년 3월 27일 기준 v3.0이다.
bash -c "$(curl "https://raw.githubusercontent.com/AlexPresso/VideoStation-FFMPEG-Patcher/main/patcher.sh")"
정상적으로 실행된 경우, 위와 같이 출력된다.
unpatch
Unpatch는 다음 명령어를 사용한다.
curl https://raw.githubusercontent.com/AlexPresso/VideoStation-FFMPEG-Patcher/main/patcher.sh | bash -s -- -a unpatch
다음 명령어를 입력하여 Wrapper Video Station 패치를 진행한다.
출처는 GitHub Darknebular Wrapper Video Station이며,
다음 명령어로 최신 버전의 설치가 가능하다.
2024년 3월 27일 기준 v3.9.7이다.
bash -c "$(curl "https://raw.githubusercontent.com/darknebular/Wrapper_VideoStation/main/installer.sh")"
I (대문자 아이)를 입력하여 설치를 진행한다.
Unpatch는 설치 과정에서 선택이 가능하다.
YES를 입력하면, 삭제 후 자동으로 설치한다.
정상적으로 실행된 경우, 위와 같이 출력된다.
6. DSM 재부팅
다음 명령어를 통해 vi 편집기에 진입한다.
vi ame.py
키보드 A키를 눌러 편집 모드에 진입하고, 아래 내용을 붙여 넣는다.
내용의 출처는 synocodecpack patch이다.
저장은 ESC키를 누르고, :wq!를 입력하면 된다.
이후 다음 명령어를 입력하여 실행한다.
python ame.py
성공하면 이런 식으로 출력된다.
이후 패키지 센터의 Advanced Media Extensions를 실행하면, HEVC가 활성화되어 있을 것이다.
AAC는 AME의 특정 버전 업데이트 이후로 빠지게 되었다.
이후 다음 명령어를 입력하여 Video Station에서의 트랜스코딩을 활성화한다.
출처는 Wrapper_VideoStation이다.
bash -c "$(curl "https://raw.githubusercontent.com/darknebular/Wrapper_VideoStation/main/installer.sh")"
I (대문자 아이)를 입력하여 설치를 진행한다.
성공하면 이런 식으로 출력된다.
만약
ERROR: YOU HAVEN'T THE LICENCE ACTIVATED in Advanced Media Extension package. Please, try to transcode something in VideoStation for activate It and try again with the Installer.
위와 같은 에러가 나타난다면, 다음 방법을 통해 임시 방편으로 해결할 수 있다.
root 권한으로 다음 명령어를 입력한다.
vi /usr/syno/etc/codec/activation.conf
키보드 A키를 누르고 false 부분을 true로 변경한 뒤 저장한다.
그런 다음, 명령어를 다시 입력하고 I를 입력할 경우, 정상적으로 설치가 될 것이다.
bash -c "$(curl "https://raw.githubusercontent.com/darknebular/Wrapper_VideoStation/main/installer.sh")"
설치가 완료 됐다면, DSM을 재시작하고, Video Station에서 오프라인 트랜스코딩이 되는지 확인해 본다.
또한 Synology Photo에서, 아래의 주의사항을 확인한 뒤 HEIC, HEVC, 얼굴 인식이 잘 되는지 확인해 본다.
주의사항
AME에서 AAC 코덱이 빠지게 되었기에, AAC는 여전히 트랜스코딩이 되지 않을 것이다.
또한 트랜스코딩을 인위적인 방법으로 지원하게 한 것이기 때문에, 어떠한 오류가 생길 수도 있다.
또한 Synology Photo의 HEIC 및 HEVC의 정상적인 지원을 위해서는,
반드시 Synology Photo 혹은 File Station을 이용하여 파일을 업로드하거나 이동해야 한다.
Windows의 SMB 혹은 WebDAV으로 파일 탐색기에서 파일의 경로를 이동할 시, Synology Photo에서 읽어 들이지 못한다.