FFmpeg學習筆記(一)

前段時間做了個關于視頻播放器的需求,播放器的要求比較簡答,實現(xiàn)一些基本的播放器功能,任務急,任務重!選擇了很多項目,比如ijk,金山云等,這些項目都是基于ffmpeg,早些年就聽說這個音視頻領域的扛把子;通過這次需求,學習了一下ffmpeg的一些基本應用和基本文件操作;目的是通過ffmpeg進行基礎二次開發(fā),拋棄一些視頻處理App,通過命令行可以對音視頻進行簡單的操作,比如視頻,采集,裁剪,格式轉換等.
下載ffmpeg
brew install ffmpge
卸載ffmpeg
brew uninstall ffmpeg
更新ffmpeg
brew upgrade ffmpeg

音視頻的錄制:

1 在錄制之前先查詢下支持哪些設備

ffmpeg -f avfoundation -list_devices true -i ""
在mac下通過``AVFoundation```采集,支持的設備有:

image.png

2 錄屏/錄音

ffmpeg -f avfoundation -i 1 -r 30 out.yuv
ffmpeg -f avfoundation -i :0 out.wav
ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm
1: Captrue screen 電腦屏幕
0: 麥克風
-r:指定幀率
yuv:視頻原始格式
pcm:音頻原始格式

Duration: N/A, start: 20204.190667, bitrate: N/A
   Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1440x900, 1000k tbr, 1000k tbn, 1000k tbc
Stream mapping:
 Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))
Press [q] to stop, [?] for help
Output #0, rawvideo, to 'out.yuv':
 Metadata:
   encoder         : Lavf58.45.100
   Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1440x900, q=2-31, 622080 kb/s, 30 fps, 30 tbn, 30 tbc
   Metadata:
     encoder         : Lavc58.91.100 rawvideo

3 錄視頻

錄制攝像頭視頻

 ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i 0: -r 30 out.yuv

video_size:1280x720 640x480 320x240
framerate:限制視頻的采集幀率。這個必須要根據(jù)提示要求進行設置,如果不設置就會報錯。

4 抽取視頻音頻流

ffmpeg -i v0201f7e0000bm2tfoe8qblabkkeis30.mp4 -acodec copy -vn out.aac

5 抽取視頻視頻流

ffmpeg -i out.mp4 -vcodec copy -an out.h264

6 封裝格式轉換

比如 mp4格式轉換成flv格式
ffmpeg -i water.mp4 -vcodec copy -acodec copy out.flv

7 視頻合并

將音頻流文件和視頻流文件合并

cj-yh-mac-n:video mac$ ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.flv

8 提取原始數(shù)據(jù)

8.1 提取YUV(節(jié)省帶寬,壓縮比好)

ffmpeg -i out.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv

圖片來源于西瓜視頻截圖,若侵權,請聯(lián)系刪除

YUV采樣有如下三方式:
YUV 4:4:4采樣,每一個Y對應一組UV分量,不常用,耗內存嚴重,耗帶寬,和RGB差不多,壓縮比不夠。
YUV 4:2:2采樣,每兩個Y共用一組UV分量,采樣一個像素點都會采樣其Y分量,而UV是左右間隔采樣。

YUV 4:2:0采樣(歷史遺留實質是4:1:1),每四個Y共用一組UV分量。每個像素都會采樣Y分量,而U,V分量會間隔采樣, 這種方式目前主流方式.如下圖:

圖片來源于西瓜視頻截圖,若侵權,請聯(lián)系刪除.png

YO Y1 Y5 Y6 U0 V5
Y2 Y3 Y7 Y8 U7 V2

獲取視頻一幀的yuv碼流:

void yuv420 (const char *path, int width,int height){
   //讀
   FILE *fp =   fopen(path,"rb+");
   //寫
   FILE *y_fp = fopen("/Users/usermae/Desktop/ffmpeg/基礎一/yuv/yuv420_y.y","wb+");
   FILE *u_fp = fopen("/Users/usermae/Desktop/ffmpeg/基礎一/yuv/yuv420_u.y","wb+");
   FILE *v_fp = fopen("/Users/usermae/Desktop/ffmpeg/基礎一/yuv/yuv420_v.y","wb+");
   int i = 0;
   // 按照最大容量申請內存。
   unsigned char *p = (unsigned char*) malloc(width * height * 3/2);
//    寫一幀大小 ?。?!
   while(i < 1) {
       fread(p,1,width * height * 3/2,fp);
       // y亮度
       fwrite(p,1,width * height,y_fp);
       //u 1/4
       fwrite(p + width * height ,1,width * height/4,u_fp);
       // v 1/4
       fwrite(p +  width * height * 5/4 ,1,width * height/4,v_fp);
       i++;
   }
   free(p); p = NULL;
   fclose(fp);
   fclose(y_fp);
   fclose(u_fp);
   fclose(v_fp);
   
}

rawvideo:指定將視頻轉成原始數(shù)據(jù)

8.2 提取pcm

ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm

-ac:2 雙聲道
-ar 44100 音頻采樣率 48k 32k 16k 44.1k
S16e:數(shù)據(jù)存儲方式:有符號的16位數(shù)字表示

9 濾鏡

9.1 添加水印

ffmeg -i water.mp4 -vf "movie=logo.gif,scale=100:50[watermask];[in][watermask] overlay=40:50 [out]" out.mp4

movie 指定logo位置。scale 指定 logo h w大小。Overlay x和y 指定 logo 擺放的位置。
上面命令 水印圖為gif格式時無法循環(huán)播放;實現(xiàn)循環(huán)播放,如何做呢???

9.2 刪除水印

ffplay -i water.mp4 -vf delogo=x=30:y=10:w=64:h=48:show=1

Logo area is outside of the frame 需要先找到水印的具體位置,才可以刪除,生成新的視頻。

ffmpeg -i water.mp4 -vf delogo=x=806:y=20:w=70:h=80 output.mp4

9.3 視頻壓縮一半

ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4

-1代表高度隨寬度改變。

9.4 視頻剪切

從中心點剪切

ffmpeg -i out.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 320x180 scale.mp4

in_w-200/in_h-200: 寬度/高度減去200
-c:v 視頻編碼器。

從某個位置剪切

ffmpeg -i out.mp4 -vf crop=100:100:20:20 -c:v libx264 -c:a copy -video_size 320x180 scale.mp4

out_w: 輸出的寬度 100。
out_h: 輸出的高度 100。
x:20
y:20

9.5 倍速播放

ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" scale.mp4

2倍播放 丟幀一半。

10 視頻的裁剪

ffmpeg -i out.mp4 -ss 00:00:01 -t 15 scale.mp4
從視頻的1秒開始,裁剪15s。

11 視頻hls切片

ffmpeg -i water.mp4 -c:v libx264 -strict -2 -f hls out.m3u8

如果指定aac編碼器
ffmpeg -i water.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8

運行結果:Unknown encoder 'libfdk_aac'
需要重新下載ffmpeg并 添加一些庫 麻煩啊!!! 參考 http://www.itdecent.cn/p/d1ed7b860f1b。

12 把裁剪的片段合并成一個視頻

首先創(chuàng)建一個test.txt文件,文件內容格式:file '片段視頻文件'

image.png

然后執(zhí)行命令:ffmpeg -f concat -i test.txt -c copy water.mp4

13 視頻轉化成圖片

13.1 轉化成一張普通的圖片

ffmpeg -i ModernTalking.mp4 -r 1 -f image2 MT-%3d.png

-r:幀率 1秒一張圖

13.2 轉化成gif

fmpeg -i ModernTalking.mp4 -ss 00:00:00 -t 10 MT_GIF.gif

-t:n 截取時長為ns的片段進行轉化成gif n越大 gif大小越大 效果越好,下面是n=4截取的gif效果,視頻資源來源于西瓜視頻。


MT_GIF.gif

14 將一組圖片合轉成視頻

ffmpeg -f image2 -i MT-%3d.png newshiping.mp4

13.4 從視頻提取音頻流

ffmpeg -i input.mp4 -vn output.mp3
ffmpeg -i input.mp4 -vn -acodec copy output.aac

命令行背下來 ...


23763e82c7ecfce25b3217999399e775.jpeg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容