程式設計師開發利器:Your Commands網站上線

HarlanC發表於2024-10-14

程式設計師開發利器:Your Commands網站上線

先上鍊接: https://www.ycmds.cc

背景

各種命令列工具是我們IT行業日常工作離不開的,但是對於命令列工具的使用有一個痛點:文件上每一個命令列引數寫的清清楚楚,但是怎麼組合起來用卻搞不清楚。所以為了解決這個問題每個人都應該有一個記事本,記錄下來自己常用的完整命令列,每次用的時候翻出來直接用就可以。但存放到本地的記事本是非常不方便的,各種雲記事本也非常不好用。所以有了一個想法,為什麼不把這些命令列放到網路上,方便自己的同時也能便捷他人。

作者先收集了自己日常工作中常用的完整命令列,包括FFmpeg/Docker/Git/Tcpdump等等。此網站是開源的,非常歡迎其他大牛們把自己常用的命令列分享出來,贈人玫瑰,手留餘香。

下面列舉一部分:

FFmpeg

1、轉推RTMP協議流

純轉推,沒有編解碼。

1.1、轉推flv檔案

ffmpeg -re -stream_loop -1 -i test.flv -c copy -f flv rtmp://localhost:1935/live/destination
引數解釋
  • -re
    引數用於模擬實時讀取輸入流,輸入資料的處理速度將與實際播放速度保持一致。

  • -stream_loop 是用來指定輸入流的迴圈次數的選項。
    -1 作為 -stream_loop 的引數值,表示無限迴圈,即輸入流將不斷重複播放,直到手動停止或程式結束。

  • -c 是 -codec 的簡寫,用於指定編碼器或解碼器。copy 表示直接複製源流的音影片資料,不重新編解碼。 也可以寫成 -c:v copy -c:a copy

1.2、轉推RTMP直播流

ffmpeg -i rtmp://localhost:1935/live/source -c copy -f flv rtmp://localhost:1935/live/destination

:::note
如果輸入流本身就是實時流,可以不加-re引數,當輸入流有GOP快取,它將會被快遞處理並轉推出去,配置合適的播放策略比加-re引數能降低延遲。

:::

2、錄製RTMP協議流

可以把直播流錄製成flv檔案:

ffmpeg -i  'rtmp://localhost:1935/live/test'  -c:v copy -c:a copy -f flv test.flv

3、轉推RTSP協議流

3.1、基於TCP傳輸

ffmpeg -re -stream_loop -1  -i test.mp4 -c:v copy -c:a copy  -rtsp_transport tcp -f rtsp "rtsp://127.0.0.1:5544/live/test?token=123"
引數解釋
  • -rtsp_transport tcp 表示基於TCP傳輸音影片資料,也就是Interleaved模式

3.2、基於UDP傳輸

 ffmpeg -re -stream_loop -1  -i test.mp4 -c:v copy  -c:a copy -f rtsp "rtsp://127.0.0.1:5544/live/test?token=123"

4、圖片相關

4.1、PNG轉YUV

 ffmpeg -i temp.jpg -s 1024x680 -pix_fmt yuvj420p 9.yuv
引數解釋
  • -s 1024x680: 這個選項指定輸出影片的尺寸為 1024x680 畫素。-s 後面跟著想要的寬度和高度。

  • -pix_fmt yuvj420p: 這個選項指定輸出的畫素格式為 yuvj420p。

4.2、開啟YUV

ffplay -f rawvideo -pixel_format yuv420p -video_size 1024x680 9.yuv

4.3、YUV轉PNG

ffmpeg -y -s 1024x680 -i 9.yuv output.jpg

5、轉碼相關

ffmpeg轉碼主要涉及到:

變換編碼方式:

  • H264轉到H265:降位元速率,清晰度不變的情況下降低網路使用頻寬。
  • H265轉到H264:解決低端裝置解不了H265的問題。

變換解析度:

  • 降解析度:降位元速率。
  • 升解析度:官方的ffmpeg增加解析度和位元速率沒有很好的超分效果,需要使用第三方的SDK整合到ffmpeg中,比如英偉達的MAXINE。

降位元速率:

  • 恆定位元速率變動態位元速率:根據畫面複雜度動態調整位元速率,節省網路頻寬,提升使用者體驗。

5.1、RTMP直播流轉碼成720P H264

 ffmpeg -rw_timeout 5000000 -i 'rtmp://localhost:1935/live/source' -acodec libfdk_aac -b:a 64k -ac 2 -ar 44100 -profile:a aac_he  -vcodec libx264 -b:v 2000k -level 3.1 -vprofile high -vsync 2 -strict -2 -preset medium -bf 3 -force_key_frames source  -f flv -loglevel level+info -vf "scale='720:-2'"     'rtmp://localhost:1935/live/dest'
引數解釋
  • -rw_timeout 5000000 設定讀寫超時時間,單位是微秒,5000000為5秒。如果在這個時間內沒有完成讀寫操作,FFmpeg 將會停止操作並報告超時錯誤。

  • -acodec 執行音訊編碼器fdk_aac,這個編碼庫是開源的,支援LC、HE-AAC、HE-AAC-V2三種profile級別。

  • -b:a 指定音訊位元速率

  • -ac 指定音訊通道數2

  • -ar 指定音訊取樣率44100

  • -profile:a 指定音訊profile級別為aac_he

  • -vcodec 執行影片編碼器為x264

  • -b:v 指定影片位元速率為1700Kbits/s

  • -level 用於約束位元速率、幀率和解析度

H264 Level

  • -vprofile 是用來定義一組編碼工具和特性的集合,以滿足不同使用場景和效能需求。

H264 Profile

  • -vsync 2 幀會連同其時間戳一起透過或丟棄,以防止 2 個幀具有相同的時間戳。

  • -preset medium 指定編碼速速和壓縮比,編碼速度越快,壓縮比越低。FFmpeg doc

  • -bf 3 指定B幀數目為3個,通常是兩個P幀之間編碼3個B幀。

  • -force_key_frames source 關鍵幀編碼跟隨源流,如果當前幀在源流中為關鍵幀,則編碼輸出關鍵幀,如果源流中的當前幀必須被丟棄,則下一幀輸出關鍵幀。

  • -flv 指定封裝格式為flv

  • -loglevel level+info 新增日誌級別字首、指定日誌級別為info。

  • -vf "scale='720:-2'" 影片過濾器引數,scale 是用於縮放影片的過濾器,'720:-2' 指定了輸出影片的寬度和高度:720 表示輸出影片的寬度將被設定為 720 畫素,-2 表示高度將自動計算,以保持原始影片的寬高比。

5.2、RTMP直播流轉碼成720P H265

 ffmpeg -rw_timeout 5000000 -i "rtmp://localhost:1935/live/source" -vcodec libx265 -b:v 2000k -acodec libfdk_aac -b:a 64k -ac 2 -ar 44100 -profile:a aac_he -preset veryfast -bf 3 -force_key_frames source -f flv -loglevel level+info -vf scale='720:-2' “rtmp://localhost:1935/live/dest”

Docker

1、基本命令

1.1、拉取docker映象

docker pull docker.io/library/centos:7.9.2009

1.2、執行docker

docker run -it  docker.io/library/centos:7.9.2009 /bin/bash 
引數解釋
  • -it 分配偽終端並保持標準輸入開啟,適合互動式操作。
  • /bin/bash 容器啟動後執行的命令,這裡是開啟一個 Bash 終端。

1.3、檢視所有docker例項

docker ps -a
引數解釋
  • -a 列出所有容器,包括停止的,如果不加-a,則只顯示正在執行的

1.4、進入docker內部

docker  exec -it <container ID or name> /bin/bash

1.5、檢視所有映象

docker images

1.6、清理docker映象

1.6.1、刪除未使用的映象
docker image prune
1.6.2、強制刪除未使用的映象
docker image prune -a

這將刪除所有未被容器使用的映象,包括懸掛的映象。

1.6.3、刪除特定映象
docker rmi <image_id_or_name>
1.6.4、匯出容器到檔案
docker export <container_id>  -o  image.tar
1.6.5、匯出映象到檔案
docker save -o image.tar <repository_name>:<tag> or <image_id>
1.6.5、從檔案載入成docker映象
cat image.tar | docker import - <repository_name>:<tag>

其中,<repository_name>是你要上傳到的映象倉庫名稱,<tag>是映象的標籤。

2、高階命令

2.1、拉取並執行映象

docker run --cap-add=SYS_PTRACE -d -it --net=bridge --name centos7 --privileged=true -w /youcmds/workspace -e "PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/" -e "LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/lib:/lib64:/lib" -p 1935-2935:1935-2935 -v /Users/yourcmds/workspace:/youcmds/workspace docker.io/library/centos:7.9.2009 /bin/bash 
引數解釋
  • --cap-add 引數可以用於向 Docker 容器新增不同的許可權,包括:

    NET_ADMIN: 允許容器擁有網路管理的能力。這意味著容器可以進行網路配置,比如更改介面的配置、新增或刪除路由等。它賦予了容器更大的網路控制許可權,適用於需要管理網路設定的應用場景。

    SYS_ADMIN:新增系統管理員許可權,允許容器內的程序執行系統級別的管理操作,如掛載檔案系統、設定時間、修改主機名等。

    SYS_PTRACE:新增系統追蹤許可權,允許容器內的程序使用 ptrace 系統呼叫,用於除錯和監視其他程序。

    SYS_CHROOT:新增切換根目錄許可權,允許容器內的程序使用 chroot 系統呼叫,在指定的目錄下建立一個新的根檔案系統環境。

    SYS_MODULE:新增模組載入/解除安裝許可權,允許容器內的程序載入和解除安裝核心模組。

    SYS_RAWIO:新增原始 I/O 許可權,允許容器內的程序進行對裝置的原始讀寫操作,繞過作業系統提供的檔案系統抽象。

    SYS_TIME:新增時間管理許可權,允許容器內的程序修改系統時間。

  • --net 設定docker的網路模式,常用的網路模式包括:

    bridge(橋接模式):預設模式,Docker 會建立一個虛擬網橋,容器透過這個橋接連線到主機的網路。適用於大多數常見場景。

    host(主機模式):容器直接使用主機的網路堆疊,適合對網路效能要求較高的應用,但會失去容器間的網路隔離。

    none(無網路模式):不連線任何網路,適合需要完全隔離的場景。

    container(容器模式):使新容器與另一個已存在的容器共享網路棧。這意味著它們共享同一個 IP 地址和埠。

    overlay(覆蓋網路模式):用於跨多個 Docker 主機的叢集環境(如 Docker Swarm 或 Kubernetes),允許容器在不同主機間通訊。

  • -d:以後臺模式執行容器。

  • --name centos7:為容器指定一個名稱(centos7)。

  • -w /youcmds/workspace:設定容器的工作目錄。

  • -e 設定環境變數。

  • -p 1935-2935:1935-2935:將主機的 1935-2935 埠對映到容器的同一埠範圍。

  • -v /Users/yourcmds/workspace:/youcmds/workspace:將主機目錄掛載到容器內的指定路徑,實現檔案共享。

  • docker.io/library/centos:7.9.2009:拉取映象地址。

GIT

1、基本命令

1.1、查詢遠端倉庫

用於顯示當前倉庫的所有遠端倉庫及其對應的 URL:

git remote -v

1.2、更新提交賬戶資訊

git config --global user.name "你的名字"
git config --global user.email "你的郵箱@example.com"

如果只想更新當前專案

git config user.name "你的名字"
git config user.email "你的郵箱@example.com"

1.3、修改遠端倉庫地址

git remote set-url origin <new-url>

相關文章