顯示具有 FreeSoftware 標籤的文章。 顯示所有文章
顯示具有 FreeSoftware 標籤的文章。 顯示所有文章

2024年11月29日 星期五

OBS 快捷鍵的設定檔

2024年11月29日 星期五

電腦因為系統太舊,很多工具不能安裝了,加上最近頻頻因不明原因當機重新啟動,只好拿出安裝好一陣子沒上線的新系統來更新、測試。

平時在錄教學影片的 OBS ,安裝版本為 30.2.3 ,設定開始錄影與結束錄影的快捷鍵時,發現了一個問題,它居然無法正確抓到我簡報筆的按鍵:

  • Ctrl + Windows + E
  • Ctrl + Windows + C
[圖1] 設定快捷鍵

以前在 OBS 27.x 版時是可以抓到這兩組按鍵的,現在偵測不到,怎麼辦?

好吧!使大絕,直接改設定檔總可以了吧!

設定檔在哪裡呢?

先按一下 OBS 上方主選單 [檔案] 中的 [顯示設定檔資料夾] 

[圖2] OBS 開啟設定檔資料夾

設定檔資料夾中,找到檔名為 basic.ini 的檔案,以記事本開啟來修改

[圖3] OBS 設定檔 basic.ini
在設定檔中
[圖4] OBS 設定檔中快捷鍵的設定

找到 [Hotkeys] 的區塊,如果找不到,就新增。

以下的內容即是我需要的:

[Hotkeys]
OBSBasic.StartRecording {"bindings": [{"command": true, "control ": true, "key": "OBS_KEY_E"}]}
OBSBasic.StopRecording {"bindings": [{"command": true, "control": true, "key": "OBS_KEY_C"}]}

OBSBasic.StartRecording 用來設定開始錄影的按鍵;OBSBasic.StopRecording 用來設定停止錄影的按鍵。

按鍵對應:

  • Windows 鍵:"command": true
  • Ctrl 鍵:"control ": true
  • E 鍵:"key": "OBS_KEY_E"
  • C 鍵:"key": "OBS_KEY_C"

哈!當然是希望 OBS 可以順順的用,我按下簡報筆,就能自動偵測好,這樣子就用不著前述的筆記了;不過,有備無患的!


2022年6月4日 星期六

ffplay : 播放目錄中的所有影音檔

2022年6月4日 星期六

 ffplay 是 FFmpeg 套件中的一個影音播放器,沒有複雜的功能,哈!我喜歡它的精簡,不過似乎沒有支援播放清單的功能。沒關係,有人跟我有一樣的需求,找到這個討論串:

裡面看到了幾個 ffplay 的參數:

  • -autoexit : 播放完自動結束程式
  • -nodisp : 不顯示播放器

再加上 ffmpeg 也有的參數,「-hide_banner」或「-v quiet」,可以不顯示播放器的詳細資訊,畫面就更乾淨了。

所以用 ffplay 來播放 mp3 ,如果只播放一次就結束,指令可以這樣:

ffmpeg -hide_banner -autoexeit -nodisp XXX.mp3

想讓畫面更精簡就:

ffmpeg  -v quiet -autoexeit -nodisp XXX.mp3

需要更多選項,可以參考官網文件:

播放清單呢?

假設要播放的 mp3 都放在一個資料夾中了,在 Windows 中,就可以先切換到該資料夾中,結 FOR /F 的指令,像這樣:

FOR  /F %f IN ('dir /b') DO ffplay -autoexit -nodisp -v quiet "%f"

上面用「dir /b」來取得該目前目錄的所有檔案清單,然後一個個檔名指定給 %f。

「DO」後面就是 ffplay 的指令了,只是檔名的參數用「 %f」。

其它非 Windows 的系統的話,也是有相對應的 shell 指令可以用的。

哈!滿有意思的。


ffplay : Windows 中無法播放 mp3

FFmpeg 中,除了 ffmpeg 以外,還有 ffprobe 和 ffplay 兩個很好用的工具,之前遇過在 Windows 中使用 ffplay 來播放影片時,看得到畫面,卻沒有聲音。因為還有 VLC Player 可以用,所以也就沒管它;這兩天想直接在程式中,下指令來呼叫 ffplay 播放 mp3,當然還是不能用。

不過,這回有認真看錯誤訊息了,大概長這樣:

SDL_OpenAudio (1 channels, 22050 Hz):  WASAPI can't initialize audio client: CoInitialize

查了一下:

只要在 Windows 中設定一下環境變數「SDL_AUDIODRIVER」,讓播放器知道要用哪一個聲音的驅動程式即可解決。例如在執行 ffplay 之前,執行這一行:

set SDL_AUDIODRIVER=directsound

如果常用,就在 Windows 的系統中設定環境變數,這樣就可以一勞永逸了。


2022年5月30日 星期一

FFmpeg : 更改 mp3 的速度

2022年5月30日 星期一

 利用之前這篇「雄 : 透過 Colab 批次下載 FreeTTS mp3」下載回來的全成語音,有些聲音語速滿快的,雖然我們可以在播放時,再透過程式來調整,總覺得乾脆批次處理,一次解決比較俐落。因此,強大的 ffmpeg 又可以出場了!

我們可以使用 ffmpeg 的 atempo 來調整影音的速度:

例如:

ffmpeg -i source.mp3 -filter:a "atempo=0.75" output.mp3

上面的指令,可以將 source.mp3 的速度變成原來的 0.75 倍後,輸出成 output.mp3。

那如果想結合之前「雄 : FFmpeg : 在聲音檔前面加一小段靜音」中的 adelay filter ,在 mp3 前面加上 0.5 秒的靜音,例如:

ffmpeg -i source.mp3 -af "adelay=500|500" output.mp3

是不是直接這樣子,加分號串接?(ffmpeg 要用多種效果時用分號)

ffmpeg -i source.mp3 -filter:a "atempo=0.75; adelay=500|500" output.mp3

哈!要是像上面用,會出現類似底下的錯誤訊息啦!

Simple filtergraph 'atempo=0.75; adelay=500|500' was expected to have exactly 1 input and 1 output. However, it had >1 input(s) and >1 output(s). Please adjust, or use a complex filtergraph (-filter_complex) instead.
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!

錯誤訊息中有個關鍵字「-filter_complex」,就照這個方向試著改改看,變成:

ffmpeg -i source.mp3 -filter_complex "atempo=0.75 [temp]; [temp] adelay=500|500" output.mp3

有改變的部份,主要是使用 ffmpeg 的 Filtergraph

簡單的說明一下,source.mp3 先用 atempo 改變速度,處理完的結果用 [temp] 這個標籤代表;接著 [temp] 再用 adelay 在最前上加上 0.5 秒的靜音;最後輸出到 output.mp3。

這部份的技巧在「雄 : FFmpeg : 影片剪接與加馬賽克」中的影片處理中也使用過。

知道如何用 ffmpeg 來同時更改 mp3 的速度及在最前面加上一小段靜音,接下來只要再結合批次檔,就可以一次處理整個資料夾的語音檔囉!

相關文章


2022年5月24日 星期二

youtube-dl : SSL: CERTIFICATE_VERIFY_FAILED

2022年5月24日 星期二

在使用 youtube-dl 時,如果出現下面的錯誤訊息:

ERROR: Unable to download webpage: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)> (caused by URLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'),))

表示來源網站的 SSL 憑證可能有問題,如果還是想繼續下載,可以使用 youtube-dl 的「--no-check-certificate」選項,它就會略過憑證的檢查;當然,安全就要自負囉!

youtbue-dl : 下載 ffmpeg 無法下載的串流影片之二

在「雄 : youtbue-dl : 下載 ffmpeg 無法下載的串流影片」這篇中,利用 youtube-dl 的選項「--hls-prefer-native」,讓它避免使用 ffmpeg 來下載偽裝為圖片的串流影片,好處是可以一個網址來下載整個影片,不過因為它還是帶有圖片的識別資料,最後仍然要處理這部份,一般的影音播放工具才會識別出它是影片,才能正常播放。

後來試了一下,其實只要將帶有圖片識別資料的影片檔,去掉最前面的 3 bytes (通常是 PNG、BMP、JPG  ... ),就可以利用 ffmpeg 來進行轉存為正常影片了。

假設用 youtube-dl 下載回來的串流影片檔的檔名為 NG.mp4,想要去掉前 3 bytes (也就是由第 4 bytes 讀起),就利用底下的指令來輸出為正常的影片 OK.mp4:

ffmpeg -protocol_whitelist subfile,file -start 4 -i subfile:NG.mp4 -map 0 -c copy OK.mp4

再者,因為 youtube-dl 可以利用「--exec」的選項來指定,在影片下載並儲存完後,接著要針對輸出的檔案執行的命令。讓「--hls-prefer-native」和「--exec」同時使用,前段由 youtube-dl 來下載偽裝為圖片的串流影片,後段交由 ffmpeg 來轉為正常影片。

使用前,要先確認 youtube-dl 和 ffmpeg 都放在一起了,然後執行底下的指令:

youtube-dl ---hls-prefer-native   --exec "ffmpeg -protocol_whitelist subfile,file -start 4 -i subfile:{} -map 0 -c copy {}.mp4" URL

上面的指令中, URL 是要下載的串流影片網址。

如果和前面尚未合併的指令比較一下,有沒有發現到:

  • 輸入的「NG.mp4 」檔名被換為「{}」。
  • 輸出的「OK.mp4」檔名被換為「{}.mp4」。

當使用 youtube-dl 的 --exec」的選項,後面指令的字串裡,「{}」代表最後 youtube-dl 儲存的檔名,這樣滿方便的,我們除了使用 youtube-dl 預設的檔名外,也能使用「-o」的選項來自訂檔名,利用「{}」可以自動幫我們替換掉。

不過,為了讓原始檔跟被 ffmpeg 處理過的檔案同時存在,輸出時,在原始檔名的字尾又加上了「.mp4」({}.mp4),所以如果 youtube-dl 中使用了「-o test.mp4」,ffmpget 處理完就會變成「test.mp4.mp4」。

如果 youtube-dl 下載回來的串流影片是「沒被動過手腳」的正常影片,會是什麼結果呢?

mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000460440] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000460440] moov atom not found subfile:XXX.mp4: Invalid data found when processing input
ERROR: Command returned error code 1

如果已經是正常影片,在輪到 ffmpeg 進行後續處理時,會類似出現上面的錯誤訊息。

不過沒關係,youtube-dl 已經將影片儲存好了。

所以做一個小結論:

  • 如果執行前面的指令,經過 youtube-dl 和 ffmpeg 處理過的影片,影片的檔名會是 XXX.mp4.mp4 (.mp4 出現兩次)。
  • 如果執行前面的指令, ffmpeg 出現了錯誤訊息,影片的檔名會是 XXX.mp4。

相關文章



2022年5月17日 星期二

批次下載 FreeTTS mp3

2022年5月17日 星期二

朋友推薦可以將 TTS 語音下載為 mp3 檔案,而且授權很開放的網站 FreeTTS:

雖然沒有中文的,但是用來下載英文的語音也不錯。進入網站後,在輸入區輸入想讓它合成語音的文字,並選取想用的聲音,最後再按 [Convert to Mp3] 的按鈕,即可播放聲音,或是下載 MP3 檔案。

研究了 FreeTTS 下載的流程,大概可以分為三個部份:

  1. 填表單取得文字與設定內容。
  2. 由語音合成主機合成語音,並回傳一個帶有 MP3 檔案相關資料的 JSON 格式設定檔。
  3. 由 JSON 檔中解析出 MP3 檔案的 id ,並組合成聲音檔的網址,供播放或是下載。

FreeTTS 合成完語音檔以後,會回傳的 JSON 檔內容大概長這樣:

{"msg":"True","id":"7ef38234-5965-4b5a-9c98-45e7a39b87c5.mp3","counts":5055}

關鍵在 "id" ,它就是存放在主機上的 MP3 檔檔名。

所以想下載 FreeTTS 的 MP3 檔案必須下載兩次檔案,還要能解析第一次下載回來 JSON 檔中的 id,供第二次下載真正的 MP3 檔案。

查了一下,我常用來下載檔案的 wget 或是 curl 可以解析網頁中的連結,似乎沒有解析 JSON 檔案,並重組網址的功能。通常「卡關」了,總能得看新的東西;找方法的過程中,看到了一個叫「jq」的小工具:

它不但小巧,而且也跨平臺;和 wget / curl 搭配,各司其職,還滿好用的。

jq 的功能不少,不過我只要能由 JSON 中找出 id 的值(MP3的檔名),並在前面加上主機的網址即可。如果由 stdin 讀入資料,就是底下的語法:

jq -r "\"https://freetts.com/audio/\"+.id" 

找 JSON 中的 id 用了「.id」;使用了 -r 的參數,將字串頭尾的引號去掉,並利用加號來合成檔案的下載網址。要注意的是,在引號中使用引號,得加上反斜線。

wget 中則使用了以下的參數:

  • -nv : 不顯示訊息,主要是用在第一次抓到的 JSON 檔內容要直接輸出到 stdout,所以不容許有其它文字。
  • -c : 遇到錯誤仍繼續
  • -O : 指定輸出到哪裡,第一次用「-O - 」讓它輸出到 stdout,輸出結果(JSON檔)給 jq;第二次輸出到指定檔名的檔案。
  • -i : 指定由哪裡取得網址,應用在第二次,用「-i - 」,由 stdin 取得 jq 重組後的 mp3 下載網址。

例如我想下載「just a test」的 TTS MP3 檔案,如果 wget 和 jq 都放在路徑中了,就用這一行指令:

wget -nv -c -O - "https://freetts.com/Home/PlayAudio?Language=en-US&Voice=Joey_Male&id=Joey&type=1&TextMessage=this is a test" | jq -r "\"https://freetts.com/audio/\"+.id" | wget -i - -O "this is a test.mp3"

利用這個方法,再結合批次檔的指令,就可以進行批次下載語音檔囉!

底下是我在 Windows 7 的實驗的批次檔內容:

@ECHO OFF
SetLocal EnableExtensions EnableDelayedExpansion

REM wget 程式的路徑設定
set wgetPath=wget

REM jq 程式的路徑設定
set jqPath=jq-win64

REM FreeTTS 聲音參數
set ttsLanguage=en-US
set ttsVoice=Joey_Male
set ttsId=Joey

REM 單字的欄位分隔符號
set seperator=##

REM 檢查是否有參數, 沒有就提示並結束
if %1test==test goto error
if %2test==test goto error

REM 抓第2個參數為 mp3 輸出資料夾
set outputFolderName=%2

REM 建新的資料夾以存放處理好的檔案
mkdir %outputFolderName%

set wgetWait=--wait 3 --random-wait

REM 計數器,用來判斷是否要暫停久一點
set /a x=0

REM 抓取第1個參數的文字檔,一行行套到網址及輸出的檔名中
FOR /F "delims=%seperator%" %%w IN (%1) DO (
  if not %%wtest==test  (    %wgetPath% -nv -c %wgetWait% -O - "https://freetts.com/Home/PlayAudio?Language=%ttsLanguage%&Voice=%ttsVoice%&id=%ttsId%&type=1&TextMessage=%%w" | %jqPath% -r "\"https://freetts.com/audio/\"+.id" | %wgetPath% %wgetWait% -i - -O "%outputFolderName%\%%w.mp3"
REM 暫停一下下再抓下一個檔案, 每5次就要特別再停10秒
if !x! lss 5 (
  rem set /a r=%random% %%4+1
  set /a r=(!random! * 4 / 32768^) + 1
  set /a x=!x!+1
) else (
  set /a x=0
  set /a r=10
)
REM echo !x!
timeout /t !r!
  )
)
@echo ON
@echo.
@echo check %outputFolderName%
@echo.
@echo OFF
goto end 

:error
@echo ON
@echo.
@echo 語法:
@echo.
@echo %0 英文單字清單檔 MP3儲存資料夾名稱
@echo.

:end


使用的方法,將 wget、jq和批次檔 (假設檔名為 free_tts_mp3_dl.bat) 放在一起,或是可自動搜尋的路徑中;把要下載的英文,一行一個的格式存入純文字檔(ex. list.txt),然後執行:

free_tts_mp3_dl.bat list.txt mp3

如果成功,MP3 檔案應該會儲存到名稱為 mp3 的資料夾中。

因為 FreeTTS 有防「濫用」的機置,所以批次檔中,故意使用亂數決定程序暫停的秒數,而且每五次再多延長暫停的時間。目前的程序運作算還不錯。

在本篇筆記記錄前,其實在 Google Colab 中已經先用 Python 寫了支小工具,可以進行批次下載了,他日再寫記錄囉!

相關連結


2022年4月25日 星期一

FFmpeg : 在聲音檔前面加一小段靜音

2022年4月25日 星期一

 如果想要幫 mp3 音檔的前面,加上一段靜音,怎麼處理。用 FFmpeg 是一定可以的。底下這個討論串中,有好幾種方法:

我選擇使用

adelay filter

例如想將 in.mp3 的最前面加上 250微秒的靜音,就用:

ffmpeg -i in.mp3 -af "adelay=250|250" output.mp3

詳細的用法可以參考 FFmpeg 網站的使用手冊:

在 Windows 中,如何將整個目錄中的 mp3 檔案批次加上靜音呢?

在批次檔中,我們可以利用 FOR 來取得指定路徑中的所有檔名。FOR 怎麼用,可以參考這個討論串:

再套上前面 ffmpeg 的語法,就可以完成囉!寫了個批次檔,記錄如下:

@ECHO OFF
REM ffmpeg 的路徑設定
set ffmpegPath=ffmpeg

REM 在前面加幾微秒的靜音
set silenceMilliSeconds=250

if %1test==test goto error

REM 抓第一個參數為 mp3 資料夾
set sourceFolderName=%1

REM 輸出的資料夾名稱
set outputFolderName=%1\new

REM 建新的資料夾以存放處理好的檔案
mkdir %outputFolderName%

setlocal enabledelayedexpansion
for %%f in (%sourceFolderName%\*.mp3) do (
  rem echo %%f 
  rem echo %outputFolderName%\%%~nf%%~xf
  %ffmpegPath% -i %%f -af "adelay=%silenceMilliSeconds%|%silenceMilliSeconds%" %outputFolderName%\%%~nf%%~xf
)
@echo ON
@echo.
@echo check %outputFolderName%
@echo.
goto end 

:error
@echo ON
@echo.
@echo %0 MP3_folder_name
@echo.

:end

假設上面的指令稿儲存到 convert.bat 中,而 mp3 的檔案都放在 source 資料夾中了,只要執行這樣的指令:

convert.bat source

加好靜音片段的新檔案,都會儲存到 source\new 中。

批次檔中的指令,關鍵在如何取出所有 mp3 檔名:

for %%f in (%sourceFolderName%\*.mp3)  do (

幾個重點如下:

  • 「in」後面接的是指定的路徑,取得的檔名會放到 %%f
  • %%~nf 是取出主檔名
  • %%~xf 是取出副檔名

有了這些,其它就是不同字串間的組合了。


2022年3月30日 星期三

youtube-dl : 由 stdin 讀入網址

2022年3月30日 星期三

用 Python 寫了解析影片網址的小工具,網址要怎麼傳給 youtube-dl 呢?

youtube-dl 有個參數 -a 或 --batch-file ,它可以用來指定讀取一個網址清單的檔案;清單檔案裡面,一行一個網址;讀取後,youtube-dl 會批次下載那些網址的影片。

而 stdin / stdout 就像檔案一樣的操作,Python 以 print 將網址輸出,而 youtube-dl 就可以利用下面的語法來由 stdin 讀入

youtube-dl  -a - 

最後面那「-」減號就是 stdin。

所以假設我的 Python 程式叫 parase.py,解析的網頁是 https://a.b.c.d/xxx.html ,要執行的指令就像這樣:

python parse.py https://a.b.c.d/xxx.html | youtube-dl -a -

其實也就好玩,玩一下,不然,應該是整個都用 Python 來寫就好,一支程式就能搞定,還能有更多的變化。


2022年3月28日 星期一

youtbue-dl : 下載 ffmpeg 無法下載的串流影片

2022年3月28日 星期一

在前一篇「雄 : FFmpeg : 下載 .m3u8 播放清單的串流影片」中提到有些串流影片的影片片段被包裝成圖片檔,使用 youtube-dl 或 FFmpeg 開啟串流播放清單 .m3u8 檔後,會出現類似底下的錯誤訊息而無法下載影片:


[hls @ 00000000005aff80] Could not find codec parameters for stream 0 (Video: png, none(pc)): unspecif

Consider increasing the value for the 'analyzeduration' and 'probesize' options


仔細想想,造成 youtube-dl 無法下載的原因,應該是被 ffmpeg 給中斷了,因為如果使用 ffmpeg 來下載相同的影片,也會出現一樣的錯誤訊息而中斷。

「怨有頭,債有主。」找到原因了,那就試著看看 youtube-dl 有沒有不使用 ffmpeg 來下載串流檔案的參數。查了一下,還真有!

下面這兩個參數可以控制 youtube-dl 下載串流時使用的工具:

  • --hls-prefer-native
  • --hls-prefer-ffmpeg

從參數的名稱應該不難看出哪一個是使用 ffmpeg,哪一個是不使用 ffmpeg。

如果遇到被包裝成圖片檔的串流影片,而 ffmpeg 又無法被中斷下載,可以試試看,用 youtube-dl 的「 native HLS downloader」,在指令中加入:

--hls-prefer-native

當然囉!下載完,在檔案的最前面還是會有 PNG 的資料,一樣的,用工具去掉最前面的幾個 bytes,影片就能正常播放了。

後記

再搭配 youtube-dl 「--exec」選項,就可以在下載影片完,接著使用 ffmpeg 來將影片轉為正常的格式了。詳情參考於 2022.05.24 的完整做法:

相關文章




2022年3月27日 星期日

FFmpeg : 下載 .m3u8 播放清單的串流影片

2022年3月27日 星期日

 之前下載網路的影片大多是用 youtube-dl,不過,這幾天在某個以前能輕鬆下載的網站中,卻一直吃閉門羹。研究了幾天,稍有一點眉目。

該網站原來是由播放器載入 .m3u8 的串流播放清單,以前播放清單中放的是影片片段的網址,檔名是用 .ts 來當結尾。這次看到的 .m3u8 有兩個特別之處:一個是裡面又放別的 .m3u8 播放清單;另一種則是裡面不是放 .ts 的網址,居然是 .png 或是 .jpg。

.m3u8 檔案中放 .m3u8 這沒什麼,頂多是程序上多卡一道。但是放 .png 或是 .jpg 就妙了!而且如果將網所指的下載回來,開啟後,還真的是圖片,只差呈現的是一片白而已。利用網站的影片播放器可以播放影片,但是利用 youtube-dl 或是 ffmpeg 試著下載影片,就會出現下載到的是圖片,不是影片的警告訊息,當然影片也就下載不了。

好奇心驅使下,利用 HxD Hex Editor 開啟下載回來的 .png :

.png 影片片段檔案的內容

看到檔案的文件內容,有兩處令人覺得有趣:

  • FFmpeg Service01
  • IDAT

查了一下「IDAT」是 PNG 檔案中會用到的,而 FFmpeg 則是我用來處理影片的工具。於是將這個檔案的前 41 bytes (上圖反白的部份)刪除後,另存檔名為 xxx.png.ts。再用 VLC Player 來播播放,哇!看得到影片了吔!

依樣畫葫蘆,將另外四個小片段都刪掉前 41 bytes,並另存為 xxx.ts,仿原來的 .m3u8 製作了一個有新路徑的播放清單,可以用 ffplay 來播放,也可以利用 ffmpeg 將五個小片段合成一個 mp4 影片檔。

另一部影片的 .m3u8 播放清單中則都是 .jpg ,用 HxD Hex Editor 開啟下載回來的 .jpg 檔案:

.jpg 影片片段檔的內容

這個 .jpg 檔案的內容跟前面的 .png 長得滿像的,來比較一下:

.png 影片片段檔的內容

如果將上圖 .png 檔反白的部份刪除,它的檔頭跟 .jpg 就幾乎一樣了。所以我將下載回來的 .jpg 影片片段檔的檔名字尾加上了「.ts」,用 VLC Player 就可以直接播放了。哈!看起來,這支影片片段檔案的格式、編碼沒有問題,只要讓 FFmpeg 能接受叫「.jpg」的檔名就可以,所以要幫它加上底下的參數:


-allowed_extensions ALL 


完整的指令如下:


ffmpeg -allowed_extensions ALL -i https://xx.xx.xx.xx/index.m3u8 -c copy test.mp4


而串流播放清單中使用 .png 的影片處理起來就比較麻煩,我先解決如何用 FFmpeg 來直接下載串流檔案、去掉會誤導為 PNG 圖片的前 41 bytes。假設串流檔案叫 sample.png,使用底下的指令:


ffmpeg -f data  -protocol_whitelist "subfile,file,http,https,tcp,tls" -start 41 -i subfile:https://xx.xx.xx.xx/sample.png -map 0 -c copy -f data  sample.png.ts


輸入旳參數,去掉前 41 bytes 的關鍵:

  • -start 41 -i subfile:

如果出現 protocol whitelist 關鍵字的錯誤訊息,就再加上:

  • -protocol_whitelist "subfile,file,http,https,tcp,tls"

為了保持原來的編碼,輸入和輸出都加上:

  • -f data

輸出的編碼用 copy 的:

  • -c copy

下載並處理串流檔案的指令搞定了,剩下就是利用 PHP 去分析 index.m3u8 ,產生每一個串流檔案的處理指令,並通通放到一個批次檔裡,這樣就可以一口氣將有檔案下載回來。順便也製作一個帶有 .ts 新檔名的播放清單,方便串流檔案下載回來後,再以 FFmpeg 來合併成 .mp4 影片檔。

目前利用上述的方法,以 FFmpeg 來下載被動過手腳的影片是可行,有空再來研究一下,是不是還有更簡便的方式或工具。

相關文章


2021年5月13日 星期四

Wget : 下載完整的網頁

2021年5月13日 星期四

GNU Wget 是一個自由軟體,也是一個強大的下載工具。

之前除了下載單一檔案外,也應用在讀取網址清單,批次下載清單中檔案 (參數: -i ) 。其它的功能則還沒有玩遍。最近又試了一下,抓取完整網頁內容的參數,更為驚豔了!

不過,一開始照著參數說明去試,失敗 n 回,才發現,原來我之前在 Windows 中安裝過的 Wget 是 GNU Wget 1.11.4,這版本是 GNU Win ( http://gnuwin32.sourceforge.net/ ) 中下載的,有一點舊了。在底下的網站中下載較新的版本,所有問題都解決了:

這次的目標是要下載某一個網頁中的所有內容,包括裡面的 mp3 檔案,但是不繼續擷取網頁中連結到其它頁面的網頁。執行的指令如下:


wget -m -k -E -p  -np  http://aaa.bbb.ccc.ddd/eeeee/fffff.php


底下是各參數的說明(可以用 wget --help 查到):

  • -m,  --mirror : 相等於 -N -r -l inf --no-remove-listing 選項
  • -k,  --convert-links : 將下載後的 HTML 的鏈結轉換為本地檔案
  • -E,  --html-extension : 將所有 HTML 文件加上 “.html” 延伸檔名
  • -p,  --page-requisites : 下載所有顯示網頁所需的檔案,例如圖片等
  • -np, --no-parent : 不進入上層的目錄

會需要加 -E 的參數,主要是因為這個頁面的檔名是 .php ,在本機用瀏覽器開啟時,可能要多一個指定程式的動作,所以乾脆由 Wget 順便幫忙改檔名為 .html ,較方便;而如果去掉 -np 的參數, Wget 抓回來的就不會只有一個網頁了。

Wget 還有很多參數可以玩,有空再來試試吧!




2020年9月14日 星期一

3DP : Lenticular Card 雙變卡產生器

2020年9月14日 星期一

 小時候玩過一種卡片,拿在手上,角度改變,圖案也跟著改變,兩個圖案變來變去的,滿好玩的。後來兩個圖案設計成像動畫一般,例如:一隻奔馳的馬。有的卡片則是會讓圖案變成立體的。查了一下,原來這叫作「雙變卡」,甚至有「三變卡」,英文則是「3D Lenticular Card」。關鍵一是在圖案前的那片薄薄的透明「光柵」,其二則是不同圖案被拆成一條條後交替重組成新的圖案。「一條條」的圖案在卡片轉至某個角度經過光柵折射後,又重組成原來的圖案,讓我們看到;其它的圖形也因為折射角的關係,而無法在我們的眼睛呈現。

知道原理以後,可不可以自己來做一個雙變卡呢?用「homemade Lenticular Card」的關鍵字去搜尋,真的有耶!有人寫了程式,可以把兩張圖片「一條條」重組,並輸出圖檔。我們只要把圖檔列印以後,再動手摺一摺,就是一個「雙變圖」了。

看了前面手動摺紙的方法,激發了我寫支模型產生器,利用 3D printer 來印一個「雙變卡」的想法。


產生器主要的程序很簡單:

  • 將兩張圖片裁成一條條大小相同的圖案。
  • 產生正三角柱。
  • 將兩張圖片相同位置的部份,貼在三角柱的共邊的兩側
  • 重覆前兩部份,直到所有小圖片都貼完。

這種有重覆動作的工作,當然是利用程式來做最方便。這次選用的開發工具是:

LenticularCard 專案

完成的專案放在 GitHub 中:

使用方法

準備工作

  • 安裝 OpenSCAD
  • 下載 LenticularCard 專案檔案

裁切圖片

專案需使用到兩張不同的圖片,為了減少產生 3D 模型等候的時間,程式預設是用使 100*100 (長度單位:像素)。然後每一張圖片再每隔 10 像素,裁切成「一條」(10x100),單獨儲存十個檔案。

圖片縮小還好,只要處理二次,但是依位置裁切成十個檔案,如果手動來做,手可就酸了!哈哈哈~其實我也是做過這樣的傻事才深有所感。

手酸了才讓我想起以前在教電腦,為了做學生作品的網站,利用一個叫 ImageMagick 的工具,來批次轉換圖片大小:

它的好處是可以跨平臺使用,當初可是在 FreeBSD 的主機上執行的呢!

經過那麼多年的發展,它的功能似乎更強大了。不過這次是想拿它來將一張圖,裁切成「十條」,並另存檔案。

例如圖形的檔案名稱為 picture1.png ,原始大小為 100x100,要切成 10x100 的小檔案,可以利用magick 「convert」的「-crop」:


magick convert -crop 10x100+0+0 picture-1.png parts-1-0.png


-crop 後面的「10x100」是指定要裁成的大小, 緊接著的「 +0+0」則是指定由左(X)算起第 0 點,由上(Y)算起第 0 點當起點開始算。「parts-1-0.png」則是要輸出的檔案名稱。

所以前面的例子可以幫我們輸出「第一條」圖案。

那「第二條」呢?


magick convert -crop 10x100+10+0 picture-1.png parts-1-1.png


「第二條」的大小仍是 10x100 ,是由左 10,上 0 起算(+10+0)。

其它的就由此類推囉!

我是這樣一行行打指令的嗎?哈哈哈!這次當然沒這麼老實了。如果是在 Windows ,可以利用 DOS 的 FOR 來幫我們完成「改數字」的部份:


for /L %a in (0,10,90) do (magick convert -crop 10x100+%a+0 picture-1.png parts-1-%a.png )

for /L %a in (0,10,90) do (magick convert -crop 10x100+%a+0 picture-2.png parts-1-%a.png )


只要準備好兩張 100x100 的圖片,一張命名為 picture-1.png ,另一個命名為 picture-2.png ,然後執行上面的兩行指令即可一次搞定囉!(專案中加入了一個給 Windows 用的批次檔,請參考 2020.09.15 的更新記錄)

其實有了 ImageMagick  也可以順便縮小圖片尺寸、改變亮度與對比的,它的功能實在太多了,以後再另起新文介紹囉!


更新記錄

  • 2024.02.22 演算法優化,新增可自訂形狀的參數 shape 。
  • 2020.09.15
    * 修正圖片比例的臭蟲。
    * 加了一個檔名序號(filename_numbers)的自動產程序,將序號改成每一小張圖切割的位置,方便搭配批次切割的檔名。
    * 專案中加入一個 dos 的批次檔(magick_batch_crop.bat),可搭配 ImageMagick  使用,執行時只要在批次檔命令加上兩個圖檔的檔名,即可按預設值切出 X 座標每次增加 10 個點的檔案。需要自動縮放大小,則再加上第三個參數「resize」,需要依 Y 座標來切成橫條,則加上「Y」。
  • 2020.09.14 於 GitHub 建立新專案
  • 2020.09.07 發想完成初版

2017年5月27日 星期六

FFmpeg : 指定要加特效的時間點

2017年5月27日 星期六
2016年底的這一篇「雄 : FFmpeg : 影片剪接與加馬賽克」中利用了 youtube-dl 下載影片,並以 FFmpeg 為剪接、加馬賽克的工具,不過,當時不知道自己的 FFmpeg 版本太舊,以致於Timeline editing 的選項一直沒試成功,最後是用土法鍊鋼的方法完成了想達到的效果。這兩天心血來潮,更新了 FFmpeg ,花了一點時間研究了 Timeline editing 選項,再次體驗了 FFmepg 的強大。

這一篇就來細說重頭,一步驟一步驟的練功,最後建構出在指定位置、指定時段打馬賽克的影片。

2017年2月3日 星期五

用 StippleGen 2 將照片轉為「點點畫」

2017年2月3日 星期五

用關鍵字「halftone cnc」,想找有沒有可以將照片轉為適合雷射的工具,看到底下的網頁在介紹「StippleGen2」:

深深地被它強大的功能吸引到,它利用大小不同的空心圓或是連續的線條來取代原圖中各點的顏色,轉好的 Halftone 效果完全符合我的需求。果然玩 CNC 的人比雷射多得多,資源亦較豐富。

StippleGen2 可以在底下的網頁內下載:

StippleGen2

在 StippleGen2 中將照片圖檔載入以後,它依使用者設定的「Stipples (點點數量)」、「Min. DOT SIZE (點點的最小尺寸)」、「DOT SIZE RANGE (點點的尺寸範圍)」、「WHITE CUT OFF (去掉較白的點)」......。

前面的這幾個選項,都可以利用拉桿來調整,至於什麼選項是做什麼用,拉拉看、調整一下大小,「等一會兒」,沒錯!就是要等一會兒,程式就會一次又一次的將「路徑」及圖像最佳化。

那些選項到底要怎麼搭配?這可能要看個人口味的輕重了。我要的是「點點分明」,所以會依照相的大小去調整 MIN. DOT SIZE,解析度不高的調小一點,反之,解析度高的就調大一點,總之,讓畫面中的點和點之間能有一些些留白,這樣子,不致於會因為重疊而讓雷射完的畫面焦黑一片。

至於點點的數量要設多少,「Stipples」設愈高,解析度當然愈高,不過,放到 Inkscape 去處理,或是轉 G-code 的時候會很耗系統資源和時間的。基本上,「Stipples」預設的 2000 ,對 30mm x 30mm 的相片來說,是品質與處理時間都可以接受的。不過,為了不浪費「Stipples」數量的限制,預先將相片「去背」應該會較好。

如果覺得畫面中的結果滿意了,我們可以按左下方的「SAVE STIPPLE FILE」或是「SAVE "TSP" PATH」將點點畫或是用線條來畫的 "TSP" PATH,儲存為 SVG 格式的向量圖檔。

如何在 Inkscape 中將 StippleGen2 製作的 stipple SVG 檔案轉為 G-code 呢?

首先,我們先開啟前面儲存好的「STIPPLE FILE」(*.svg),如果 Inkscape 是 0.91 以上的版本,因為 StippleGen2 儲存的格式是舊版的格式,Inkscape 會有對話框提示進一步要如何處理舊版格式所產生的問題,沒關係,按「Scale elements」就好。

按「Scale elements」自動調比例

進到 Inkscape 的編輯畫面,調整點點畫及頁面的尺寸大小:

  1. 先點選轉好的「點點畫」,更改它的寬度和高度為想要的大小
  2. 開啟設定「文件屬性」的對話框(按「檔案」→「文件屬性」)
  3. 按一下「將頁面調整成內容大小」的「加號」展開設定選項
  4. 按一下「將頁面調整成圖畫或選擇範圍的大小」。
  5. 關閉「文件屬性」的對話框,即完成尺寸的調整。
按「將頁面調整成內容大小」展開選單
按「將頁面調整成圖畫或選擇範圍的大小」

在 Inkscape 裡面將圖輸出 G-code 的工具(Extensions)有好幾個,像「Raster 2 Laser GCode generator」、「J Tech Photonics Laser Tool」、「Gcodetools」.....。

如果是用「Raster 2 Laser GCode generator」來轉 G-code,因為它都會將繪圖區中的畫面輸出為 PNG 的點陣圖,所以直接執行這個 Extension 轉換的程序即可。為了盡量保持圖的原始效果,我會選用以下的選項:

  • Resolution :「10 pixel/mm」
  • B/W conversion : 「B/W fixed threshold」

如果要體會一下 StippleGen2 幫我們計算好的「最佳路徑」,當然是要利用能轉向量圖的,所以我使用習慣用的「J Tech Photonics Laser Tool」來轉 G-code。

先將物件轉為「路徑」:

  1. 點選要轉 G-code 的「點點畫」或「"TSP" PATH」。
  2. 點選主選單「路徑」→「物件轉成路徑」。
將物件轉成路徑

將物件轉好路徑,我們就可以開始用「J Tech Photonics Laser Tool」來轉 G-code 了。

用「J Tech Photonics Laser Tool」以向量圖來轉好的處是在打雷射時較細膩,速度也滿快的,不過它轉檔的速度在我老舊的電腦上工作,實在是令人等得捶心肝啊!如果圖較大,而 stipples 多時,自己評估吧!


Inkscape : Extensions : 以線條填滿路徑

雷切時使用 「J Tech Photonics Laser Tool」 這個 Inkscape  extension 可以幫我們將向量圖形的框線變成雷射的「刀路」。不過它只能抓到框線而已,中間填滿的部份卻無法直接轉 G -code。之前找不到什麼替代的轉換工具,這兩天運氣不錯,試出了兩個工具可以幫我們將填色的部份用線條填滿。

GitHub evil-mad/EggBot 中的 Hatch fill :
GitHub KnoxMakers/KM-Laser 中的 Hatch fill :
GitHub cnc-club/gcodetools (Inkscape 已內建) 中的 Gcodetools_area (銑面) :

這三個 Inkscape extensions 都可以幫我將已轉為「路徑(path)」的圖形內,以線條來填滿。想看到填滿效果,

  1. 先將圖形轉為路徑,再使用工具。
  2. 將 Inkscape 的「檢視」→「顯示模式」改為「輪廓」。

Hatch fill

KM-Laser 的 Hatch fill 其實是源自於 EggBot ,所以它們的 Hatch fill 界面與操作是一樣的。
  • 將圖形轉為路徑 (path) : 先選取要處理的圖形以後,點選主選單「路徑 (Path)」中的「將物件轉為路徑 (Object to Path)」
  • 由 「擴充功能 (Extensions)」 的 「EggBot」或是「KM Laser」中點選「Hatch fill」。
  • 設定參數:有關參數的用途可以點選「More Info」的頁面參考,其中最重要的是「Hatch spacing」,它決定了填線條的密度,數字愈小,填得愈密。
  • 設定好參數,選取要填線條的圖,按一下「套用(Apply)」即可查看成果。

Gcodetools Area

Gcodetools 功能強大,而且 Inkscape 已內建,但是它操作起來比較繁鎖,光看到它一堆 CNC的專有名詞,就令人早早打了退堂鼓。我是在看了底下這個解說影片才又勾起研究的興趣的:

雖然 Gcodetools 的 Area 使用起來較繁鎖一點,不過它和前面兩個用直線填滿的演算法是不同的,也滿值得玩一玩的:
  • 將圖形轉為路徑 (path) : 先選取要處理的圖形以後,點選主選單「路徑 (Path)」中的「將物件轉為路徑 (Object to Path)」
  • 由 「擴充功能 (Extensions)」 的 「Gcodetools」 中選取「方向點 (Orientation points)」,加入「2-points mode」的「方向點」。
  • 由 「擴充功能 (Extensions)」 的 「Gcodetools」 選取「刀具庫 (Tools library)」,加入「電漿刀」(Tools type : plasma)。
  • 找到「電漿刀 (Plasma cutter)」的設定區塊後,選取 Inkscape 的文字工具來修改設定。最重要的設定是刀具的直徑「diameter」,也就是雷射光的粗細,它決定了用來填滿的線條粗細,可以先試試 0.1 。
  • 由 「擴充功能 (Extensions)」 的 「Gcodetools」 中選取「面銑 (Area)」,點選「面銑 (Area)」的頁面;設定「面銑刀具重疊 (Area tool overlap)」值為 0。另外兩個選項,「Area width」設為 1 ,而「Maximum area cutting curves」先用預設值,有時間可以慢慢玩玩,看不同設定值,效果有何差異。
  • 點選編輯區中要填滿的圖形以後,按「套用 (Apply)」,即可查看成果。


FAQ

  • Q: 使用 Gcodetools 時,加入了「電漿刀」,為什麼找不到 Plasma cutter 的設定區塊?
    A: 將版面的檢視比例縮小一點看看,它預設會放到很上面,如果放大檢視就看不到了。
  • Q: 如何利用 Gcodetools 來輸出 G-code ?
    A: 先將所有圖形都轉為「路徑」並選取好。
    在「Plasma cutter」中設定「feed」、「penetration feed」、「gcode before path」、「gcode after path」;
    然後進入「路徑轉為 Gcode」的 extensiion,設定
    「路徑轉為 Gcode」頁面中的「最大分割深 (Maximum splitting depth)」為 0,
    並勾選「排序路徑以減少高速距離 (Sort paths to reduse rapid distance)」;
    再設定「選項」頁面中的
    「沿著Z軸縮放 (Scale along Z axis)」(這個翻譯怪怪的,應該是沿著Z軸每次降低多少才對) 設為 0,
    「沿著Z軸偏移 (Offset along Z axis)」為起始的 Z 軸高度;
    最後回到「路徑轉為 Gcode」頁面,並按下「套用(Apply)」。




2016年12月10日 星期六

FFmpeg : 影片剪接與加馬賽克

2016年12月10日 星期六
影片的剪輯不一定要使用圖形界面來操作的,如果只是想進行簡單的剪接而已,利用 ffmpeg 這個自由軟體,下指令即可進行剪接,甚至加上特效。

以底下的某化妝品廣告影片為例:



分析原廣告片,在 00:02:28.500 和 00:02:46.001 以後各有 1.5 秒 和 2 秒長的時間會出現商品的名稱,另外在 00:03:13 以後會有全版的廣告。片尾的廣告只要截掉不取即可,不過中間會有兩段要為商品名稱加上馬賽克。

本篇中會使用到兩個工具,都可以在網路中找到:

影片下載

在 YouTube 中的影片,可以利用 youtube-dl 下載。假設我們將下載回來的 FullHD 的影片儲存為 source.mp4。

切割影片

利用 ffmpeg 將原始影片(本例中的 source.mp4)切割為五分段,並輸出為 s1.mp4、s1.mp4、s1.mp4、s1.mp4、s1.mp4,五個影片檔。指令如下:

ffmpeg -i source.mp4 -ss 00:00:00.00 -t 00:02:28.500 -y -c copy s1.mp4 
ffmpeg -i source.mp4 -ss 00:02:28.501 -t 00:00:01.500  -y -c copy s2.mp4 
ffmpeg -i source.mp4 -ss 00:02:30.001 -t 00:00:16.000  -y -c copy s3.mp4 
ffmpeg -i source.mp4 -ss 00:02:46.001 -t 00:00:02.00 -y -c copy s4.mp4 
ffmpeg -i source.mp4 -ss 00:02:48.001 -t 00:00:25.00 -y -c copy s5.mp4

上述指令中,「-ss」設定了分段影片的開始時間,而「-t」設定了分段影片的長度。

加馬賽克

我們可以利用 ffmpeg 的濾鏡功能來為 s2.mp4 和 s4.mp4 這兩段有 mark 的地方加上馬賽克。

下載回來的影片,解析度是 1920 x 1080 ,而

  •  s2.mp4 中需要加馬賽克的大小假設為 960x540,放置的座標為 (380,270)
  •  s4.mp4 中需要加馬賽克的大小假設為 1160x540,放置的座標為 (380,270)

最後再用原來的檔名覆蓋儲存即可。執行底下的兩行指令:

ffmpeg -i s2.mp4  -filter_complex  "[0:v]crop=960:540:380:270,boxblur=10[fg];  [0:v][fg]overlay=380:270[v]" -map "[v]" -map 0:a -c:a copy -movflags +faststart  -y s2.mp4 
ffmpeg -i s4.mp4  -filter_complex  "[0:v]crop=1160:540:380:270,boxblur=10[fg];  [0:v][fg]overlay=380:270[v]" -map "[v]" -map 0:a -c:a copy -movflags +faststart  -y s4.mp4
上面的濾鏡參數:

  • [0:v] : 指出是針對第一個影片設定。
  • crop=960:540:380:270 在座標 (380, 27) 處取 960x540 大的畫面
  • boxblur : 馬賽克

連接影片

分段影片都處理好了,最後我們利用 ffmpeg 將 s1.mp4、s2.mp4、s3.mp4、s4.mp4、s5.mp4 五個檔案連接起來,並儲存為 new_movie.mp4,執行底下的這行指令:

ffmpeg -i s.mp4 -i out2.mp4  -i out3.mp4  -i out4.mp4  -i out5.mp4 -filter_complex concat=n=5:v=1:a=1 -y new_movie.mp4

concat 參數的部份:

  • n=5 : 有 5 個影片
  • v=1 : 有影片
  • a=1 : 有聲音


透過前面的操作以後,最後輸出的影片裡,看不到商品的名稱了。ffmpeg 實在好強,有空再來研究一下別的玩法。

後記

學而後知不足,2017年五月底再看這篇文章以後,才了解在整理這篇時有多麼土。其實 FFmpeg 如果用 version 2.0 以後的版本,有更簡單的方法。強烈的建議如果想幫影片加上多個不同的馬賽克,可以參考底下這篇中的方法:



相關文章



2016年1月10日 星期日

Inkscape : Extensions : J Tech Photonics Laser Tool

2016年1月10日 星期日
如果想將 Inkscape 的向量圖轉為 G-code,然後用雷切機將圖形切下來,可以試試這個「J Tech Photonics Laser Tool」的 extension。由程式碼看來,它也是源自於 GcodeTools。對於土砲型的雷切機來說,最大的好處是可以自訂副合個人需求的雷射電源開關 G-code。而且它還能讓同一路徑跑多次,每次自動下降 Z 軸高度,這樣一來,功率不大的小雷射一次切不開,讓它多切幾次就好了。

程式下載及原文說明的網址如下:
如同其它 Inkscape 的 extensions 一樣,將下載回來的壓縮檔解壓縮,並放至 Inkscape 安裝目錄中的「share\extensions」資料夾中即完成安裝的動作。如果 Inkscape 已執行中,記得重新啟動 Inkscape。

安裝完 J Tech Photonics Laser Tool,應該可以在「擴充功能」的選單中找到:



Inkscape : Extensions : Raster 2 Laser GCode generator

Raster 2 Laser GCode generator 是 305engineering 以 Python 寫的 Inkscape extesnions,可以幫我們先將在 Inkscpae 的圖先轉為 PNG 點陣圖圖檔,然後再輸出成 G-code。我覺得作者滿有趣的,底下是引用自版權聲明中的小一段:

As long as you retain this notice you can do whatever you want with this stuff (except sell). If we meet some day, and you think this stuff is worth it, you can buy me a beer in return.

哈!如果真能有幸遇到作者,我一定請他喝啤酒。

這個小工具是用分析點陣圖的方式產出 G-code,只要是和設定中的鏤空顏色值(白色或黑色)一樣的點,都不會雷射。這個方式的好處是直接用顏色來控制要打雷射,而不是走圖形的外框而已,無論陰刻、陽雕都適合。當然囉!如果是要做的是雷切,就建議使用別的工具。

 Raster 2 Laser GCode generator 提供了多種圖形輸出的演算模式:

  • B/W fixed threshold
  • B/W random threshold
  • Halftone
  • Halftone row
  • Halftone column
  • Grayscale

前兩種是直接以黑/白來描點,接下來有三種較省時間的半色調描點方式,最後則是採用灰階的方式來描點。除此之外,我們還能自訂解析度......等,可自訂的選項還不少。



個人覺得 Raster 2 Laser GCode generator 很適合用來處理照片或是刻印章。

照片利用半色調處理,在不同材質的效果
雷雕泡棉印章

 
雄::gsyan © 2009. Design by Pocket