안녕하세요!
이번 포스팅에서는 헤놀로지 사용자분들께 중요한 트랜스코딩 관련 정보를 다루려고 합니다.
아이폰에서 주로 사용하는 고해상도 파일 형식인 HEIC와 HEVC 파일이 시놀로지에서 제대로 호환되지 않거나, 특정 기능이 원활하게 작동하지 않는 경우가 종종 발생합니다.
특히 Synology Photo에서 이러한 파일들을 문제없이 처리하려면 몇 가지 설정이 필요합니다.
따라서 Advanced Media Extensions 설치, 트랜스코딩 활성화하는 방법을 소개해드리겠습니다.
이 설정을 통해 Synology Photo에서 HEIC와 HEVC 파일을 원활하게 처리할 수 있습니다.
이번 포스팅은 조금 난도가 있는 주제이니, 천천히 따라와 주시면 좋겠습니다!
먼저 필자의 환경은 DSM 7.1.1 42962 Update 6이며,
DSM 6.0 7321 Update 0과, 2024년 3월 27일 자 기준으로 가장 최신 버전인
DSM 7.2.1 69057 Update 4까지 테스트했음을 알립니다.
또한 적용 후에 DSM을 재부팅해야 함을 염두에 두시기 바랍니다.
시놀로지 / 헤놀로지에서 AME 설치

먼저, 패키지 센터에서 Advanced Media Extensions를 제거하고 설치합니다.
설치 후에 실행하지 않습니다.
필요에 따라 Synology Photo와 Video Station도 설치합니다.

패키지 센터의 설정을 클릭합니다.

패키지 소스 탭에서 추가를 클릭합니다.

이름과 위치를 위 이미지와 같이 입력하고 확인을 클릭합니다.
synocommunity
http://packages.synocommunity.com

패키지 센터에 추가된 커뮤니티 탭에서, FFmpeg를 검색합니다.
FFmpeg 4, 5, 6을 모두 설치합니다.

제어판에서 터미널 및 SNMP > 터미널 > SSH 서비스 활성화에 체크하고 저장합니다.
포트 번호를 확인하는 것을 잊지 마세요.
이제 잠시 시놀로지 / 헤놀로지는 놔두고, 다른 작업을 해야합니다.
AMEPack.rar 얻기
AME를 활성화하려면, 시놀로지 데모에서 온전한 AMEPack.rar 파일을 확보해야 합니다.
또는 필자가 미리 다운로드해둔 파일을 사용하여 이 과정을 건너뛸 수도 있습니다.
시놀로지 데모를 통해 직접 다운로드하려면, 아래 방법을 따라 진행해 주세요.

시놀로지 데모 (한국어판) 링크에 접속하여 DSM을 실행합니다.
2024년 8월 31일 기준, 데모 버전은 DSM 7.2입니다.

데모에서 패키지 센터를 실행하고, Advanced Media Extensions를 엽니다.

라이센스 가져오기를 클릭합니다.

이후, 시놀로지에서 새 계정을 생성한 후 로그인합니다.
기존 계정을 사용해도 무방하지만, 보다 안전하게 진행하기 위해 새 계정을 사용하는 것을 권장드립니다.

로그인이 완료되면 자동으로 설치를 진행합니다.

설치가 완료되었다면, 제어판 > 작업 스케줄러에 진입하여
생성 > 트리거된 작업 > 사용자 정의 스크립트를 생성합니다.

나타나는 창에서 일반 탭을 위 이미지와 같이 입력합니다.
사용자는 root가 아닌 demouser로 설정합니다.

작업 설정 탭에서 아래의 사용자 정의 스크립트를 입력하고 확인을 클릭합니다.
cd /volume1/homes/
tar -cvf AMEPack.tar /volume1/@appstore/CodecPack/pack

이후 생성한 AME 작업을 우클릭하여 실행합니다.

이후 파일 스테이션을 실행하여 homes 경로에서 AMEPack.tar을 확인할 수 있습니다.
용량은 AAC가 빠진 HEVC 코덱만 존재하기에, 77MB 혹은 80MB 가량입니다.

해당 파일을 우클릭하여 다운로드합니다.
이제 시놀로지 데모는 종료하여도 됩니다.
파일 업로드
다운로드한 AMEPack.tar 파일을 시놀로지 / 헤놀로지에 업로드합니다.
이후, SSH로 해당 파일이 있는 경로에 접근해야 하므로, 접근하기 편한 경로에 업로드하는 것이 좋습니다.
또한, 가능하다면 AMEPack.tar 파일이 있는 폴더에는 다른 파일이 없게 하는 것이 좋습니다.

파일의 경로는 속성의 위치에서 확인할 수 있습니다.
SSH 작업

이후 PuTTY 등을 통해 SSH에 접속하여 로그인합니다.
위에서 확인한 포트 번호를 입력해 주세요.

이후 sudo -i 명령어를 입력하여 root로 로그인합니다.
다음 명령어를 입력하여, 작업 환경을 root 경로로 변경합니다.
cd /
다음 명령어를 입력하여, 위에서 확인한 경로를 통해 AMEPack.tar 파일을 root 경로로 이동합니다.
SSH에서 붙여 넣기는 마우스 우클릭입니다.
mv [AMEPack.tar 경로] /
필자의 경우는 다음과 같습니다.
mv volume1/Archive-Main/_XPEnology/AME/AMEPack.tar /
다음 명령어를 입력하여 root 경로의 AMEPack.tar의 압축을 해제합니다.
tar -xvf /AMEPack.tar

정상적으로 실행된 경우, Volume1/@appstore 경로에 압축이 해제됩니다.
AME Patch
ame72.py 파일을 다운로드하여, 마찬가지로 root 경로로 옮깁니다.
sudo -i
cd /
해당 파일의 원본 코드는 아래에서 확인할 수 있습니다.
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}")
다음 명령어를 입력하여, ame72.py 파일을 root 경로로 이동합니다.
mv [ame72.py 경로] /
필자의 경우 다음과 같습니다.
mv volume1/Archive-Main/_XPEnology/AME72/ame72.py /
다음 명령어를 입력하여. ame72.py 파일을 파이썬으로 실행합니다.
python ame72.py

정상적으로 실행된 경우, 위와 같이 출력됩니다.
Codec Patch
codecpatch72.sh 파일을 다운로드하여, 마찬가지로 root 경로로 옮깁니다.
sudo -i
cd /
해당 파일의 원본 코드는 아래에서 확인할 수 있습니다.
#!/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
출처는 GitHub wirgen SynoCodecTool-Patch입니다.
대응되는 버전은 2024년 3월 27일 자 기준으로 최신 버전인
DSM 7.2.1 69057 Update 4까지 가능합니다.
최저는 DSM 6.0 7321 Update 0입니다.
다음 명령어를 입력하여, codecpatch72.sh 파일을 root 경로로 이동합니다.
mv [codecpatch72.sh 경로] /
필자의 경우 다음과 같습니다.
mv volume1/Archive-Main/_XPEnology/CodecPatch72/codecpatch72.sh /
다음 명령어를 입력하여, codecpatch72.sh 파일을 부착합니다.
sh codecpatch72.sh -p

해당 화면에서 1, 2, 3을 설치할 때까지 부착을 반복합니다.

정상적으로 설치된 경우, 번호와 함께 위와 같은 텍스트가 출력됩니다.
Video Station FFmpeg
이제 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는 다음 명령어를 사용합니다.
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를 입력하여 삭제 후 자동으로 설치합니다.

정상적으로 실행된 경우, 위와 같이 출력됩니다.
DSM 재부팅 및 마무리
모든 과정이 문제없이 끝났다면, DSM을 재부팅합니다.


재부팅 후 패키지 센터에서 AME를 확인해보면, 위의 두 장의 이미지 중 한 장과 같은 상태일 것입니다.
필자는 첫 번째 이미지의 상태입니다.
만약 라이센스 가져오기 버튼이 나타난다면, AME를 재설치하고 AME Patch 과정을 다시 진행합니다.
첫 번째 이미지의 경우, AAC가 붙지 않은 것을 확인할 수 있는데,
SSH에서 root 권한으로 다음 명령어를 입력하여, 실제로 어떠한지 확인할 수 있습니다.
cat /usr/syno/etc/codec/activation.conf
필자의 경우 다음과 같이 출력됩니다.
root@Nori-Archive-II:~# cat /usr/syno/etc/codec/activation.conf
{"success":true,"activated_codec":["hevc_dec","ac3_dec","h264_dec","h264_enc","aac_dec","aac_enc",
"mpeg4part2_dec","vc1_dec","vc1_enc"],"token":"123456789987654abc"}
여기서 AAC를 확인할 수 있으므로, AME의 화면과는 관계없이 정상적으로 작동합니다.

Video Station에서 DTS 오디오 트랙의 영상이 제대로 재생되는 것을 확인했습니다.

패치를 진행하기 않았을 경우, 재생되지 않습니다.

Synology Photo HEIC 이미지 테스트입니다.

패치를 진행하지 않았을 경우, 사진 열람이 불가능합니다.
Audio Station에서는 AME가 없어도 기본적으로 AAC 재생이 가능합니다.
주의사항
Synology Photo에서 HEIC 및 HEVC 파일을 정상적으로 지원하려면, Synology Photo 또는 File Station을 사용해 파일을 업로드하거나 이동하는 것이 권장됩니다.
만약 Windows의 SMB나 WebDAV를 사용해 파일 탐색기에서 파일을 업로드하거나 이동할 경우, Synology Photo에서 HEIC, HEVC 파일을 제대로 인식하지 못할 수 있습니다.
그러나 모든 설정이 올바르게 완료되었다면, SMB를 통해 업로드한 파일도 정상적으로 인식되어야 합니다.
자동 재색인은 Photo 경로에서 직접적인 수정이 발생할 때만 실행됩니다.
또한, mount -o bind나 심볼릭 링크를 사용해 다른 경로를 연결한 경우에도 반드시 Photo 경로에서 작업을 진행해야 정상적으로 작동합니다.
여기까지 따라오시느라 수고 많으셨습니다!
이번 포스팅을 통해 Synology Photo에서 HEIC 및 HEVC 파일을 원활하게 지원하기 위한 설정과 Video Station의 트랜스코딩 활성화 방법을 상세히 살펴보았습니다.
조금 복잡한 과정일 수 있지만, 이 설정들을 완료하면 시놀로지 NAS의 멀티미디어 기능을 최대한 활용할 수 있을 것입니다.
시놀로지 / 헤놀로지를 더욱 효율적으로 사용하는 데 이번 포스팅이 도움이 되었기를 바랍니다.
앞으로도 시놀로지 / 헤놀로지와 관련된 글을 포스팅할 예정이니, 많은 관심 부탁드립니다.
감사합니다!
root@TC_TEST:/# python ame72.py
Patching
Traceback (most recent call last):
File “ame72.py”, line 12, in
with open(so, ‘r+b’) as fh:
FileNotFoundError: [Errno 2] No such file or directory: ‘/var/packages/CodecPack/target/usr/lib/libsynoame-license.so’
아.. 뭐가문제일까요 선생님……
파이썬 코드 실행시 이러네요
libsynoame-license.so
파일을 못찾는거같은데
ame 를 실행해야 이게 생길까요..?
7.2.1-69057 U3
안되네요. ㅍㅜ.ㅜ
안녕하세요.
DSM 7.2.1 69057 Update 5 버젼을쓰고 있습니다.
sh codecpatch72.sh -p 입력에서 막히고 있는데, 혹시 방법이 없을까요?
간절한 도움 부탁드립니다.
감사합니다.