發表文章

FFmpeg 影片旋轉與 Metadata 旋轉標記(Side Data)處理解析

圖片
在處理手機或相機拍攝的影片時,常會遇到「畫面明明是直的,但處理後方向卻亂掉」的狀況。這篇文章記錄了我理解 FFmpeg 畫面旋轉與消除 Metadata 轉向標記的經驗。 為什麼畫面會「轉兩次」? 影片的方向控制其實分為兩個層面: 原始像素資料 :畫面實際儲存的長寬與像素陣列。 Metadata 轉向標記(Displaymatrix Side Data) :播放器讀取時,根據這項標記自動旋轉畫面(例如 -90.00 degrees )。 FFmpeg 預設在處理影片時,會 自動套用 Metadata 的旋轉標記。如果你又手動加上 -vf transpose ,就會導致畫面被「旋轉了兩次」。

[AI協作] 使用 Metadata 資料重新命名 MP4 影片檔案:完整腳本與踩坑紀錄

圖片
整理歷年影片備份時,發現檔名存在各種格式不一致的問題:有些檔名帶有 6 位數秒級時間,有些帶有 9 位數毫秒級時間,有些說明文字直接黏在數字後面;更棘手的是,從相機或手機匯出的影片,檔名上的時間與 MP4 內部的 Metadata( creation_time )存在 UTC 時區差。 為了批量修正這些影片,我決定寫一個 Bash 腳本來自動化處理。這篇文章紀錄了開發過程中遇到的幾個 Shell 特性陷阱,以及如何透過與AI協作快速疊代出穩定的解決方案。

解決Ubuntu解壓縮 tar 檔中文檔名亂碼問題(20260818更新)

在 Linux 系統中(如 Ubuntu 預設使用 zh_TW.UTF-8 ),如果收到來自 Windows 或舊系統打包的 .tar 檔,常因為編碼不一致(例如舊系統使用 Big5)而導致解開後檔名變成一堆亂碼。 本文分享如何先 快速檢測檔案編碼 ,並精準將檔名還原為正常中文。 快速預覽與檢測編碼(推薦方法)

[Ubuntu 24.04] HEIC 圖檔轉 JPG/PNG 指南:libheif 解碼外掛安裝與 ImageMagick

 從 iPhone 或 Samsung 手機 傳到電腦上的 .heic 照片,在 Linux (Ubuntu 24.04) 上預設無法直接開啟。本文紀錄如何安裝 libheif 的 HEVC 外掛套件來解決「Unsupported codec」問題,以及如何用 ImageMagick 快速批次轉檔。 方法一:使用 libheif(需補齊 Plugin 外掛) 直接安裝 libheif-examples 時,轉檔可能會遇到以下報錯: Could not decode image: 0: Unsupported feature: Unsupported codec 這是因為 HEIC 底層使用了 HEVC (H.265) 編碼,預設套件並未包含解碼外掛。只需補上 libde265 與 ffmpegdec 外掛套件即可解決: 1. 安裝工具與解碼外掛 sudo apt update sudo apt install libheif-examples libheif-plugin-libde265 libheif-plugin-ffmpegdec 2. 轉檔指令 # 轉成 PNG heif-convert input.heic output.png # 轉成 JPG heif-convert input.heic output.jpg $ heif-convert -v 1.17.6 libheif: 1.17.6 plugin path: /usr/lib/x86_64-linux-gnu/libheif/plugins 方法二:使用 ImageMagick(開箱即用/支援批次) 如果你想要更簡潔的指令,或是需要處理大量圖片, ImageMagick 在 Ubuntu 24.04 上已內建完整支援。 1. 安裝 ImageMagick sudo apt install imagemagick 2. 單檔轉檔 convert input.heic -quality 95 output.jpg 3. 資料夾全套批次轉換 for f in *.heic; do convert "$f" -quality 95 "${f%.heic}.jpg"; done $ convert -version Version: ImageMa...

不同語系date指令印出的格式

會想彙整一下不同語系date指令印出的格式,因為crontab跟我測試script結果不一致。 lzh語系 是Ubuntu預設安裝繁體中文時使用。我裝Ubuntu系統會先用en_US裝好再改語系成zh語系。  $ LC_TIME=lzh_TW.UTF-8 date 公曆 20廿六年 七月 十五日 週三 八時42分十一秒 zh語系 $ LC_TIME=zh_TW.UTF-8 date 西元2026年07月15日 (週三) 08時42分21秒 CST en語系 $ LC_TIME=en_US.UTF-8 date Wed Jul 15 08:42:31 AM CST 2026

在SSH Server使用可抵抗量子攻擊的加密以提升Ubuntu安全性

隨著量子密碼學(PQC)的發展,傳統的加密演算法,如 RSA,在未來量子電腦面前將變得脆弱。為了落實「前向安全性(Forward Secrecy)」,防範攻擊者「現在攔截、未來解密」的威脅,我已將 SSH Client 與 Server 同步升級到了抵禦量子攻擊的安全規格。 這篇文章將快速分享SSH Server 端關鍵設定,以及如何用 1 個指令確認設定是否成功生效。

解決 Ubuntu 掛載 JFS 檔案系統失敗與修復

 在 Linux 系統中掛載較少見的 JFS(Journaled File System)檔案系統時,有時會遇到令人頭痛的掛載錯誤。本文將透過實際案例,帶你一步步從安裝工具、排查錯誤,到成功修復並掛載 JFS 磁碟。

修正python3.12-venv相依關係python3.12無法修正問題,您保留了損毀的套件

圖片
這是我從Ubuntu升級22.04 (Jammy Jellyfish)到24.04 (Noble Numbat) 遭遇的問題之一。因為python3版本從3.10改成3.12,所以套件也需要重新安裝。 python3.12-venv:相依關係:python3.12 (=3.12.3-1ubuntu0.13) 但 3.12.7-1+jammy1 卻將被安裝 E: 無法修正問題,您保留(hold)了損毀的套件。

(2026更新)新增 Github Action 測試 SSH到 Linode

圖片
新增 Github Action 測試 SSH到 Linode 使用情境: 在變更Linode登入帳號與設定後,但是整個流程編譯會很花時間,可以這篇提供的script來確認變更後的資訊可以連線正常。

[AI協作] 圖片視覺比對工具 部署上線

圖片
在影像演算法研究、日常的網頁開發、UI/UX 設計中,我們經常需要比較不同版本圖片之間的細微差異。傳統的雙圖對比(Before / After)雖然常見,但在面對「原始圖、修改 A 版、修改 B 版」,或是「不同壓縮率」等多版本同時比較的情境時,往往顯得有些不夠用。 過去在研究所時曾使用BCB寫過相似的比對工具,但事過境遷已無繼續維護。為了解決這個痛點,現在可以與 AI(Gemini)深度協作,從需求構想、介面優化到細節調整,共同打造並部署了這款網頁版「圖片視覺比對工具 」!

[Win11] 修復找不到 wmic 指令的問題

圖片
最近在幫忙將家人的電腦重灌成 Windows 11 25H2 後,為了確認電腦的網卡速率、主機板資訊及晶片組型號,我打開 PowerShell 並輸入 wmic 指令。沒想到,系統竟然跳出錯誤,顯示找不到該指令。我很困惑,明明在 C:\Windows\System32\wbem 下還能看到 wmic.exe 的檔案,環境變數 (PATH) 也都設定正確,為什麼 PowerShell 就是叫不動它呢? 經過一番研究才發現,原來這是 Windows 11 在架構上的重大改變。

[AI協作]更新FFMPEG BASH SCRIPT

  在Ubuntu 22.04上與AI協作的更新FFMPEG BASH SCRIPT 抓取的是由  John VanSickle  建置的靜態ffmpeg軟體包, 如果你需要 ffmpeg 使用URL,如m3u8,請依建議安裝nscd套件,否則程式會crash sudo apt install nscd

整理:Windows 11的剪取工具(螢幕截圖)

Windows 11的剪取工具 剪取工具就是執行以前Win XP/7/8/10的螢幕擷取功能,只是在Windows 11上整合並強化的他的功能,還可以錄影。 剪取工具快捷鍵 Print Screen 啟動剪取工具,以前是擷取畫面複製到剪貼簿。 Window + Shift + s 啟動剪取工具,以前是啟動區域剪取功能。 Alt + Print Screen 僅擷取目前作用中的視窗並複製到剪貼簿。 Window + Print Screen 擷取全視窗畫面直接存到檔案中,畫面會整個黑一下。 如果你當下應用程式是整版視窗的系統管理員,怎麼按都不會有反應;這時請將整版視窗縮小視窗,或是與其他應用並排一下再按剪取工具快捷鍵。 新舊版本名稱 以Windows 11 25h2來說,現在的螢幕擷取工具叫做'剪取工具',它整合了就的螢幕剪取和剪取工具,但是也導致升級時出現許多問題,像是按下Print Screen後沒反應、選取螢幕區域後沒有儲存到資料夾等等。而在早期的如Windows 11 22h2系統,它預設的就只是'螢幕剪取'這個程式。 Windows 11舊: 螢幕剪取 Windows 11新: 剪取工具 新的應用程式是可以在Microsoft Store中搜尋的到,如果你在英文網站上搜尋要以'Snipping Tool'來找,而在中文網站上搜尋則是以'剪取與繪圖'來找。 下面這個網址進去可以看到'剪取工具'英文名 https://apps.microsoft.com/detail/9mz95kl8mr0l?hl=en-GB&gl=ZA 下面這個網址進去可以看到'剪取工具'中文名 https://apps.microsoft.com/detail/9mz95kl8mr0l?hl=zh-TW&gl=TW 只是這兩者是同一個應用程式,以2025/03/19可看到的應用程式資訊我寫在下面: 上次更新日期 2026/3/10 發行日期 2018/2/28 估計大小 311.2MB 版本號 11.2601.0.0 Store上寫的不是'剪取工具'為什麼我還要稱呼它為'剪取工具'? 因為你在系統中找該應用程式的時候,以及開始裡頭找的時候,它是叫做...

pyhon用matplotlib畫圖範例與設定字體

Python使用matplotlib畫圖範例 import matplotlib.pyplot as plt import numpy as np import os import zipfile # UserWarning: Glyph 26371 (\N{CJK UNIFIED IDEOGRAPH-6703}) missing from font(s) DejaVu Sans. from matplotlib import font_manager font_path = "/usr/share/fonts/opentype/noto/NotoSerifCJK-Medium.ttc" # 修改為字體實際路徑 font_prop = font_manager.FontProperties( fname = font_path) plt.rcParams[ "font.family" ] = font_prop.get_name() # Chart 1: 全球市場規模成長趨勢(折線圖) years = [ 2020 , 2024 , 2030 ] values = [ 60 , 280 , 1800 ] # 單位:十億美元 plt.figure() plt.plot(years, values, marker = 'o' , linestyle = '-' , color = 'blue' ) plt.title( "全球 AI 市場規模成長(十億美元)" ) plt.xlabel( "年份" ) plt.ylabel( "市場規模" ) plt.grid( True ) plt.tight_layout() # Prepare folder for images img_dir = "./ai_charts" os.makedirs(img_dir, exist_ok = True ) plt.savefig( f " { img_dir } /01_market_growth.png" ) plt.close()   Python列出matpl...

BASH游標的快速移動與清除

BASH游標的快速移動與清除 左右移動,依照字元 (Character) 為單位 Ctrl+F 向後移動1個字元,等同→ Ctrl+B 向前移動1格字元,等同← 左右跳移動,依照字 (Word) 為單位 Alt+F 向後移動到字的第一個字元,等同 Ctrl+→ Alt+B 向前移動到字的第一個字元,等同 Ctrl+← 移動到頭尾 Ctrl+E 移動到最後,等同Home Ctrl+A 移動到最後,等同End 清除字元,這適合截斷URL Ctrl+K 從目前位置清除往後的所有字元。 Ctrl+U 從目前位置清除往前的所有字元。

React整合TinyMCE編輯器

TinyMCE編輯器 是一個提供在網頁使用的所見即所得文字編輯器,但是有免費提供的GPLv2釋出版本。 商用需要與註冊官方網站並取得授權金鑰,否則部屬到網站上,編輯內容會被遮擋無法使用。 整合方式官方 都已經整理好,照著作就行囉!

解決部屬到Firebase Hosting SSR遭遇的Credential問題Error: invalid_grant: Invalid grant: account not found

這幾天將Next.js原本遷徙到secret manager來管理,只是一旦部屬Firebase Hosting SSR,遭遇了Credential錯誤問題 Error: invalid_grant: Invalid grant: account not found 究竟該如何解決呢?

簡記:解決Firebase部屬Next.js使用pnpm的部屬失敗問題

在本機端檢查與建置都會成功,但是總是在傳到雲端(cloud build)後發生錯誤 索性就安裝這個錯誤訊息所指出的套件 pnpm install @opentelemetry/api@1.9.0 解決這個部屬問題... 拿這個問GPT它會說,這應該是只有使用pnpm時才會發生,因為firebase-tools只使用與npm操作的狀況 另外,每次pnpm run build建置都會顯示的warning也很煩 pnpm install -D esbuild 0.19.2 裝完會寫說有東西需要approve我就確認 pnpm approve-builds 空白鍵選擇 esbuild再按確認,完畢!

簡記:Node.js使用google sheet API讀取(新版google-auth&typescript)

 這裡是serviceaccount的json放在環境變數中,並googleapis套件操作google sheet api。 因為新版google auth套件有改版把fromJSON()和給廢掉,導致升級版本程式要調整,跟google&AI弄了弄,範例都給我奇怪的結果,這篇把這些整理起來 pnpm add googleapis import { google , sheets_v4 } from 'googleapis' ; async function main ( ... args : string []) { const credentials = JSON . parse (process. env . SHEET_CREDENTIALS ); const authClient = new google . auth . JWT ({ scopes : [ 'https://www.googleapis.com/auth/spreadsheets' ] }) authClient . fromJSON ( credentials ); const sheetAPIs = google . sheets ({ version : 'v4' , auth : authClient }); const res = await sheetAPIs . spreadsheets . get ({ spreadsheetId : process. env . SHEET_ID }); if ( ! res . ok ) throw Error(`http error code:${ res . status }`); console . log ( res . data ) } const args = process . argv . slice ( 2 ); main ( ... args ). catch ( console . error ); scopes上面是提供讀寫 如果只讀取,就改成 scopes: ['https://www.go...

簡記:在typescript中自定義環境變數內容

在原始碼最上層建立檔案 env.d.ts 寫入以下相關, 其他所需的變數請自行舉一反三增加 declare namespace NodeJS { interface ProcessEnv { /** * App 執行環境 * - development: 開發環境 * - production: 正式環境 * - test: 測試環境 */ NODE_ENV : 'development' | 'production' | 'test' ; /** 僅伺服器端 */ PRODUCT_SHEET_CREDENTIALS : string ; PRODUCT_SHEET_ID : string ; STORAGE_CREDENTIALS : string ; STORAGE_BUCKET_NAME : string ; /** 公開給前端 */ NEXT_PUBLIC_FIREBASE_SDK_CONFIGS : string ; NEXT_PUBLIC_API_URL : string ; } }