版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
基于FFmpeg音視頻處理全套工程案例合集??重要前置說明:兩種開發(fā)模式命令行模式:啟動子進(jìn)程調(diào)用ffmpeg.exe/ffmpeg,開發(fā)簡單,適合業(yè)務(wù)工具、中小型系統(tǒng);原生API模式(libav):編譯鏈接libavformat/libavcodec/libavutil/libswscale,無進(jìn)程開銷,高性能服務(wù)(直播網(wǎng)關(guān)、轉(zhuǎn)碼集群)。環(huán)境:預(yù)先安裝FFmpeg并配置環(huán)境變量,或內(nèi)置二進(jìn)制文件。目錄【案例1】Python批量音視頻工具箱(ffmpeg-python,快速落地)【案例2】JavaSpringBoot分布式視頻轉(zhuǎn)碼系統(tǒng)(Web服務(wù),后臺任務(wù))【案例3】Go輕量直播推流&拉流錄制工具【案例4】C++FFmpeg原生API工程(解封裝、編碼、音視頻合成,核心底層)【案例5】常用FFmpeg核心命令清單(配套所有項目直接調(diào)用)部署建議、集群轉(zhuǎn)碼優(yōu)化方案案例1:Pythonffmpeg-python全能批量處理工具適合:本地批量處理、小工具、自動化腳本依賴安裝bashpipinstallffmpeg-python#系統(tǒng)提前裝好ffmpeg完整源碼av_tool.pypython運行importffmpegimportosfrompathlibimportPathclassFFmpegTool:@staticmethoddefvideo_audio_split(video_path:str,out_audio:str):"""音視頻分離:提取音頻"""(ffmpeg.input(video_path).output(out_audio,vn=None)#vn=novideo.overwrite_output().run())@staticmethoddefmux_av(video_no_audio:str,audio_file:str,out_video:str):"""音視頻合成(封裝)"""video=ffmpeg.input(video_no_audio)audio=ffmpeg.input(audio_file)(ffmpeg.output(video,audio,out_video,vcodec="copy",acodec="copy").overwrite_output().run())@staticmethoddeftranscode(in_path:str,out_path:str,resolution="1280x720",crf=23):"""視頻轉(zhuǎn)碼h264"""(ffmpeg.input(in_path).filter("scale",resolution.split("x")[0],resolution.split("x")[1]).output(out_path,vcodec="libx264",crf=crf,preset="medium",acodec="aac").overwrite_output().run())@staticmethoddefadd_watermark(video_in:str,watermark_img:str,video_out:str,x=20,y=20):"""添加圖片水印"""(ffmpeg.input(video_in).overlay(x,y).input(watermark_img).output(video_out).overwrite_output().run())@staticmethoddefcapture_snapshot(video_path:str,out_img:str,time_pos="00:00:05"):"""截取視頻封面截圖"""(ffmpeg.input(video_path,ss=time_pos).filter("scale",640,-1).output(out_img,vframes=1).overwrite_output().run())@staticmethoddefbatch_process(folder:str):"""批量遍歷文件夾轉(zhuǎn)碼"""p=Path(folder)forfileinp.glob("*.mp4"):out=str(file.with_name(f"trans_{}"))print(f"正在處理{}")FFmpegTool.transcode(str(file),out)if__name__=="__main__":tool=FFmpegTool()#示例:提取音頻#tool.video_audio_split("test.mp4","audio.aac")#轉(zhuǎn)碼#tool.transcode("test.mp4","720p.mp4")#批量#tool.batch_process("./videos")優(yōu)點:開發(fā)速度極快;缺點:高并發(fā)場景進(jìn)程調(diào)度開銷大,不建議上萬任務(wù)集群。案例2:SpringBootJava視頻轉(zhuǎn)碼Web系統(tǒng)(生產(chǎn)可用工程架構(gòu))技術(shù)方案:JavaProcessBuilder調(diào)用FFmpeg命令+線程池+任務(wù)數(shù)據(jù)庫記錄狀態(tài)核心模塊任務(wù)提交接口(上傳視頻/傳入文件路徑)線程池異步執(zhí)行轉(zhuǎn)碼任務(wù)狀態(tài)持久化(待處理/轉(zhuǎn)碼中/成功/失?。┻M(jìn)度解析(捕獲ffmpegstderr日志解析當(dāng)前進(jìn)度)核心工具類FFmpegUtil.javajava運行importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassFFmpegUtil{//轉(zhuǎn)碼并發(fā)數(shù),根據(jù)CPU核心調(diào)整privatestaticfinalExecutorServiceTRANSCODE_POOL=Executors.newFixedThreadPool(4);/***異步視頻轉(zhuǎn)碼*/publicstaticvoidasyncTranscode(Stringsrc,Stringdest,LongtaskId){TRANSCODE_POOL.submit(()->{//ffmpeg命令String[]cmd={"ffmpeg","-y","-i",src,"-vcodec","libx264","-preset","medium","-crf","24","-acodec","aac",dest};ProcessBuilderpb=newProcessBuilder(cmd);pb.redirectErrorStream(true);try{Processprocess=pb.start();//讀取輸出,解析進(jìn)度BufferedReaderbr=newBufferedReader(newInputStreamReader(process.getInputStream()));Stringline;while((line=br.readLine())!=null){//解析time=xx.xx獲取進(jìn)度,更新數(shù)據(jù)庫task進(jìn)度if(line.contains("time=")){//updateTaskProgress(taskId,line);}}intexitCode=process.waitFor();if(exitCode==0){//轉(zhuǎn)碼成功updateStatus(taskId,SUCCESS)}else{//失敗updateStatus(taskId,FAIL)}}catch(Exceptione){e.printStackTrace();}});}//音視頻分離publicstaticStringgetExtractAudioCmd(Stringvideo,StringaudioOut){returnString.format("ffmpeg-y-i%s-vn-acodeccopy%s",video,audioOut);}}配套數(shù)據(jù)表(Mysql)sqlCREATETABLEvideo_transcode_task(idBIGINTPRIMARYKEYAUTO_INCREMENT,src_pathVARCHAR(512),dest_pathVARCHAR(512),statusTINYINTCOMMENT'0待處理1處理中2成功3失敗',progressINT,create_timeDATETIME,finish_timeDATETIME);擴展方案:接入RabbitMQ實現(xiàn)分布式轉(zhuǎn)碼集群,多機器消費任務(wù)。案例3:Go直播推流&錄像工具(RTMP推流+拉流錄制)Go適合運維工具、邊緣推流網(wǎng)關(guān);調(diào)用ffmpeg子進(jìn)程。go運行packagemainimport( "os/exec")//RTMP本地文件推流到直播服務(wù)器funcPushStream(videoFilestring,rtmpUrlstring)error{ args:=[]string{ "-re", "-i",videoFile, "-c:v","copy", "-c:a","copy", "-f","flv", rtmpUrl, } cmd:=exec.Command("ffmpeg",args...) returncmd.Run()}//拉取rtmp流,保存為本地視頻funcRecordStream(rtmpUrlstring,savePathstring)error{ args:=[]string{ "-y", "-i",rtmpUrl, "-c","copy", savePath, } cmd:=exec.Command("ffmpeg",args...) returncmd.Run()}funcmain(){ //PushStream("input.mp4","rtmp:///live/stream1") //RecordStream("rtmp:///live/stream1","record.mp4")}直播配套:搭配Nginx-RTMP/SRS流媒體服務(wù)器搭建完整直播鏈路。案例4:C++FFmpeglibav原生API完整工程(最底層,無進(jìn)程調(diào)用)?高性能轉(zhuǎn)碼服務(wù)首選,直接調(diào)用FFmpeg底層庫,不創(chuàng)建子進(jìn)程功能演示:avformat打開媒體、解封裝音頻、視頻數(shù)據(jù)包讀取視頻縮放swscale重新編碼+封裝輸出音視頻合成mux編譯環(huán)境Windows:MSVC+vcpkg安裝ffmpegLinux:aptinstalllibavformat-devlibavcodec-devlibswscale-devlibavutil-dev極簡核心示例代碼main.cppcpp運行extern"C"{#include<libavformat/avformat.h>#include<libavcodec/avcodec.h>#include<libswscale/swscale.h>#include<libavutil/avutil.h>}#include<iostream>staticvoidlog_error(intret){charerr[AV_ERROR_MAX_STRING_SIZE];av_strerror(ret,err,sizeof(err));std::cerr<<err<<std::endl;}intmain(){av_register_all();AVFormatContext*pFormatCtx=nullptr;intret=avformat_open_input(&pFormatCtx,"input.mp4",nullptr,nullptr);if(ret<0){log_error(ret);return-1;}avformat_find_stream_info(pFormatCtx,nullptr);//打印媒體信息av_dump_format(pFormatCtx,0,"input.mp4",0);//后續(xù):查找視頻流、打開解碼器、讀取AVPacket、像素轉(zhuǎn)換、編碼、封裝輸出avformat_close_input(&pFormatCtx);return0;}【重要】完整工程CMakeLists、完整轉(zhuǎn)碼代碼、pts/dts時間基處理、音頻重采樣代碼量較大,如果你需要,我可以直接輸出完整可編譯CMake項目整套代碼(包含重采樣swresample)。C++方案適用場景低延遲實時轉(zhuǎn)碼多路并發(fā)轉(zhuǎn)碼服務(wù)器嵌入式設(shè)備(ARM網(wǎng)關(guān)、攝像頭設(shè)備)通用高頻FFmpeg命令(所有項目直接調(diào)用)1.音視頻分離bash#提取音頻ffmpeg-iinput.mp4-vn-acodeccopyaudio.aac#提取視頻(無聲)ffmpeg-iinput.mp4-an-vcodeccopysilent.mp42.音視頻合成bashffmpeg-isilent.mp4-iaud
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文明城區(qū)創(chuàng)建難點突破總結(jié)
- 安全生產(chǎn)月評選講解
- 酵母制備工安全意識強化評優(yōu)考核試卷含答案
- 四月就業(yè)市場趨勢分析
- 對外貿(mào)易專業(yè)就業(yè)前景分析
- 創(chuàng)業(yè)園消防安全評估
- 耕種機械制造工崗前實操評估考核試卷含答案
- 靜電成像顯影材料墨粉(色調(diào)劑)制造工崗中操作考核試卷含答案
- 兩棲類養(yǎng)殖工崗位師帶徒考核試卷含答案
- 廣播電視機務(wù)員工作改進(jìn)強化考核試卷含答案
- 2025中遠(yuǎn)海運戰(zhàn)略性新興產(chǎn)業(yè)人才社會招聘265人筆試歷年常考點試題專練附帶答案詳解2套試卷
- 胃癌合并肝轉(zhuǎn)移綜合治療方案
- 南昌水業(yè)集團(tuán)南昌工貿(mào)有限公司2026年招聘考前自測高頻考點模擬試題濃縮300題必考題
- 退休支部工作計劃2025完整版
- GB/T 46197.2-2025塑料聚醚醚酮(PEEK)模塑和擠出材料第2部分:試樣制備和性能測定
- 啤酒質(zhì)量知識培訓(xùn)課件
- 消毒供應(yīng)中心清洗課件
- 青少年無人機基礎(chǔ)飛行課件
- 《人工智能通識課》全套教學(xué)課件
- 浙江省安全生產(chǎn)全覆蓋標(biāo)準(zhǔn)體系2025版清單
- 古建文物改造方案(3篇)
評論
0/150
提交評論