Skip to main content

DSM 7.1.1 42962 Update 6 AME 코덱 및 트랜스코딩

DSM 7.1.1 42962 Update 6에서6 및, 2024년 3월 27일 자 기준으로 가장 최신 버전인 DSM 7.2.1 69057 Update 4의
Advanced Media Extensions (HECV Only) 및Extensions, Video Station 트랜스코딩, (부정확함)Synology Photo의 얼굴 인식을 활성화하는 방법을 기재한다.

AME를이를 설치함으로,통해 Synology Photo에서 HEIC, HEVC를HEVC 지원하파일을 읽어 들일 수 있게 된다.


설치과정

1. 헤놀로지

image.png

먼저, 패키지 센터에서 Advanced Media Extensions를 제거하고 설치한다.

설치 후 열지는 않는다.

 

Synology Photo와 Video Station도 설치한다.

 

image.png

또한, 패키지 센터에서 설정에 진입하여, 패키지 소스에 다음 내용을 추가한다.

이름 : synocommunity
위치 : http://packages.synocommunity.com

image.png

추가된 커뮤니티 탭에서 FFmpeg를 검색하여 4, 5, 6을 모두 설치한다.

 

image.png

제어판 > 터미널 및 SNMP에서 SSH 서비스를 활성화한다.

 

2. 시놀로지 데모

https://demo.synology.com/ko-kr/dsm

위 링크에 접속하여 시놀로지 데모 (한국어판)를 실행한다.

image.png

패키지 센터에서 Advanced Media Extensions을 열고 (기본적으로 설치돼 있음) 라이센스 가져오기를 클릭한다.

 

image.png

이메일 인증이 가능한 아무 계정으로, 새 시놀로지 계정을 생성하여 로그인한다.

image.png

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

image.png

일반에서 사용자는 root가 아닌 demouser로 설정한다.

image.png

작업 설정에서 사용자 정의 스크립트에 다음 내용을 추가하고 저장한다.

cd /volume1/homes/
tar -cvf AMEPack.tar /volume1/@appstore/CodecPack/pack

image.png

이후 생성한 스크립트를 실행한다.

image.png

파일 스테이션의 homes에 진입하면, AMEPack.tar이 보일 것이다.
용량은 AAC가 빠진 HEVC 코덱만 존재하기에, 77MB 혹은 80MB 가량일 것이다.

해당 파일을 다운로드한다.

이제 시놀로지 데모는 종료하여도 된다.

 

3. 다시 헤놀로지

다운로드한 AMEPack.tar 파일을 헤놀로지에 업로드한다.

SSH로 해당 경로에 접속하여야 하기에, 접속하기 편한 경로로 설정한다.
가능하다면 AMEPack.tar 파일이 존재하는 폴더에는 다른 파일이 없게 하는 것이 좋다.

image.png

파일의 경로는 속성의 위치에서 확인할 수 있다.

 

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

image.png

정상적으로 실행된 경우, Volume1/@appstore 경로에 압축이 해제된다.

 

5. AME Patch

AME 코덱을 과거 버전 (DSM 7.0 이전)으로 속여, 시놀로지 로그인을 우회한다.

 

ame72.py

위 첨부 파일을 다운로드하여, 마찬가지로 root 경로로 옮긴다.

sudo -i
cd /

필자의 경우 다음과 같다.

mv volume1/Archive-Main/_XPEnology/AME72/ame72.py /

 

다음 명령어를 입력하여, ame72.py 파일을 파이썬으로 실행시킨다.

python ame72.py

image.png

정상적으로 실행된 경우, 이렇게 출력된다.

 

 

 

출처는 GitHub 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을 포함한다.

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

 

 

 

다음 명령어를 통해 vi 편집기에 진입한다.

vi ame.py

키보드 A키를 눌러 편집 모드에 진입하고, 아래 내용을 붙여 넣는다.
내용의 출처는 synocodecpack patch이다.

import hashlib

import os



r = ['669066909066906690', 'B801000000', '30']

s = [(0x1F28, 0), (0x48F5, 1), (0x4921, 1), (0x4953, 1), (0x4975, 1), (0x9AC8, 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() not in ['fcc1084f4eadcf5855e6e8494fb79e23', '923fd0d58e79b7dc0f6c377547545930']:

        print("MD5 mismatch")

        exit(1)

    for x in s:

        fh.seek(x[0] + 0x8000, 0)

        fh.write(bytes.fromhex(r[x[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}")

저장은 ESC키를 누르고, :wq!를 입력하면 된다.

이후 다음 명령어를 입력하여 실행한다.

python ame.py

image.png

성공하면 이런 식으로 출력된다.

image.png

이후 패키지 센터의 Advanced Media Extensions를 실행하면, HEVC가 활성화되어 있을 것이다.

AAC는 AME의 특정 버전 업데이트 이후로 빠지게 되었다.

이후 다음 명령어를 입력하여 Video Station에서의 트랜스코딩을 활성화한다.
출처는 Wrapper_VideoStation이다.

bash -c "$(curl "https://raw.githubusercontent.com/darknebular/Wrapper_VideoStation/main/installer.sh")"

image.png

I (대문자 아이)를 입력하여 설치를 진행한다.

image.png

성공하면 이런 식으로 출력된다.

만약
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

image.png

키보드 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에서 읽어 들이지 못한다.