視訊轉換 視訊水印 mencoder+ffmpeg+aviysth+ffdshow (1)
一. 視訊轉換水印資料的蒐集整理如下:
二. 1.現在網路上大多都用頁面中內嵌flash播放器播放flv格式的視訊,原理是通過mencoder+ffmpeg+avisyth通過mencoder將上傳的視訊通轉換為avi格式,用ffmpeg將avi格式轉換為flv格式,在配合avisyth新增水印,字幕,以及格式的轉換等,瞭解到還有一種新增水印的方式就是用ffmpeg將視訊按每一幀截圖,新增水印,再用mencoder將圖片合成視訊,比較繁瑣。
三. mencoder(隸屬Linux下MPlayer播放器的一個外掛)
1.轉換格式:
mencoder 7.wmv -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o 7.avi
2.字幕格式:(一般是通過.srt的檔案來加字幕的)
mencoder ../file/test.mov -o ../flv/zbzbzb.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:v4mv:last_pred=3 -subpos 5 -subfont
-text-scale 10 -unicode -font c:\arial.ttf -sub ../file/test.srt -lavfopts
i_certify_that_my_video_stream_does_not_use_b_frames -srate 22050
四. ffmpeg(有很多版本,我用的是svn)
1.轉換格式:
C:\ffmpeg\ffmpeg –y –i c:\avi\1.avi –ab 56 –ar 22050 –r 15 –b 320k –s 320*240 c:\1.flv
2.水印格式
①:ffmpeg -y -i 1.avs -b 320k avs.flv
②:mpeg -i /home/erlang/1.wmv -vhook ‘/usr/lib/vhook/watermark.so -m 1 -f logo.png’ test_1.mpg(我找到了vhook資料夾,但不知道如何編譯入ffmpeg)
五.AviSyth(是一個濾鏡,也可以叫外掛,有自己的語法)
編寫格式:
LoadPlugin("C:\WINDOWS\system32\vsfilter.dll")
video =DirectShowSource("C:/ffmpeg/avi/3.avi")
logo = ImageSource("C:/ffmpeg/logo.png")
logomask = ImageSource("C:/ffmpeg/logo.png")
overlay(video,logo,mask=logomask, opacity=0.8)
Subtitle("Anterms software",size=28, align=2, first_frame=0, last_frame=1000)
a1 = FadeIO0(ImageSource("c:/1.jpg", 0, 124, 25), 7)
a2 = FadeIO0(ImageSource("c:/2.jpg", 0, 124, 25), 7)
return a1 + a2
六.在c#中的呼叫
Process p = new Process();//建立外部 呼叫 執行緒
p.StartInfo.FileName = @"c:\ffmpeg1\ffmpeg.exe";//要呼叫外部程式的絕對路徑
p.StartInfo.Arguments = @"-i c:\1.avs -ab 56 -ar 22050 -b -r c:\text123.flv";//引數(這裡就是FFMPEG的引數了)
p.StartInfo.UseShellExecute = false;//不使用作業系統外殼程式 啟動 執行緒(一定為FALSE)
p.StartInfo.RedirectStandardError = true;//把外部程式錯誤輸出寫到StandardError流中
p.StartInfo.CreateNoWindow = false;//不建立 程序 視窗
p.Start();//啟動執行緒
p.BeginErrorReadLine();//開始非同步讀取
p.WaitForExit();//阻塞等待程序結束
p.Close();//關閉程序
p.Dispose();//釋放資源
七:可能出現的問題,只能轉換其中幾種,或者轉換後播放視訊倒著,或者用mencoder轉換後的沒法加水印,出現未找到用於流呈現的篩選器,解決方法,安裝ffdshow解碼器,給avisyth配置相應的引數和外掛,通過avs的載入外掛或者從登錄檔更改對應的選項即可。
附錄:
一.Ffmpeg的引數內容
-formats 輸出所有可用格式
-f fmt 指定格式(音訊或視訊格式)
-i filename 指定輸入檔名,在linux下當然也能指定:0.0(螢幕錄製)或攝像頭
-y 覆蓋已有檔案
-t duration 記錄時長為t
-fs limit_size 設定檔案大小上限
-ss time_off 從指定的時間(s)開始, [-]hh:mm:ss[.xxx]的格式也支援
-itsoffset time_off 設定時間偏移(s),該選項影響所有後面的輸入檔案。該偏移被加到輸入檔案的時戳,定義一個正偏移意味著相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支援
-title string 標題
-timestamp time 時間戳
-author string 作者
-copyright string 版權資訊
-comment string 評論
-album string album名
-v verbose 與log相關的
-target type 設定目標檔案型別("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number 設定要記錄的幀數
視訊選項:
-b 指定位元率(bits/s),似乎ffmpeg是自動VBR的,指定了就大概是平均位元率
-vb 指定視訊位元率(bits/s)
-vframes number 設定轉換多少楨(frame)的視訊
-r rate 楨速率(fps)
-s size 解析度
-aspect aspect 設定視訊長寬比(4:3, 16:9 or 1.3333, 1.7777)
-croptop size 設定頂部切除尺寸(in pixels)
-cropbottom size 設定底部切除尺寸(in pixels)
-cropleft size 設定左切除尺寸 (in pixels)
-cropright size 設定右切除尺寸 (in pixels)
-padtop size 設定頂部補齊尺寸(in pixels)
-padbottom size 底補齊(in pixels)
-padleft size 左補齊(in pixels)
-padright size 右補齊(in pixels)
-padcolor color 補齊帶顏色(000000-FFFFFF)
-vn 取消視訊
-vcodec codec 強制使用codec編解碼方式('copy' to copy stream)
-sameq 使用同樣視訊質量作為源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計資訊,第二遍生成精確的請求的位元速率
-passlogfile file 選擇兩遍的紀錄檔名為file
-newvideo 在現在的視訊流後面加入新的視訊流
高階視訊選項
-pix_fmt format set pixel format, 'list' as argument shows all the pixel formats supported
-intra 僅適用幀內編碼
-qscale q 以<數值>質量為基礎的VBR,取值0.01-255,約小質量越好
-loop_input 設定輸入流的迴圈數(目前只對影象有效)
-loop_output 設定輸出視訊的迴圈數,比如輸出gif時設為0表示無限迴圈
-g int 設定影象組大小
-cutoff int 設定截止頻率
-qmin int 設定最小質量
-qmax int 設定最大質量
-qdiff int 量化標度間最大偏差 (VBR)
-bf int 使用frames B 幀,支援mpeg1,mpeg2,mpeg4
音訊選項:
-ab 設定位元率(單位:bit/s,也許老版是kb/s)
-aframes number 設定轉換多少楨(frame)的音訊
-aq quality 設定音訊質量 (指定編碼)
-ar rate 設定音訊取樣率 (單位:Hz)
-ac channels 設定聲道數
-an 取消音訊
-acodec codec 指定音訊編碼('copy' to copy stream)
-vol volume 設定錄製音量大小(預設為256)
-newaudio 在現在的音訊流後面加入新的音訊流
字幕選項:
-sn 取消字幕
-scodec codec 設定字幕編碼('copy' to copy stream)
-newsubtitle 在當前字幕後新增
-slang code 設定字幕所用的ISO 639編碼(3個字母)
Audio/Video 抓取選項:
-vc channel 設定視訊捕獲通道(只對DV1394)
-tvstd standard 設定電視標準 NTSC PAL(SECAM)
二.Mencoder引數
-of lavf:是輸出檔案格式,這裡不是flv而是lavf,是因為flv屬於libavformat;
-oac oac=output audio codec 編碼音訊部分。這兒是mp3lame。
-oac mp3lame 音訊採用mp3編碼
-lameopts abr:br=56:
br是指設定音訊位元率為56(位元率:每秒鐘輸出的音訊大小,單位kb/s);
#-lameopts mode=3:cbr:br=32:vol=1,mode=3是音體聲,mode=0單聲道; vol=1-10控制音量
# -lameopts 顧名思義,即lame選項,這兒只需定義一下位元速率就可以了。
vbr 設定音訊位元速率的方法
0 cbr average bitrate
1 mt
2 rh constant bitrate Also forces CBR mode encoding on subsequent ABR presets modes.
3 abr
4 mtrh
br 就是設定我們所需要的位元速率值,格式為br=<0-1024>,只能在vbr為0和3的情況下才能使用該選項。
-ovc lavc #ovc=output video codec ;
-ovc 編碼檔案的視訊部分。主要有以下幾個選項
-ovc copy 不進行編碼,只是複製視訊流
-ovc divx4 編碼成DivX4/DivX5
-ovc raw 編碼成任意不壓縮的格式(用‘-vf format’設定具體的格式)
-ovc lavc 使用libavcodec進行編碼
-lavcopts vcodec=flv:vbitrate=350:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1
# 對lavc進行一些設定,vcodec=flv:指定視訊編碼器為flv
# vbitrate=500:指定視訊位元率為500(低品質為150kb/s,中等品質為400kb/s,高品質為700kb/s)
# mbd:巨集模組選擇演算法,值為0~2預設為0,值越大轉換越緩慢,但在品質和檔案大小方面有好處;
# mv0:編譯每個巨集模組並選擇最好的一個,當mbd=0時無效;
# v4mv:會稍微增加品質,mbd>0時效果更明顯;
# trell:量子化網格搜尋,對每8×8block找到最優化編碼;
# cbp:只能和trell一期使用,評估失真的影象塊編碼;
# last_pred=3:與上一幀相比的移動數量預測,值為0~99,1~3比較合適,大於3時對品質的提高已經無關緊要,但卻會降低速度;
# dia=4:移動搜尋範圍,值為-99~6,對於快速轉換,-1是個不錯的值,如果不是很重視速度,可以考慮2~4;
# cmp=6:值為1~2000,預設為0,設定用於全象素移動預算的比較函式
# vb_strategy=1:對動作很大的場景會有幫助,對有些視訊,設定vmax_b_frames會有損品質,加上vb_strategy=1會好點。
-vf scale=512:-3 #5-vf表示視訊格式,scale是縮放,512:-3表示強制將寬度設定為512,高度寫為-3表示保持高寬比
-ofps 12 幀速率設定,現為12fps
-srate 22050 聲音取樣頻率設定,現為22K
mencoder進行操作的常用方法: mencoder infile.* -o outfile.* [-ovc 目標視訊格式] [-oac 目標音訊格式] [-of 目標檔案格式]
1.轉換成flv檔案: mencoder infile.* -o outfile.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
mencoder infile.rmvb -o outfile.flv -vf scale=-3:150 -ofps 12 -oac mp3lame -ovc xvid -xvidencopts bitrate=112
2.轉換成avi檔案: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600
3.轉換成wmv檔案(複雜寫法,其中高階引數可以省去): mencoder infile.* -o outfile.wmv -of lavf -ofps 25 -oac mp3lame -lameopts cbr:preset=128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -srate 22050 -sws 9 -subcp cp936 -subpos 0 -subalign 0 -subfont-text-scale 3 -lavfopts i_certify_that_my_video_strea
其中-ovc,-oac和-of是必須的,-ovc是指定視訊codec,指定了ovc之後通常帶一個該codec的opt引數,-oac是指定音訊codec,也會在其後帶一個codec的opt引數.可以指定細節以決定視訊音訊質量和轉換速率.具體的細節可以參看專業的技術文件.