FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)
>?ffmpeg源碼分析
ffmpeg源碼簡析(一)結構總覽- https://blog.csdn.net/Louis_815/article/details/79621056
FFmpeg的庫函數源代碼分析- https://blog.csdn.net/lipengshiwo/article/details/52982379
? FFmpeg ?CPU軟編碼和解碼 ;MediaCodec GPU硬編碼解碼。FFmpeg自帶Rtmp協議支持。
? 直播視頻、短視頻、小機構的內容、網絡公司自制內容等;對編輯、轉碼、存儲、傳輸、處理等技術;
? FFmpeg是一個全球領先的多媒體框架,能夠友好的在大部分設備實現解碼、編碼、轉碼、復用、解復用、轉碼、混流、流媒體、過濾和播放。FFmpeg能夠在各個平臺(Linux、Mac OS X、Microsoft Windows、BSDs、Solaris等)和架構(x86、arm、mips等)中運行和編譯。值得注意的是,FFMpeg并不是直接就可以用于各種視頻的編解碼工作,它只是一個框架。真正執行編解碼工作的通常會用到其它編解碼器。比如進行h264的編碼,一般會選擇FFMpeg配合x264進行使用。
? FFMPEG使用的是C99。而VC支持的是C89(不支持C99)。因此VC一般情況下是無法編譯FFMPEG的源代碼的。
-- 視音頻技術主要包含以下幾點:封裝技術,視頻壓縮編碼技術以及音頻壓縮編碼技術。如果考慮到網絡傳輸的話,還包括流媒體協議技術。點播服務普遍采用了HTTP作為流媒體協議,H.264作為視頻編碼格式,AAC作為音頻編碼格式。
? 跟視頻領域相關的各個環節,包括內容、采集、編碼、傳輸、接收、存儲、解碼、顯示以及數據處理與挖掘;
? ?基于FFMPEG的音頻編碼器(PCM編碼為AAC)。基于FFMPEG的視頻編碼器(YUV編碼為H.264),YUV420P的像素數據編碼為H.264的壓縮編碼數據。
視頻編解碼技術介紹- https://blog.csdn.net/mazhitong1020/article/details/78893190
--??ffmpeg開發,Android視頻直播核心技術(架構)詳解- https://www.2cto.com/kf/201708/667730.html
? 主流的直播架構中主要有兩種方案,即流媒體轉發、P2P。流媒體轉發,是一種在視頻直播中以流的方式將連續的音、視頻數據經編碼壓縮后傳輸到流媒體服務器,用戶實時從服務器獲取流媒體資源,而不必要等待整個文件下載文件完畢的C/S架構視頻直播方案;P2P直播,是一種建立在P2P技術基礎上的視頻直播方案,它規定客戶端之間使用一定協議來交換和共享直播數據,通過減少對服務器的數據請求,以降低服務端的I/O帶寬等方面壓力,從而削減服務器帶寬成本,降低客戶端卡播率。
? YUV是一種亮度信號Y和色度信號U、V是分離的色彩空間,它主要用于優化彩色視頻信號的傳輸,使其向后相容老式黑白電視,且與RGB要求三個獨立的視頻信號同時傳輸相比,它最大的優點在于只需占用極少的頻寬,非常適用于流媒體傳輸。
? YUV格式分為兩種類型,即Packet(包)和Plannar(平面)。Packet類型是將Y、U、V分量存儲在同一個數組中,每個像素點的Y、U、V是連續交錯存儲的,常見的采樣格式有NV21、NV12;Plannar類型是將Y、U、V分量分別存儲在三個獨立的數組中,且先連續存儲所有像素點的Y分量,緊接著存儲所有像素點的U分量,最后存儲所有像素點的V分量,常見的采樣格式有YV12、I420。
? H.264編碼框架分為兩層:VCL、NAL。VCL(Video Coding Layer,視頻編碼層),負責高效的視頻內容表示;NAL(Network Abstraction Layer,網絡抽象層),負責以網絡所要求的恰當的方式對數據進行打包和傳送。在H.264協議里定義了三種幀,完整編碼的幀叫I幀(關鍵幀),參考之前的I幀生成的只包含差異部分編碼的幀叫P幀,還有一種參考前后的幀編碼的幀叫B幀。H.264編碼采用的核心算法是幀內壓縮和幀間壓縮。其中,幀內壓縮是生成I幀的算法,它的原理是當壓縮一幀圖像時,僅考慮本幀的數據而不用考慮相鄰幀之間的冗余信息,由于幀內壓縮是編碼一個完整的圖像,所以可以獨立的解碼顯示;幀間壓縮是生成P、B幀的算法,它的原理是通過對比相鄰兩幀之間的數據進行壓縮,進一步提高壓縮量,減少壓縮比。
? 《H.264開源解碼器評測》,這篇文章詳細的評測了當今流行的幾種h.264解碼器,包括JM Decoder,T264 Decoder,X264 Decoder,ffmpeg libavcodec和Intel的IPP庫,經過作者的評測,發現速度最快的就是intel IPP了,但是intel IPP屬于商品化軟件,而其他的各種解碼器都屬于開源項目,所以最適合選擇的就是解碼速度第二的ffmpeg了,而且其速度完全可以滿足實時播放的要求。
> ffmpeg對視頻文件進行解碼的大致流程:
1. 注冊所有容器格式和CODEC: av_register_all()
2. 打開文件: av_open_input_file()
3. 從文件中提取流信息: av_find_stream_info()
4. 窮舉所有的流,查找其中種類為CODEC_TYPE_VIDEO
5. 查找對應的解碼器: avcodec_find_decoder()
6. 打開編解碼器: avcodec_open()
7. 為解碼幀分配內存: avcodec_alloc_frame()
8. 不停地從碼流中提取中幀數據: av_read_frame()
9. 判斷幀的類型,對于視頻幀調用: avcodec_decode_video()
10. 解碼完后,釋放解碼器: avcodec_close()
11. 關閉輸入文件:av_close_input_file()
--?FFmpeg 模塊組成:
1.libavformat:解析各種格式的音視頻文件、獲取解碼信息的讀取音視頻幀、為 libavcode 提供獨立的音頻視頻的流
2.libavcodec: 適用于各種編解碼協議的編解碼器
3.libavdevice:硬件采集、加速、顯示視頻。
4.libavfilter:進行視頻的轉換,比如剪裁、伸縮、寬高比等等
5.libavutil:工具庫
6.libavresample:。。
7.libswscale:比例縮放、色彩映射轉換、圖像色彩空間轉換
8.libpostproc:音視頻后期效果處理
9.ffmpeg:一個暴露到外部的工具
10.ffplay:簡單的播放器,使用 ffmpeg 庫進行解析和解碼
> FFmpeg簡述
-- ffmpeg有以下幾個核心庫,各個包的作用:
? ?1.libavformat:媒體格式,用于各種音視頻封裝格式的生成和解析及所支持的協議,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;包含多媒體容器格式的解碼器和多路復用器的庫。
? ?2.libavcodec:用于各種類型視頻/聲音/圖像編解碼;更加全面的編解碼實現的合集
? ?3.libavutil:包含一些公共的工具函數;核心工具;包含簡化編程功能的庫,包括隨機數生成器、數據結構、數學相關的程序、核心多媒體框架等等,包括算數運算,字符操作等。
? ?4.libswscale:用于視頻場景比例縮放、色彩映射轉換;執行高度優化的圖像縮放和色彩空間/像素格式轉換的庫。
? ?5.libpostproc:用于后期效果處理,如圖像的去塊效應等;多媒體后處理器
? ?6. libavdevice:提供支持眾多設備數據的輸入與輸出,如讀取攝像頭數據、屏幕錄制,視頻采集訪問攝像頭等;用于從許多常見的多媒體輸入輸出軟件框架中獲取和渲染,包括Video4Linux、Video4Linux2、VfW和ALSA。
? ?7.libavfilter:后處理,提供音視頻的過濾器,如視頻加水印、音頻變聲等,用做濾鏡處理
? ?8.libswresample:提供對視頻圖像進行色彩轉換、縮放以及像素格式轉換,如圖像的YUV轉換,用于重采樣;執行高度優化的音頻重采樣、再分頻和采樣格式轉換操作的庫;提供音頻重采樣,采樣格式轉換和混合等功能
? ?9.libavresample:提供音頻的重采樣工具。
> 用eclipse源碼導入與調試ffmpeg- https://www.cnblogs.com/yinxiangpei/articles/3933778.html
FFmpeg- https://github.com/FFmpeg/FFmpeg
libavcodec:用于各種類型聲音/圖像編解碼;
libavutil:包含一些公共的工具函數;
libavformat:包含多種多媒體容器格式的封裝、解封裝工具
libswscale:用于視頻場景比例縮放、色彩映射轉換;
libpostproc:用于后期效果處理;
libavdevice:用于音視頻數據采集和渲染等功能的設備相關
ibswresample:用于音頻重采樣和格式轉換等功能
libavfilter:包含多媒體處理常用的濾鏡功能
> FFmpeg其工具有:
1.ffmpeg:一個用于多媒體格式轉換、解碼或電視卡即時編碼等的命令行工具
2.ffserver: 一個用于現場直播的多媒體流服務器或 HTTP 多媒體即時廣播串流服務器
3.ffplay: 一個基于SDL和FFMpeg庫的簡單的媒體播放器;是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
4.ffprobe:一個簡單的多媒體分析工具
> FFmpeg 視頻水印/剪切/壓縮/旋轉/濾鏡/美顏
-- Android實現視頻剪切、視頻拼接以及音視頻合并- http://blog.csdn.net/lxy_tap/article/details/74567282
使用FFmpeg4android 實現視頻 水印 剪切 壓縮 旋轉- http://blog.csdn.net/wning1/article/details/52029427
(1)最簡單常規命令:處理視頻
? ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -s 160x120 -r 25 -vcodec mpeg4 -b 150k -ab 48000 -ac 2 -ar 22050 /sdcard/videokit/out.mp4
? ?其中: -y -i 后接錄制好的視頻地址, -strict experiment ?就是開啟一些實驗性的功能。 -s 輸出的分辨率 如 640*480 480*480 -r 視頻的幀數 -vcodec 視頻編碼-ab 128(音頻數據流量,一般選擇32、64、96、128) ac 聲道 1 單聲道 2 雙聲道 -ar 音頻采樣率。 一般的話控制視頻輸出質量參數 - s -b 增大-s 和 -b 都會提高視頻的輸出質量,當然相應的視頻的size也會增大。
(2)截取視頻特定時間的圖片:
ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -an -r 1/2 -ss 00:00:00.000 -t 00:00:03 /sdcard/videokit/filename%03d.jpg
? ?其中: -ss 視頻開始
(3)視頻裁剪:
ffmpeg -y -i /sdcard/videokit/short.mp4 -strict experimental -vf crop=100:100:0:0 ?-r 15 -aspect 1:1 -ab 12288 -vcodec mpeg4 -b 2097152 -sample_fmt s16 /sdcard/videokit/out.mp4
? ?其中: crop里的參數依次為: 寬度,高度,left(距離左上角坐標),top(距離頂下角坐標)
(4)添加水印:
String[] complexCommand = {"ffmpeg","-y" ,"-i", "/sdcard/videokit/in.mp4","-strict","experimental", "-vf", "movie=/sdcard/videokit/watermark.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]","-s", "320x240","-r","30", "-b", "15496k", "-vcodec", "mpeg4","-ab", "48000", "-ac", "2", "-ar", "22050", "/sdcard/videokit/out.mp4"};
?5.ffmpeg解碼截幀:H264格式的視頻碼流=>解碼=>YUV格式的視頻幀=>壓縮=>jpeg=>保存到本地.
?6.將包含h264編碼的mp4文件中的h264視頻流提取出來保存為raw h264格式:
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
?7.行將包含h264編碼的mp4文件轉為ts文件格式:
ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
> FFmpeg 入門及源碼分析
ffmpeg API變更 2009-03-01—— 2017-05-09變更 - https://blog.csdn.net/King1425/article/details/71439943
FFMPEG視音頻編解碼零基礎學習方法- https://blog.csdn.net/leixiaohua1020/article/details/15811977
FFMPEG視音頻編解碼零基礎學習方法- https://blog.csdn.net/simanstar/article/details/24348641
《FFmpeg從入門到精通》進階篇,SEI那些事兒- https://blog.csdn.net/m0_37236246/article/details/79311345
FFmpeg從入門到出家(FFmpeg簡析)- https://blog.csdn.net/m0_37236246/article/details/78983053
FFmpeg API 變更記錄- https://blog.csdn.net/leixiaohua1020/article/details/41013567
ffmpeg必知道的知識點- https://blog.csdn.net/King1425/article/details/70348374
FFmpeg+OpenSL+OpenGL+Mediacodec 的視頻播放SDK源碼和實例APP,很適合學習ffmpeg解碼流程- https://github.com/wanliyang1990/wlplayer
CMake編譯FFmpeg(v3.3)并使用- https://github.com/WangShuo1143368701/FFmpegAndroid
ffmpeg源碼整體分析- http://download.csdn.net/download/xin_hua_3/6247113
FFmpeg簡單介紹- http://blog.csdn.net/momo0853/article/details/49427935
[總結]FFMPEG視音頻編解碼零基礎學習方法- http://blog.csdn.net/leixiaohua1020/article/details/15811977
最簡單的基于FFmpeg的AVfilter例子(水印疊加)- http://blog.csdn.net/leixiaohua1020/article/details/29368911
FFmpeg源代碼結構圖 - 解碼- http://blog.csdn.net/leixiaohua1020/article/details/44220151
100行代碼實現最簡單的基于FFMPEG+SDL的視頻播放器(SDL1.x)- http://blog.csdn.net/leixiaohua1020/article/details/8652605
?-- FFmpeg視頻/音頻/圖像編碼器,FFmpeg RTMP推送和接收(ActionScript),最簡單的基于Flash的流媒體示例:網頁播放器(HTTP,RTMP,HLS)
?FFmpeg示例程序合集- https://github.com/leixiaohua1020/leixiaohua1020.github.io/tree/master/batch
-- 使用FFMPEG類庫分離出多媒體文件中的H.264碼流,音頻碼流. ?ffmpeg中的sws_scale來進行圖像縮放和格式轉換。ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bilinear -pix_fmt yuv420p src01_bilinear_1280x720.yuv ?。
? 批處理腳本(BAT)調用FFMPEG批量編碼視頻。FFmpeg自帶Rtmp協議支持。FFMPEG中的swscale提供了視頻原始數據(YUV420,YUV422,YUV444,RGB24...)之間的轉換,分辨率變換等操作。swscale主要用于在2個AVFrame之間進行轉換。基于FFMPEG的圖像編碼器(YUV編碼為JPEG)
-- FFMPEG在編譯的時候可以選擇支持RTMP的類庫libRTMP。這樣ffmpeg就可以支持rtmp://, rtmpt://, rtmpe://, rtmpte://,以及 rtmps://協議了。
?FFmpeg源代碼簡單分析:內存的分配和釋放(av_malloc()、av_free()等)。FFmpeg開發中最常使用的幾個函數:av_malloc(),av_realloc(),av_mallocz(),av_calloc(),av_free(),av_freep()。
?FFmpeg內存分配方面多次涉及到“內存對齊”(memory alignment)的概念。處理器相對比較“懶惰”,它會以2字節,4字節,8字節,16字節甚至32字節來存取內存。
?常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)。FFMPEG包含了解協議,解封裝,解碼操作結構體:
?AVFormatContext:統領全局的基本結構體。主要用于處理封裝格式(FLV/MKV/RMVB等),包含碼流參數較多的結構體。
?AVIOContext:輸入輸出對應的結構體,用于輸入輸出(讀寫文件,RTMP協議等),管理輸入輸出數據的結構體。
?在使用FFMPEG進行開發的時候,AVFormatContext是一個貫穿始終的數據結構,很多函數都要用到它作為參數。它是FFMPEG解封裝(flv,mp4,rmvb,avi)功能的結構體。
?AVStream,AVCodecContext:視音頻流對應的結構體,用于視音頻編解碼。
?AVFrame:存儲非壓縮的數據(視頻對應RGB/YUV像素數據,音頻對應PCM采樣數據)- 每一個視頻/音頻流信息的結構體。?
?AVPacket:存儲壓縮數據(視頻對應H.264等碼流數據,音頻對應AAC/MP3等碼流數據)相關信息的結構體。
?AVCodec是存儲編解碼器信息的結構體。
?URLContext結構體中還有一個結構體URLProtocol。注:每種協議(rtp,rtmp,file等)對應一個URLProtocol。這個結構體也不在FFMPEG提供的頭文件中。在解碼的情況下,buffer用于存儲ffmpeg讀入的數據。例如打開一個視頻文件的時候,先把數據從硬盤讀入buffer,然后在送給解碼器用于解碼。
-- FFMPEG中結構體很多。最關鍵的結構體可以分成以下幾類:
? a)解協議(http,rtsp,rtmp,mms)
AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協議的類型以及狀態。URLProtocol存儲輸入視音頻使用的封裝格式。每種協議都對應一個URLProtocol結構。(注意:FFMPEG中文件也被當做一種協議“file”)
? b)解封裝(flv,avi,rmvb,mp4)
AVFormatContext主要存儲視音頻封裝格式中包含的信息;AVInputFormat存儲輸入視音頻使用的封裝格式。每種視音頻封裝格式都對應一個AVInputFormat 結構。
? c)解碼(h264,mpeg2,aac,mp3)
每個AVStream存儲一個視頻/音頻流的相關數據;每個AVStream對應一個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關數據;每個AVCodecContext中對應一個AVCodec,包含該視頻/音頻對應的解碼器。每種解碼器都對應一個AVCodec結構。
? d)存數據
視頻的話,每個結構一般是存一幀;音頻可能有好幾幀
解碼前數據:AVPacket,
解碼后數據:AVFrame
第一次存儲AVPacket之前需要在前面加上H.264的SPS和PPS。這些信息存儲在AVCodecContext的extradata里面。
> ffmpeg
-- ffmpeg框架功能,如解碼、編碼、轉碼、混流、分離、轉化為流、過濾以及播放幾乎所有的由人和機器創建的媒體文件。
? 在這個框架中包含有各種工具,每一個用于完成特定的功能。例如,ffserver能夠將多媒體文件轉化為用于實時廣播的流,ffprobe用于分析多媒體流,ffplay可以當作一個簡易的媒體播放器,ffmpeg則能夠轉換多媒體文件格式。
注意:ffmpeg和FFmpeg不是同一個東西。FFmpeg是框架,而ffmpeg是一個其中的一個功能。
-- ffmpeg提取音頻&拼接音頻,合并視頻??
ffmpeg源碼分析及錄制/壓縮/上傳視頻等,了解ffmpeg如何處理視頻?
-- ffmpeg中主要分有三個主要用途用于媒體流的解碼播放,媒體流的轉換(解碼之后再編碼)和媒體流錄制。
在ffmpeg中媒體流的解碼播放流程:
?其主要流程為從媒體文件中讀取出媒體流,然后送入媒體格式解碼器(demuxer)中去除多余的外衣--媒體格式。然后送入ffmpeg的codec的decode中進行解碼,最終生成顯示需要的YUV格式的圖片,然后再送入類似SDL中進行渲染。ffmpeg中媒體流的解碼播放流程相對比較來說其最大的難點在于PTS的同步,在ffmpeg的ffplay中有很好的例子。
?媒體流的錄制過程相當于媒體流轉換的后半部分流程從YUV文件到media文件。
?ffplay播放器七個模塊按廣度順序:讀文件模塊(source filter),解復用模塊(Demux filter),視/音頻解碼模塊(Decode filter),顏色空間轉換模塊(Color Space converter filter),視頻/音頻播放模塊(Render filter)。
-- 為廣播電視以及專業用途量身定制的FFmpeg。也是開源的,ffmbc 全稱是 FFMedia Broadcast,是個改版的FFmpeg,有如下功能:
創建可以導入Final Cut Pro, AVID Media Composer, Adobe Premiere中的文件
創建 XDCAM HD422 文件(.mov 或 .mxf)
創建 XDCAM IMX/D-10 文件(.mov 或 .mxf)
創建 AVID DNxHD 文件(.mov)
創建 DVCPROHD 文件(.mov 或 .mxf)
創建 ProRes 422 or 4444 文件(.mov)
轉換 V210 文件
轉換 HD YUV BT709 到 SD BT601 或者反過來
轉換 AVCIntra 50 和AVCIntra ?100
轉換 MPEG-TS 文件
轉換 AVCHD 文件
轉換 ProRes 422 和 4444 文件
合并或分離音軌
創建 Quicktime 文件
從 HD 到 SD的顏色轉換;等等。。。
? 項目主頁上沒有可執行文件,只有一個源代碼壓縮包。自己拿MinGW編譯了一下源代碼,發現和FFmpeg編譯是一樣的,編譯后生成ffmbc.exe。
上傳一個自己編譯的ffmbc:http://download.csdn.net/detail/leixiaohua1020/6908055
項目主頁:http://code.google.com/p/ffmbc/
> FFmpeg各種圖像像素格式的轉換
? FFmpeg Libswscale里面實現了各種圖像像素格式的轉換,例如YUV與RGB之間的轉換;以及圖像大小縮放(例如640x360拉伸為1280x720)功能。而且libswscale還做了相應指令集的優化,因此它的轉換效率比自己寫的C語言的轉換效率高很多。
? 幾個圖像像素數據處理過程中的幾個知識點:像素格式,圖像拉伸,YUV像素取值范圍,色域。
? FFmpeg支持的像素格式的定義位于libavutil\pixfmt.h,是一個名稱為AVPixelFormat的枚舉類型。FFmpeg有一個專門用于描述像素格式的結構體AVPixFmtDescriptor。該結構體的定義位于libavutil\pixdesc.h。
?SWS_POINT(Nearest-neighbor interpolation, 鄰域插值),領域插值可以簡單說成“1個點確定插值的點”。例如當圖像放大后,新的樣點根據距離它最近的樣點的值取得自己的值。換句話說就是簡單拷貝附近距離它最近的樣點的值。領域插值是一種最基礎的插值方法,速度最快,插值效果最不好,一般情況下不推薦使用。一般情況下使用鄰域插值之后,畫面會產生很多的“鋸齒”。SWS_BILINEAR(Bilinear interpolation, 雙線性插值),雙線性插值可以簡單說成“4個點確定插值的點”。SWS_BICUBIC(Bicubic interpolation, 雙三次插值),雙三次插值可以簡單說成“16個點確定插值的點”。
?在廣播電視系統中不傳輸很低和很高的數值,實際上是為了防止信號變動造成過載,因而把這“兩邊”的數值作為“保護帶”。
?FFmpeg Libswscale支持色域的轉換。目前最常見的三個標準中的色域:BT.601,BT.709,BT.2020。這三個標準中的色域逐漸增大。
?標清電視、高清電視和超高清電視標準中規定的色域??梢钥闯鲭S著技術的進步,色域的范圍正變得越來越大。標清電視(SDTV)色域的規定源自于BT.601。高清電視(HDTV)色域的規定源自于BT.709。超高清電視(UHDTV)色域的規定源自于BT.2020。
? 最簡單的基于FFmpeg的libswscale的示例附件:測試圖片生成工具。該工具可以生成視頻測試時候常用的RGB/YUV格式的測試圖片。包括灰階測試圖,彩條圖,彩色條紋圖,RGB漸變彩條圖,YUV漸變彩條圖,顏色視頻等。在電視節目的制作播出及設備維護中,最常用的莫過于彩條信號了。這是由于彩條信號能正確反映出各種彩色的亮度、色調和飽和度,是檢驗視頻通道傳輸質量最方便的手段。
? 彩色條紋圖,RGB漸變彩條圖,RGB漸變彩條圖;RGB顏色視頻,YUV顏色視頻;RGB24轉BMP
? 最簡單的基于FFmpeg的編碼器-純凈版(不包含libavformat)。編碼器 調用了FFmpeg中的libavformat和libavcodec兩個庫完成了視頻編碼工作。
> 格式轉換,推流器
?基于FFMPEG的封裝格式轉換器。所謂的封裝格式轉換,就是在AVI,FLV,MKV,MP4這些格式之間轉換(對應.avi,.flv,.mkv,.mp4文件)。需要注意的是,本程序并不進行視音頻的編碼和解碼工作。而是直接將視音頻壓縮碼流從一種封裝格式文件中獲取出來然后打包成另外一種封裝格式的文件。
?和普通的轉碼軟件相比,有以下兩個特點:
?1.處理速度極快。視音頻編解碼算法十分復雜,占據了轉碼的絕大部分時間。因為不需要進行視音頻的編碼和解碼,所以節約了大量的時間。
?2.視音頻質量無損。因為不需要進行視音頻的編碼和解碼,所以不會有視音頻的壓縮損傷。?
?基于FFmpeg的轉碼器。它可以將一種視頻格式(包括封轉格式和編碼格式)轉換為另一種視頻格式。轉碼器在視音頻編解碼處理的程序中,屬于一個比較復雜的東西。因為它結合了視頻的解碼和編碼。一個視頻播放器,一般只包含解碼功能;一個視頻編碼工具,一般只包含編碼功能;而一個視頻轉碼器,則需要先對視頻進行解碼,然后再對視頻進行編碼,因而相當于解碼器和編碼器的結合。
? FFMPEG中有一個類庫:libavfilter。該類庫提供了各種視音頻過濾器。
?基于FFmpeg的AVDevice例子(屏幕錄制)。基于FFmpeg的AVDevice例子(讀取攝像頭)。FFmpeg中有一個和多媒體設備交互的類庫:Libavdevice。使用這個庫可以讀取電腦(或者其他設備上)的多媒體設備的數據,或者輸出數據到指定的多媒體設備上。
?基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))?;贔Fmpeg的內存讀寫的例子:內存播放器。
?基于FFmpeg的推流器(simplest ffmpeg streamer)。推流器的作用就是將本地的視頻數據推送至流媒體服務器。RTMP采用的封裝格式是FLV。因此在指定輸出流媒體的時候需要指定其封裝格式為“flv”。同理,其他流媒體協議也需要指定其封裝格式。例如采用UDP推送流媒體的時候,可以指定其封裝格式為“mpegts”。沒有封裝格式的裸流(例如H.264裸流)是不包含PTS、DTS這些參數的。在發送這種數據的時候,需要自己計算并寫入AVPacket的PTS,DTS,duration等參數。
?基于FFmpeg的封裝格式處理方面的例子。包括了視音頻分離,復用,封裝格式轉換。視音頻的復用器(Muxer)和分離器(Demuxer)。將一個FLV封裝的文件(其中視頻編碼為H.264,音頻編碼為MP3)分離成為兩個文件:一個H.264編碼的視頻碼流文件,一個MP3編碼的音頻碼流文件。分離某些封裝格式(例如MP4/FLV/MKV等)中的H.264的時候,需要首先寫入SPS和PPS,否則會導致分離出來的數據沒有SPS、PPS而無法播放。H.264碼流的SPS和PPS信息存儲在AVCodecContext結構體的extradata中。
?基于FFmpeg的視音頻分離器(Simplest FFmpeg demuxer)。視音頻分離器(Demuxer)即是將封裝格式數據(例如MKV)中的視頻壓縮數據(例如H.264)和音頻壓縮數據(例如AAC)分離開。視音頻復用器(Muxer)即是將視頻壓縮數據(例如H.264)和音頻壓縮數據(例如AAC)合并到一個封裝格式數據(例如MKV)中去。
?ffmpeg項目的數據IO部分主要是在libavformat庫中實現,某些對于內存的操作部分在libavutil庫中。數據IO是基于文件格式(Format)以及文件傳輸協議(Protocol)的,與具體的編解碼標準無關。
總結
以上是生活随笔為你收集整理的FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: z370-A装机记录
- 下一篇: 云服务器端口不通解决方法