ffmpeg

1.1         源碼下載linux

用GIT從下面地址下載:git://source.ffmpeg.org/ffmpeg.gitgit

例如:在linux下:windows

git  clone  git://source.ffmpeg.org/ffmpeg.git  ffmpeg服務器

1.2         依賴app

若是要編譯ffplay,它依賴sdl庫。安裝SDL庫:http://www.libsdl.org/async

ffmpeg 0.11,須要make3.82版本。因爲如今ffmpeg處理活動期,因此最好是在最新的linux操做系統上編譯。這樣autoconf、automake、make這些工具能夠是最新的,就不用升級。ide

 

若是是windows下編譯,還須要cygwin或者minwin工具

cygwin下能夠會由於回車符產生如下錯誤:post

 

./makes: line 2: $'\r': command not foundui

解決方法以:

一、配置cygwin系統,讓cygwin忽略dos回車符

如下是具體的修改方法!

# ignore return

set -o igncr

export SHELLOPTS

 

 二、用dos2unix命令轉換有回車符的文件:
dos2unix 文件

 三、用VI替換文件中的回車符

%s/\n/^M/g

  其中^M這個須要先Ctrl+v再按回車獲得

 

1.3         編譯、安裝

1.3.1    在linux下

./configure --disable-yasm

make

make install

 

默認安裝在 /usr/local下。

設置pkg-config環境變量:

PKG_CONFIG_PATH=」$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig」

export PKG_CONFIG_PATH

 

或者用 libdir 指定依賴庫的位置:

 ./configure --enable-libx264 --enable-gpl  --libdir=/usr/local/lib

1.3.2    cygwin下編譯與linux下編譯同樣。

若是在windows環境下使用,則須要把C:\cygwin\bin加到環境變量PATH中。由於ffmpeg程序依賴的cygwin的庫都存在這裏。

發行時,就須要把相關依賴的庫放到同一目錄中。

用ldd ffmpeg 查看依賴哪些庫。

1.3.3    mingw下編譯與linux下編譯同樣。

1.3.4    在cygwin下用mingw來交叉編譯:

./configure --cross_prefix=i686-pc-mingw32- --target-os=mingw32 --arch=i686 --prefix=/usr/i686-pc-mingw32/sys-root/mingw --enable-swscale --enable-postproc --enable-gpl

會提示說i686-pc-mingw32-pkg-config沒找到,不過這沒有關係,能夠忽略,若是要安裝,能夠從下面地址下載glib和pkg-config包,pkg-config依賴glib:

而後把它們複製到:
/usr/i686-pc-mingw32/sys-root/mingw 目錄下

 

若是在windows環境下使用,則須要把C:\cygwin\usr\i686-pc-mingw32\sys-root\mingw\bin加到環境變量PATH中。由於mingw程序依賴的cygwin的庫都存在這裏。

發行時,就須要把相關依賴的庫放到同一目錄中。

 

1.1         ffmpeg格式

ffmpeg [[options][`-i' input_file]]... {[options] output_file}...

若是沒有輸入文件,那麼視音頻捕捉(只在Linux下有效,由於Linux下把音視頻設備看成文件句柄來處理)就會起做用。做爲通用的規則,選項通常用於下一個特定的文件。若是你給 –b 64選項,改選會設置下一個視頻速率。對於原始輸入文件,格式選項多是須要的。缺省狀況下,ffmpeg試圖儘量的無損轉換,採用與輸入一樣的音頻視頻參數來輸出。

1.2         流複製:複製文件的流,只更改容器(文件)格式。

./ffmpeg –v debug –i inputfile.mpg –c copy  -f asf outfile.asf

-f:設置混合器

-c:設置編碼器。當爲 copy:指複製編碼流

-i:輸入文件

-v:調試信息級別(quiet、panic、fatal、error、warning、info、verbose、debug)

 

1.3         指定流:

一個容器裏能夠包含許多流,包括任何的音視頻流。那麼在命令行怎樣區分流呢?

答:由「:」進行分隔

./ffmpeg –i inputfile.mpg –c:v h263 –c:a g722 –f asf outfile.asf

./ffmpeg –i inputfile.mpg –c:0 h263 –c:1 g722 –f asf outfile.asf

上面命令表示把輸入文件 inputfile文件的視頻流轉換成h263格式,把音頻流轉換成g722格式。

v:視頻

a:音頻

數字:表示第幾路,從0開始

 

1.1         Ffmpeg選項詳解

你能夠使用:ffmpeg –help來得到選項內容

 

1.1.1    通用選項

-L license

-h 幫助

 

-fromats顯示可用的格式,編解碼的,協議的

-codecs 顯示可用的編解碼器

-bsfs     顯示bit流過濾器

-protocols顯示可用的協議

-pix_fmts顯示可用的位圖格式

-sample_fmts顯示可用的音頻採樣格式

 

-loglevel loglevel set libav* logging level

-v loglevel        set libav* logging level

-debug flags       set debug flags

-fdebug flags      set debug flags

-report            generate a report

 

-f fmt強迫採用格式fmt

-i filename輸入文件

-y 覆蓋輸出文件

-c編解碼器名字

-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持

-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持

-timestamp time 設置記錄時間戳(‘now’指定當前時間)

 

-title string 設置標題

-author string 設置做者

-copyright string 設置版權

-comment string 設置評論

 

1.1.2    視頻選項

-vframes number     設置記錄的視頻幀數

-r rate            設置幀率 (Hz value, fraction or abbreviation)

-s size            設置幀的大小 (WxH or abbreviation)

-aspect aspect      set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)

-bits_per_raw_sample number  set the number of bits per raw sample

-croptop size       Removed, use the crop filter instead

-cropbottom size    Removed, use the crop filter instead

-cropleft size      Removed, use the crop filter instead

-cropright size     Removed, use the crop filter instead

-padtop size        Removed, use the pad filter instead

-padbottom size     Removed, use the pad filter instead

-padleft size       Removed, use the pad filter instead

-padright size      Removed, use the pad filter instead

-padcolor color     Removed, use the pad filter instead

-vn               禁用視頻

-vcodec codec       force video codec ('copy' to copy stream)

-sameq              use same quantizer as source (implies VBR)

-same_quant         use same quantizer as source (implies VBR)

-timecode hh:mm:ss[:;.]ff  set initial TimeCode value.

-pass n             select the pass number (1 or 2)

-passlogfile prefix  select two pass log file name prefix

-vf filter list     video filters

-b bitrate         video bitrate (please use -b:v)

-dn                 disable data

1.1.3    高級視頻選項

-pix_fmt format     設置位圖格式

-intra              deprecated use -g 1

-vdt n              discard threshold

-rc_override override  rate control override for specific intervals

-deinterlace        this option is deprecated, use the yadif filter instead

-psnr               calculate PSNR of compressed frames

-vstats             dump video coding statistics to file

-vstats_file file   dump video coding statistics to file

-intra_matrix matrix  specify intra matrix coeffs

-inter_matrix matrix  specify inter matrix coeffs

-top                top=1/bottom=0/auto=-1 field first

-dc precision       intra_dc_precision

-vtag fourcc/tag    force video tag/fourcc

-qphist             show QP histogram

-force_fps          force the selected framerate, disable the best supported framerate selection

-force_key_frames timestamps  force key frames at specified timestamps

-vbsf video bitstream_filters  deprecated

-vpre preset        set the video options to the indicated preset

1.1.4    音頻選項

-aframes number     set the number of audio frames to record

-aq quality         set audio quality (codec-specific)

-ar rate            set audio sampling rate (in Hz)

-ac channels        set number of audio channels

-an                 disable audio

-acodec codec       force audio codec ('copy' to copy stream)

-vol volume         change audio volume (256=normal)

-af filter list     audio filters

1.1.5    音頻/視頻捕獲選項

-vc channel         deprecated, use -channel

-tvstd standard     deprecated, use -standard

-isync              sync read on input

-vd device 設置視頻捕獲設備。好比/dev/video0

-dv1394 設置DV1394捕獲

-av device 設置音頻設備好比/dev/dsp

 

1.1.6    高級選項

-cpuflags flags     force specific cpu flags

-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_s  set input stream mapping

-map_channel file.stream.channel[:syncfile.syncstream]  map an audio channel from one stream to another

-map_chapters input_file_index  set chapters mapping

-benchmark          add timings for benchmarking

-benchmark_all      add timings for each task

-progress url       write program-readable progress information

-dump               dump 每一個輸入包

-hex                當 dumping包時,也dump其荷載

-re                 read input at native frame rate

-vsync              video sync method

-async              audio sync method

-adrift_threshold threshold  audio drift threshold

-copyts             copy timestamps

-copytb mode        copy input stream time base when stream copying

-shortest           finish encoding within shortest input

-dts_delta_threshold threshold  timestamp discontinuity delta threshold

-dts_error_threshold threshold  timestamp error delta threshold

-copyinkf           copy initial non-keyframes

-q q                use fixed quality scale (VBR)

-qscale q           use fixed quality scale (VBR)

-profile profile    set profile

-filter_complex graph_description  create a complex filtergraph

-debug_ts           打印調試信息時間戳

-streamid streamIndex:value  set the value of an outfile streamid

-muxdelay seconds   set the maximum demux-decode delay

-muxpreload seconds  set the initial demux-decode delay

-fpre filename      set options from indicated preset file

 

1.1.1    截取一張352x240尺寸大小的,格式爲jpg的圖片:

ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

1.1.2    把視頻的前30幀轉換成一個Animated Gif

ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

1.1.3    截取指定時間的縮微圖

ffmpeg -i test.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 test.jpg

-ss後跟的時間單位爲秒

1.1.4    轉換文件爲3GP格式

ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144

 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp

1.1.5    使用ffmpeg錄像屏幕

ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s 1024x768 ~/test.avi

:其中,-vd x11:0,0指錄製所使用的偏移爲 x=0和 y=0,-s 1024×768指錄製視頻的大小爲 1024×768。錄製的視頻文件爲 test.avi,將保存到用戶主目錄中

 

若是你只想錄製一個應用程序窗口或者桌面上的一個固定區域,那麼能夠指定偏移位置和區域大小。使用xwininfo -frame命令能夠完成查找上述參數。

從新調整視頻尺寸大小

ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi

注:上面的ffmpeg的屏幕錄製功能只能在Linux環境下有效。在windows下是否可行,本人還不知道如何操做,若是你知道,請告訴我J

 

1.1.6    把攝像頭的實時視頻錄製下來,存儲爲文件

在windows有兩種視頻捕獲方式,使用VFW或DSHOW,你須要在編譯ffmpeg時,把相應的組件編譯進libavdevice中,下面使用vfw方式捕獲:

./ffmpeg -t 10 -f vfwcap -i 0 -r 25 -f asf cap.asf

咱們採集10秒,採集設備爲vfwcap類型設備,第0個vfwcap採集設備(若是系統有多個vfw的視頻採集設備,能夠經過-i num來選擇),每秒25幀,輸出方式爲文件,格式爲asf

 

在Linux平臺上,ffmpeg對V4L2的視頻設備提升了很好的支持,如:

./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp

以上命令表示:採集10秒鐘視頻,對video4linux2視頻設備進行採集,採集QCIF(176*144)的視頻,每秒8幀,視頻設備爲/dev/video0,視頻編碼爲h263,輸出格式爲RTP,後面定義了IP地址及端口,將該碼流所對應的SDP文件重定向到/tmp/ffmpeg.sdp中,將此SDP文件上傳到流媒體服務器就能夠實現直播了。

./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 10 -vpre libx264-hq.ffpreset -i /dev/video0 -vcodec libx264 -f rtp rtp://192.168.1.105:6060 > /tmp/x264.sdp

這條命令與上面的相似,可是視頻編碼爲h264,因爲ffmpeg是用外部庫x264支持h264編碼,所以h264的視頻採集須要更多參數。主要是須要指定-vpre libx264-hq.ffpreset 才能夠。

 

下面命令則是把捕獲到的視頻保存成文件:

ffmpeg  -f video4linux -s 320*240 -r 10 -i /dev/video0  test.asf

 

1.1.1    接收組播直播流,並保存成文件:

./ffmpeg -i udp://@ip:port  test.ts

1.1.2    從文件生成直播流:

ffmpeg  -i  a.flv  -f  flv  rtmp://IP/livepkgr/livestream?adbe-live-event=liveevent

IP是你的fms服務器的IP地址

1.1.3    從組播地址接收組播,並把它轉成rtmp協議發給 fms服務器

ffmpeg  –i  udp://@:port  –f  flv  rtmp://IP/livepkgr/livestream?adbe-live-event=liveevent

1.1.4    對流進行分片(支持hls協議)

ffmpeg  -I  a.asf  -codec  copy  -map  0  -f  segment-segment_list  out.m3u8 out%03d.tss

 

用in.avi做爲輸入視頻,out.avi做爲輸出視頻,pp.png表示要添加的水印圖片,是png格式的,調整水印大小(scale = 50:50)和位置(overlay=10:10)
ffmpeg –i in.avi -i /data/move/long.png -filter_complex '[1:v]scale=50:50[s];[0:v][s]overlay=10:10' -b:v 500000 -c:v h264  -s cif -f mpegts out.avi

使用overlay添加透明水印時,位置參數的位置在 -vfilters 裏面的 overlay= 的後面的前兩個參數,參數之間是冒號分隔的。第一個參數是橫向的間距,第二個是縱向的間距。能夠結合與視頻和水印相關的四個值來設置,這四個值分別是:mainW表示主視頻寬度,mainH表示主視頻高度,overlayW表示水印寬度,overlayH表示水印高度。這些值加在overlay參數中,ffmpeg將自動識別。

 

也就是說要讓水印

顯示在視頻的左上角overlay參數爲 overlay=0:0

顯示在右上角爲 overlay= main_w-overlay_w:0

顯示在右下角爲 overlay= main_w-overlay_w:main_h-overlay_h

顯示在左下角爲 overlay=0: main_h-overlay_h

上面的0能夠改成5,或10像素,以便多留出一些空白。

 

用複合過濾器添加水印:

ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output

input:輸入流

logo:水印文件,也能夠是一個流。注意:須要編譯時把相應的解碼器編譯。例如PNG圖片。須要編譯PNG解碼器。Ffmpeg纔可以識別圖片文件,把圖片作爲一種流。注意:PNG圖片必須含有alpha通道。Overlay過濾器是根據alpha通道來進行復蓋的。因此,你想要透明效果時,須先製作一張透明的PNG圖片。

output:輸出流

也能夠用下面命令:

ffmpeg -i input  -vf 'movie=long.png[logo];[in][logo]overlay=10:10[out]' output

movie過濾器用來把兩個流組合成一個流。它有一個輸出PAD。

相關文章
相關標籤/搜索