影音剪輯 / 使用 ffmpeg 分割影片 (指定開始及結束時間或固定時間長度分割)

影音剪輯 / 使用 ffmpeg 分割影片 (指定開始及結束時間或固定時間長度分割)

使用 ffmpeg 可以很有效率地完成很多影片或聲音檔的剪輯動作,安裝 ffmpeg 就不多做討論了可以參考這篇 安裝 ffmpeg 以指令進行影音剪輯,剪輯影像和聲音檔的方式是一樣的,以下就以 mp4 檔為範例。 依據給定的時間切割影片 ▍ 給定時間切割影片 (開始時間及時間長度) ffmpeg 基本的影片分割指令僅需給定開始時間和時間長度即可: 其中 -ss 參數指定起始時間、 -t 指定時間長度,上面範例是從影片第 30 秒開始,並切割時間長度為 1 分鐘 (60秒),也就是切割從 30 秒至 90 秒的影片。可以接受 timestamps 格式 HH:MM:SS.xxx 或秒數 s.msec 兩種時間格式 (如上範例)。 -i 、 -c 則為來源檔案及編碼,這裡輸入 input.mp4 檔案並且不重新編碼 (copy)。 ▍ 給定時間切割影片 (開始時間及結束時間) 另外也可以明確指定開始及結束時間切割影片,使用 -to 參數: ▍ 給定時間切割影片並重新編碼 這邊也可以給定編碼資訊分別對影像及聲音重新編碼,以下範例給定影像編碼 libx264 並且不對聲音編碼: 固定時間長度自動分割整個影片 這邊如果我們希望將一個影片檔案,依照給定的固定時間長度將整個檔案分割成數的小檔案,只需要加入...

影音剪輯 / 使用 ffmpeg 指令合併影片及聲音檔 (直接複製資料不重新編碼)

影音剪輯 / 使用 ffmpeg 指令合併影片及聲音檔 (直接複製資料不重新編碼)

最近因為在寫一些關於影片或聲音檔案合併的程式時,發現了 ffmpeg 本身有出了一個以指令介面為主的剪輯程式。其中可以透過這套程式做到基本的影片剪輯、合併、編碼等動作,詳細的指令和使用方式可以參考官方文件。 如果我們想要將一個影片檔案及聲音檔案直接合併起來,例如當我們從 YouTube 上分別將影片的影像及聲音下載下來,最終還是需要將兩個檔案合併成為一個完整的影片檔,這時候就可以簡單透過 ffmpeg 指令去完成。 ▍ 直接複製影像內容,並對聲音重新編碼後合併影片 這邊先簡單介紹最基本的合併動作:直接複製影像內容,不對影像進行重新編碼 (re-encoding),並對聲音重新編碼。這樣的目的是為了加快處裡速度,因為當我們需要對影像進行重新編碼時將會需要大量的運算,那處理速度上就會差很多,但由於聲音的資料量相對小很多,對其重新編碼並不會對速度造成太大的影響。所以一般的狀況下,如果沒有特殊的需要,我們可以選擇直接以這個方式進行合併。指令如下: 其中影像及聲音檔案最好在同一個目錄底下,且檔名應包含副檔名。在這指令下,我們是假設影片檔並不包含聲音資訊,該聲音資訊是分開存在另一個聲音檔當中,所以才需將它完全對應的合併。例如我在 YouTube 下載了影像及聲音檔案後,分別為 video.mp4 及 audio.webm,並且輸出至 output.mp4,那麼就會以下指令進行: 在這邊我們是以 AAC 編碼對聲音進行重新編碼,原因是 AAC 是 MP4 container 可支援的聲音編碼格式之一 (AAC 編碼資訊:FFmpeg Wiki: AAC Encoding Guide),若有需要,也可以替換成任何可支援的聲音編碼格式。 若影像或聲音檔的長度不相同,可以加入--shortest參數,輸出的影片將會結束在較短的時間。 ▍ 複製影像及聲音內容,且不做任何重新編碼直接合併影片 這取決與你的 container 是否可以支援該影音編碼,例如 MKV 對於編碼的支援程度就很高,這時我們可以不對影像及聲音進行任何重新編碼,只需直接複製即可。指令如下: ▍ 替換影片中的聲音,並對聲音進行重新編碼 另一種狀況,如果匯入的影像檔案以包含音軌資訊,但我們想用另一個聲音檔取代,則必須使用-map參數告訴 ffmpeg 這邊採用第一個匯入檔(input)的第一個影像資訊,及第二個匯入檔的第一個聲音資訊。指令如下: 同樣的,這裡也對聲音進行重新編碼,並採用 AAC 編碼格式。 Reference How to merge audio and video file...

Python / 解決 pip 安裝套件時遇到 SSL CERTIFICATE_VERIFY_FAILED

Python / 解決 pip 安裝套件時遇到 SSL CERTIFICATE_VERIFY_FAILED

稍微查了一下,使用 pip (或 pip3) 安裝 Python 套件時遇到 SSL CERTIFICATE_VERIFY_FAILED 錯誤可能的原因有很多,錯誤的狀態也有很多種,不過總體來看就是 SSL 的認證問題。如果在不嘗試解決認證問題之下,還可以透過以下指令參數忽略 SSL 認證直接安裝套件,目前試過是成功的。 ▍ 安裝套件的 pip 指令: ▍ 加入信任參數後的 pip 指令: 透過升級 pip 解決此問題 在 pip 10.0 之後可以透過指令升級 pip 來解決此問題,指令如下。 ▍ 升級 pip 的指令: Reference pip install fails with “connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)” | stack overflow Copyright announcement:Photo by Markus Spiske on...

WordPress / 如何讓 Enlighter sourcecode 在小螢幕上自動出現水平卷軸

WordPress / 如何讓 Enlighter sourcecode 在小螢幕上自動出現水平卷軸

如果在 WordPress 中撰寫一些程式相關的內容,通常我們都會希望程式碼的文字格式和一般文章會稍微有點不一樣,讓程式碼的閱讀性更佳。以本網站來說,目前使用了 Enlighter Sourcecode 這個外掛套件來存放程式碼的內容。不過當網站在小螢幕的裝置上閱讀的時候,會發現預設的格式是不會出現水平卷軸的,而是以斷行的方式呈現,這對程式碼來說在閱讀上實在有些的不方便。 ▍ 只需調整 CSS 屬性讓水平卷軸自動隱藏或出現,不讓畫面切斷程式碼 調整的方法很簡單,只需要修改 .enlighter-default 的 CSS Code: 調整 overflow 和 white-space 這兩個屬性,並且其中 !important 可以視情況選擇要不要加入,調整完後就會自動視螢幕大小出現水平卷軸了! Reference Horizontal scroll on small screen | EnlighterJS / Plugin.WordPress Copyright announcement:Photo by Rishabh Pammi on Unsplash

Python / 如何移除字串中的特殊字元 使用 Unicode 編碼判斷保留中(日韓)、英文及數字字元

Python / 如何移除字串中的特殊字元 使用 Unicode 編碼判斷保留中(日韓)、英文及數字字元

在做文字資料的清理時,最頭痛就是內含有特殊的字元,諸如一些標點符號 (如”^*/$#)、特殊符號 (如空白、TAB) 甚至,系統控制符號 (如 \n 換行字元、\b 退位字元) 或尚未被定義的編碼。如果是在全英文的環境,要清理字元還算簡單,只需利用 ASCII Code 判斷字元是不是英文或數字即可。最直覺的辦法就是利用 replace() 這個函數以窮舉法去將目標字元移除,例如欲移除字串中的空白、TAB和換行字元可以用下列方式移除: (由於接下來稍為對編碼及語法做簡單的說明,若已熟悉編碼或Python語法可以跳到最後直接參考範例程式) 利用字元編碼清除特殊字元 Python 內建就可以利用 ord() 函數取得字元的實際編碼,反過來也可以利用 chr() 函數將編碼重新轉換成字元。 ▍ 利用 ord() 函數取得字元編碼 同樣得,如果是在英文環境那還算單純,由於 ASCII Code 其實就是對應 0 ~ 255 的數字,例如換行字元 (\n) 等同於 10、TAB 字元等同於 9。所以若只希望保留大小寫英文字元及數字,可以利用 ord() 函數取得字元的編碼,再判斷該字元應該被保留或移除。大寫英文字母 (A-Z) 的編碼分別對應 65~90、小寫英文字母 (a-z) 則為 97~122,而數字 (0-9) 的編碼則是 48~57。清除字元的範例如下,最終 string 的結果會是 'teststring': 當然,也可以把上面的程式改成函數的方式重複使用:...

Python / 檔案目錄處理 (windows system)

Python / 檔案目錄處理 (windows system)

目錄 取得程式執行目錄 (current directory) 取得檔案大小 (Filesize) 確認檔案或目錄是否存在 刪除目錄下所有檔案 ▍取得程式執行目錄 (current working directory) ▍取得檔案大小 (Fileszie) 取得檔案大小的方法有三種,回傳的結果是位元組 (bytes) 使用 os.path.getsize(path) 使用 os.stat(path).st_size 使用 Path(path).stat().st_size (Python 3.4+) Reference Getting file size in Python? | stack overflow ▍確認檔案或目錄是否存在 在 os 套件中有三種相關的方法可以確認檔案或目錄是否存在: os.path.exists() 檢查檔案目錄是否存在 os.path.isfile() 確認路徑是否為檔案 os.path.isdir() 確認路徑是否為路徑 另外,在 Python 3.4 以上的版本可以使用 pathlibPath 套件: Reference Python Check If File...

Python / 使用 Selenium 撰寫網路爬蟲程式 (chromedriver)

Python / 使用 Selenium 撰寫網路爬蟲程式 (chromedriver)

想要用 Python 實作網路爬蟲程式的方法有兩種:使用 requests 套件或 selenium 套件。兩個套件的差異在於 requests 套件是使用最基礎的 GET 和 POST 方法和 server 溝通,好處在於它的速度快、作法單純,壞處是必須處裡來自於網站的一切資料傳輸動作、Cookies Handling、甚至更複雜的 JS 渲染、網頁程式互動等複雜的動作。如果要爬的目標網站內容比較單純,或甚至可以透過 API 取的資料,那可以考慮使用 requests 套件。不過現在的網站設計越來越複雜,本篇使用的 selenium 套件則是透過控制瀏覽器 (本篇使用 chromedriver),讓瀏覽器為我們處裡上面提到的複雜動作,例如登入帳號之後的 cookies handling、表單填寫並送出 POST request 或是 JS 渲染後的網站動作,讓我們模擬實際操作網站的方式進行網站爬蟲。本篇目前不是完整的爬蟲程式教學,只是筆記一些關於使用 Selenium 套件撰寫爬蟲程式的方法。 目錄 如何取得 HTML 的 attribute (how to get attribute of element) 實作捲動畫面 (Scrolling) ▍如何取得 HTML 的 attribute (how to...

Python / 如何在建立 SQLite 資料庫並在 python 中執行 SQL Script

Python / 如何在建立 SQLite 資料庫並在 python 中執行 SQL Script

SQLite 雖然是一個資料庫,但它並非是一個完整的資料庫伺服器,它是以 C 語言為基礎並根據 SQL 標準開發出來的小型資料庫檔案格式,是一個開放原始碼的語言。SQLite 現在幾乎已經內建在許多跨平台的裝置上,而 sqlite3 是 Python 內建的套件,可以用以存取、執行 SQLite資料庫檔案。 ▍安裝 DB Browser ▍在 Python 上連線 SQLite 資料庫並執行 SQL Script sqlite3 是 Python 的內建套件,可以直接 import 取用。使用時先以 connect() 建立資料庫連線,並建立 cursor() 物件以呼叫 execute() 執行 SQL Script。最終記得 commit() 儲存上面執行的任何修改,並以 close() 關閉資料庫連線。 ▍讀取 SELECT 結果 使用 execute() 執行 SELECT 語法會以 tuple 串列的格式回傳資料 在官方的文件中的範例: ▍建立 temp table...

SQLite / 語法筆記

SQLite / 語法筆記

目錄 如何在 SQLite 實現 Truncate Table SQLite 的時間與日期函數 取得當下時間(在地時區) 建立 temp table ▍如何在 SQLite 實現 Truncate Table TRUNCATE 指令在 SQL Server 中是清除整張 table 的所有 records,但不會刪除整張表單也不會移除 table schema。SQLite 不是使用 TRUNCATE,而是使用 DELETE 這個指令。 Reference SQLite: TRUNCATE TABLE Statement | totn SQLite ▍SQLite 的時間與日期函數 在 SQLite 中有五個關於時間和日期的函數: date(time-value, ...) : The date() function returns the date in this...