1. 程式人生 > >視訊轉換 視訊水印 mencoder+ffmpeg+aviysth+ffdshow (1)

視訊轉換 視訊水印 mencoder+ffmpeg+aviysth+ffdshow (1)

印視訊轉換總結(win):

 

一.              視訊轉換水印資料的蒐集整理如下:

二.              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引數.可以指定細節以決定視訊音訊質量和轉換速率.具體的細節可以參看專業的技術文件.