Ⅰ 怎麼壓縮視頻且不破壞解析度
可以使用愛剪輯軟體來將視頻文件壓縮且不破壞解析度,步驟如下:
需要工具:電腦、愛剪輯軟體
一、首先找到需要壓縮的視頻,並將其拖到桌面上方便查找,此時視頻大小為66.6M。
Ⅱ ffmpeg 命令大全
前言
FFMPEG是特別強大的專門用於處理音視頻的開源庫。你既可以使用它的API對音視頻進行處理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,來編輯你的音視頻文件。
本文將簡要介紹一下 FFMPEG 庫的基本目錄結構及其功能,然後詳細介紹一下我們在日常工作中,如何使用 ffmpeg 提供的工具來處理音視頻文件。
在講解 FFMPEG 命令之前,我們先要介紹一些音視頻格式的基要概念。
我們按使用目的可以將 FFMPEG 命令分成以下幾類:
除了 FFMPEG 的基本信息查詢命令外,其它命令都按下圖所示的流程處理音視頻
先是解復用獲取到編碼的數據包,然後將編碼的數據包傳送給解碼器(除非為數據流選擇了流拷貝,請參閱進一步描述)。 解碼器產生未壓縮的幀(原始視頻/ PCM音頻/ ...),可以通過濾波進一步處理(見下一節)。 在過濾之後,幀被傳遞到編碼器,編碼器並輸出編碼的數據包。 最後,這些傳遞給復用器,將編碼的數據包寫入輸出文件。
默認情況下,ffmpeg只包含輸入文件中每種類型(視頻,音頻,字幕)的一個流,並將其添加到每個輸出文件中。 它根據以下標准挑選每一個的「最佳」:對於視頻,它是具有最高解析度的流,對於音頻,它是具有最多channel的流,對於字幕,是第一個字幕流。 在相同類型的幾個流相等的情況下,選擇具有最低索引的流。
您可以通過使用-vn / -an / -sn / -dn選項來禁用某些默認設置。 要進行全面的手動控制,請使用-map選項,該選項禁用剛描述的默認設置。
FFMPEG 可以使用下面的參數進行基本信息查詢。例如,想查詢一下現在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 來查詢。詳細參數說明如下:
查詢編譯器libfdk_aac的信息
FFMPEG 處理音視頻時使用的命令格式與參數
ffmpeg 通過 -i 選項讀取輸任意數量的輸入「文件」(可以是常規文件,管道,網路流,抓取設備等,並寫入任意數量的輸出「文件」。
原則上,每個輸入/輸出「文件」都可以包含任意數量的不同類型的視頻流(視頻/音頻/字幕/附件/數據)。 流的數量和/或類型是由容器格式來限制。 選擇從哪個輸入進入到哪個輸出將自動完成或使用 -map 選項。
要引用選項中的輸入文件,您必須使用它們的索引(從0開始)。 例如。 第一個輸入文件是0,第二個輸入文件是1,等等。類似地,文件內的流被它們的索引引用。 例如。 2:3是指第三個輸入文件中的第四個流
上面就是 FFMPEG 處理音視頻的常用命令,下面是一些常用參數
首先通過下面的命令查看一下 mac 上都有哪些設備。
注意,桌面的輸入對幀率沒有要求,所以不用限制桌面的幀率。其實限制了也沒用。
由於沒有解碼或編碼,速度非常快,沒有質量損失。 但是,由於許多因素,在某些情況下可能無法正常工作。 應用過濾器顯然也是不可能的,因為過濾器處理未壓縮的數據
上面的命令表式的是音頻、視頻都直接 ,只是將 mp4 的封裝格式轉成了flv。
在編碼之前,ffmpeg可以使用libavfilter庫中的過濾器處理原始音頻和視頻幀。 幾個鏈式過濾器形成一個過濾器圖形。 ffmpeg區分兩種類型的過濾器圖形:簡單和復雜。
請注意,某些濾鏡會更改幀屬性,但不會改變幀內容。 例如。 上例中的fps過濾器會改變幀數,但不會觸及幀內容。 另一個例子是setpts過濾器。
復雜的過濾器圖使用-filter_complex選項進行配置。 請注意,此選項是全局性的,因為復雜的過濾器圖形本質上不能與單個流或文件明確關聯。
-lavfi選項等同於-filter_complex。
一個復雜的過濾器圖的一個簡單的例子是覆蓋過濾器,它有兩個視頻輸入和一個視頻輸出,包含一個視頻疊加在另一個上面。 它的音頻對應是amix濾波器
添加文字水印
添加本地時間水印
https://www.jianshu.com/p/e4ad7e1e7ed5
先通過 ffplay 找到要刪除 LOGO 的位置
使用 delogo 濾鏡刪除 LOGO
crop 格式:crop=out_w:out_h:x:y
https://blog.csdn.net/matrix_laboratory/article/details/53158307
首先創建一個 inputs.txt 文件,文件內容如下:
然後執行下面的命令:
播放yuv數據,需要指定解析度
Ⅲ 急急急!!!java 用ffmpeg將上傳的視頻轉成 .mp4 .ogg .webm 3種格式的視頻,沒思路,麻煩大神給點思路
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class ConvertVideo {
private final static String PATH = "c:\\ffmpeg\\input\\c.mp4";
public static void main(String[] args) {
if (!checkfile(PATH)) {
System.out.println(PATH + " is not file");
return;
}
if (process()) {
System.out.println("ok");
}
}
private static boolean process() {
int type = checkContentType();
boolean status = false;
if (type == 0) {
System.out.println("直接將文件轉為flv文件");
status = processFLV(PATH);// 直接將文件轉為flv文件
} else if (type == 1) {
String avifilepath = processAVI(type);
if (avifilepath == null)
return false;// avi文件沒有得到
status = processFLV(avifilepath);// 將avi轉為flv
}
return status;
}
private static int checkContentType() {
String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
.toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 對ffmpeg無法解析的文件格式(wmv9,rm,rmvb等),
// 可以先用別的工具(mencoder)轉換為avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private static boolean checkfile(String path) {
File file = new File(path);
if (!file.isFile()) {
return false;
}
return true;
}
// 對ffmpeg無法解析的文件格式(wmv9,rm,rmvb等), 可以先用別的工具(mencoder)轉換為avi(ffmpeg能解析的)格式.
private static String processAVI(int type) {
List<String> commend = new ArrayList<String>();
commend.add("c:\\ffmpeg\\mencoder");
commend.add(PATH);
commend.add("-oac");
commend.add("lavc");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");
commend.add("c:\\ffmpeg\\output\\a.avi");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return "c:\\ffmpeg\\output\\a.avi";
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private static boolean processFLV(String oldfilepath) {
if (!checkfile(PATH)) {
System.out.println(oldfilepath + " is not file");
return false;
}
// 文件命名
Calendar c = Calendar.getInstance();
String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000);
List<String> commend = new ArrayList<String>();
commend.add("c:\\ffmpeg\\ffmpeg");
commend.add("-i");
commend.add(oldfilepath);
commend.add("-ab");
commend.add("56");
commend.add("-ar");
commend.add("22050");
commend.add("-qscale");
commend.add("8");
commend.add("-r");
commend.add("15");
commend.add("-s");
commend.add("600x500");
commend.add("c:\\ffmpeg\\output\\a.flv");
try {
Runtime runtime = Runtime.getRuntime();
Process proce = null;
String cmd = "";
String cut = " c:\\ffmpeg\\ffmpeg.exe -i "
+ oldfilepath
+ " -y -f image2 -ss 8 -t 0.001 -s 600x500 c:\\ffmpeg\\output\\"
+ "a.jpg";
String cutCmd = cmd + cut;
proce = runtime.exec(cutCmd);
ProcessBuilder builder = new ProcessBuilder(commend);
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
Ⅳ ffmpeg 基本用法
1、libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能,包含demuxers和muxer庫;
2、libavcodec:用於各種類型聲音/圖像編解碼;
3、libavutil:包含一些公共的工具函數;
4、libswscale:用於視頻場景比例縮放、色彩映射轉換;
5、libpostproc:用於後期效果處理;
6、ffmpeg:是一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡實時編碼;
7、ffsever:是一個HTTP多媒體實時廣播流伺服器,支持時光平移;
8、ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
在這組成部分中,需要熟悉基礎概念有
容器(Container)
容器就是一種文件格式,比如flv,mkv等。包含下面5種流以及文件頭信息。
流(Stream)
是一種視頻數據信息的傳輸方式,5種流:音頻,視頻,字幕,附件,數據。
幀(Frame)
幀代表一幅靜止的圖像,分為I幀,P幀,B幀。
編解碼器(Codec)
是對視頻進行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)
復用/解復用(mux/demux)
把不同的流按照某種容器的規則放入容器,這種行為叫做復用(mux)
把不同的流從某種容器中解析出來,這種行為叫做解復用(demux)
1、FFmpeg程序把-i參數指定的若干文件內容讀入到內存,按照輸入的參數或者程序默認的參數來處理並且把結果寫入到若乾的文件中。輸入和輸出文件可以是計算機文件、管道、網路流、捕獲設備等。
2、FFmpeg用libavformat包調用解復用器(demuxers)來讀取輸入文件中被編碼的數據包(packets),如果有多個輸入文件,FFmpeg以有效輸入流的最小時間戳來同步,
3、然後解碼器(decoder)從已編碼的數據包中產生未被壓縮的幀(frame),在那之後調用可選的過濾器。
4、這些幀被傳遞到編碼器,編碼器會產生新的編碼包
5、把新的編碼包傳遞給復用器(muxer)處理並且把結果寫入到輸出文件中。
在多媒體處理中,filter的意思是被編碼到輸出文件之前用來修改輸入文件內容的一個軟體工具。如:視頻翻轉,旋轉,縮放等。
語法:[input_link_label1]… filter_name=parameters [output_link_label1]…
1、視頻過濾器 -vf
如input.mp4視頻按順時針方向旋轉90度
ffplay -i input.mp4 -vf transpose=1
如input.mp4視頻水平翻轉(左右翻轉)
ffplay -i input.mp4 -vf hflip
2、音頻過濾器 -af
實現慢速播放,聲音速度是原始速度的50%
offplay input.mp3 -af atempo=0.5
過濾器鏈(Filterchain)
Filterchain = 逗號分隔的一組filter
語法:「filter1,filter2,filter3,…filterN-2,filterN-1,filterN」
順時針旋轉90度並水平翻轉
ffplay -i input.mp4 -vf transpose=1,hflip
過濾器圖(Filtergraph)
第一步: 源視頻寬度擴大兩倍。
ffmpeg -i ji.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源視頻水平翻轉
ffmpeg -i ji.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻轉視頻覆蓋output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很復雜?
用帶有鏈接標記的過濾器圖(Filtergraph)只需一條命令
基本語法
Filtergraph = 分號分隔的一組filterchain
「filterchain1;filterchain2;…filterchainN-1;filterchainN」
Filtergraph的分類
1、簡單(simple) 一對一
2、復雜(complex)多對一, 多對多
簡單過濾器圖處理流程:
復雜過濾器圖處理流程:
對於剛才用三步處理的方式,用過濾器圖可以這樣做:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
F1: split過濾器創建兩個輸入文件的拷貝並標記為[a],[b]
F2: [a]作為pad過濾器的輸入,pad過濾器產生2倍寬度並輸出到[1].
F3: [b]作為hflip過濾器的輸入,vflip過濾器水平翻轉視頻並輸出到[2].
F4: 用overlay過濾器把 [2]覆蓋到[1]的旁邊.
一些多媒體容器比如AVI,mkv,mp4等,可以包含不同種類的多個流,如何從容器中抽取各種流呢?
語法:
-map file_number[:stream_type][:stream_number]
這有一些特別流符號的說明:
1、-map 0 選擇第一個文件的所有流
2、-map i:v 從文件序號i(index)中獲取所有視頻流, -map i:a 獲取所有音頻流,-map i:s 獲取所有字幕流等等。
3、特殊參數-an,-vn,-sn分別排除所有的音頻,視頻,字幕流
tip:對比上面的圖,可以知道,假設有兩個文件ffmpeg -i fist.mp4 -i second.mp4 ..output.mp4
如果想去兩個文件的音視頻流 ffmpeg -i fist.mp4 -i second.mp4 map:0 -map 1 output.mp4
如果想去第一個文件的視頻流,第二個文件的音頻流ffmpeg -i fist.mp4 -i second.mp4 -map:v:0 -map:a:0 output.mp4
可用的bit流 :ffmpeg –bsfs
可用的編解碼器:ffmpeg –codecs
可用的解碼器:ffmpeg –decoders
可用的編碼器:ffmpeg –encoders
可用的過濾器:ffmpeg –filters
可用的視頻格式:ffmpeg –formats
可用的聲道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的協議:ffmpeg -protocals
碼率和幀率是視頻文件的最重要的基本特徵,對於他們的特有設置會決定視頻質量。如果我們知道碼率和時長那麼可以很容易計算出輸出文件的大小。
幀率:幀率也叫幀頻率,幀率是視頻文件中每一秒的幀數,肉眼想看到連續移動圖像至少需要15幀。
碼率:比特率(也叫碼率,數據率)是一個確定整體視頻/音頻質量的參數,秒為單位處理的位元組數,碼率和視頻質量成正比,在視頻文件中中比特率用bps來表達。
設置幀率
1、用 -r 參數設置幀率
ffmpeg –i input.mp4 –r fps output.mp4
2、用fps filter設置幀率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
設置碼率 –b 參數
-b
ffmpeg -i film.avi -b 1.5M film.mp4
音頻:-b:a 視頻: - b:v
設置視頻碼率為1500kbps
ffmpeg -i input.avi -b:v 1500k output.mp4
控制輸出文件大小
-fs (file size首字母縮寫)
ffmpeg -i input.avi -fs 1024K output.mp4
計算輸出文件大小
(視頻碼率+音頻碼率) * 時長 /8 = 文件大小K
用-s參數設置視頻解析度,參數值wxh,w寬度單位是像素,h高度單位是像素
ffmpeg -i input_file -s 320x240 output_file
2、預定義的視頻尺寸
下面兩條命令有相同效果
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
下表列出了所有的預定義尺寸
Scale filter調整解析度
Scale filter的優點是可以使用一些額外的參數
語法:
Scale=width:height[:interl={1|-1}]
下表列出了常用的額外參數
下面兩條命令有相同效果
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
對輸入視頻成比例縮放
改變為源視頻一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改變為原視頻的90%大小:
ffmpeg -i input.mpg -vf scale=iw 0.9:ih 0.9 output.mp4
在未知視頻的解析度時,保證調整的解析度與源視頻有相同的橫縱比。
寬度固定400,高度成比例:
ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1
相反地,高度固定300,寬度成比例:
ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300
從輸入文件中選取你想要的矩形區域到輸出文件中,常見用來去視頻黑邊。
語法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]
裁剪輸入視頻的左三分之一,中間三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
裁剪幀的中心
當我們想裁剪區域在幀的中間時,裁剪filter可以跳過輸入x和y值,他們的默認值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
裁剪中間一半區域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
比較裁剪後的視頻和源視頻比較
ffplay -i ji.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2 iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w 2.4:40
自動檢測裁剪區域�
cropdetect filter 自動檢測黑邊區域
ffplay ji.mp4 -vf cropdetect
填充視頻(pad)
在視頻幀上增加一快額外額區域,經常用在播放的時候顯示不同的橫縱比
語法:pad=width[:height:[:x[:y:[:color]]]]
創建一個30個像素的粉色寬度來包圍一個SVGA尺寸的圖片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
同理可以製作input.mp4視頻用30個像素粉色包圍視頻
ffplay -i input.mp4 -vf pad=iw+60:ih+60:30:30:pink
4:3到16:9
一些設備只能播放16:9的橫縱比,4:3的橫縱比必須在水平方向的兩邊填充成16:9,
高度被保持,寬度等於高度乘以16/9,x(輸入文件水平位移)值由表達式(output_width - input_width)/2來計算。
4:3到16:9的通用命令是:
ffmpeg -i input.mp4 -vf pad=ih 16/9:ih :(ow-iw)/2:0:color output.mp4
eg:ffplay -f input.mp4 -vf pad=ih 16/9:ih:(ow-iw)/2:0:pink
16:9到4:3
為了用4:3的橫縱比來顯示16:9的橫縱比,填充輸入文件的垂直兩邊,寬度保持不變,高度是寬度的3/4,y值(輸入文件的垂直偏移量)是由一個表達式(output_height-input_height)/2計算出來的。
16:9到4:3的通用命令:
ffmpeg -i input.mp4-vf pad=iw :iw 3/4:0:(oh-ih)/2:color output.mp4
eg:ffplay -i input.mp4 =size=320x180 -vf pad=iw:iw 3/4:0:(oh-ih)/2:pink
水平翻轉語法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
垂直翻轉語法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
語法:transpose={0,1,2,3}
0:逆時針旋轉90°然後垂直翻轉
1:順時針旋轉90°
2:逆時針旋轉90°
3:順時針旋轉90°然後水平翻轉
模糊
語法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
注意:luma_r和alpha_r半徑取值范圍是0~min(w,h)/2, chroma_r半徑的取值范圍是0~min(cw/ch)/2
銳化
語法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的參數是可選的,默認值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩陣,取值范圍3-13,默認值為5
l_msize_y:垂直亮度矩陣,取值范圍3-13,默認值為5
l_amount:亮度強度,取值范圍-2.0-5.0,負數為模糊效果,默認值1.0
c_msize_x:水平色彩矩陣,取值范圍3-13,默認值5
c_msize_y:垂直色彩矩陣,取值范圍3-13,默認值5
c_amount:色彩強度,取值范圍-2.0-5.0,負數為模糊效果,默認值0.0
eg:
使用默認值,亮度矩陣為5x5和亮度值為1.0
ffmpeg -i input.mp4 -vf unsharp output.mp4
高斯模糊效果(比較強的模糊):
ffplay -i input.mp4 -vf unsharp=13:13:-2
語法:overlay[=x[:y]
所有的參數都是可選,默認值都是0
Logo在左上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
刪除logo
語法:-vf delogo=x:y:w:h[:t[:show]]
x:y 離左上角的坐標
w:h logo的寬和高
t: 矩形邊緣的厚度默認值4
show:若設置為1有一個綠色的矩形,默認值0.
ffplay -i ji.mp4 -vf delogo=50:51:60:60:100:0
語法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的參數值
x:離左上角的橫坐標
y: 離左上角的縱坐標
fontcolor:字體顏色
fontsize:字體大小
text:文本內容
textfile:文本文件
t:時間戳,單位秒
n:幀數開始位置為0
draw/enable:控制文件顯示,若值為0不顯示,1顯示,可以使用函數
1、在左上角添加Welcome文字
ffplay -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"
3、設置字體顏色和大小
ffplay -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"
動態文本
用 t (時間秒)變數實現動態文本
1、頂部水平滾動
ffplay -i ji.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t 50:fontcolor=darkorange:fontsize=30"
2、底部水平滾動
ffplay -i ji.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t 50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直從下往上滾動
ffplay ji.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30「
在右上角顯示當前時間 localtime
ffplay ji.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H:%M:%S}'「
每隔3秒顯示一次當前時間
ffplay ji.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H:%M:%S}':enable=lt(mod(t,3),1)"
FFmpeg支持絕大多數圖片處理, 除LJPEG(無損JPEG)之外,其他都能被解碼,除了EXR,PIC,PTX之外,所有的都能被編碼。
截取一張圖片使用 –ss(seek from start)參數.
ffmpeg -ss 01:23:45 -i ji.mp4 image.jpg
從視頻中生成GIF圖片
ffmpeg -i ji.mp4 -t 10 -pix_fmt rgb24 ji.gif
轉換視頻為圖片(每幀一張圖)
ffmpeg -i clip.avi frame%4d.jpg
圖片轉換為視頻
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4
和視頻一樣,圖片也可以被裁剪和填充
裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
和視頻一樣圖片同樣能翻轉,旋轉和覆蓋
翻轉
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋轉
ffmpeg -i -vf transpose=1 image_rotated.png
覆蓋
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png
屏幕錄像
顯示設備名稱
ffmpeg -list_devices 1 -f dshow -i mmy
調用攝像頭
ffplay -f dshow -i video="Integrated Camera"
保存為文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4
添加字幕subtitles
語法 –vf subtitles=file
ffmpeg -i ji.mp4 -vf subtitles=rgb.srt output.mp4
視頻顫抖、色彩平衡
視頻顫抖
ffplay –i ji.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2) sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2) sin(n/7)
色彩平衡
ffplay -i ji.mp4 -vf curves=vintage
色彩變幻
ffplay -i ji.mp4 -vf hue="H=2 PI t: s=sin(2 PI t)+1「
彩色轉換黑白
ffplay -i ji.mp4 -vf lutyuv="u=128:v=128"
設置音頻視頻播放速度
3倍視頻播放視頻
ffplay -i ji.mp4 -vf setpts=PTS/3
¾速度播放視頻
ffplay -i ji.mp4 -vf setpts=PTS/(3/4)
2倍速度播放音頻
ffplay -i speech.mp3 -af atempo=2
截圖
每隔一秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔20秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一張圖。
多張截圖合並到一個文件里(2x3) 每隔一千幀(秒數=1000/fps25)即40s截一張圖
ffmpeg -i ji.mp4 -frames 3 -vf "select=not(mod(n,1000)),scale=320:240,tile=2x3" out.png
本篇文章主要記錄ffmpeg的一些基礎指令操作,該資料的來源是源於網上的一個ppt文檔,感謝文檔的總結。
Ⅳ 在Java中怎樣把所有的視頻都轉換成flv格式
java調用ffmpeg執行視頻轉換
ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
對ffmpeg.exe無法解析的文件格式(wmv9,rm,rmvb等),
可以先用別的工具(mencoder)轉換為avi(ffmpeg能解析的)格式;
mencoder.exe;drv43260.dll;pncrt.dll這3個文件是為文件格式(wmv9,rm,rmvb等)
轉換為avi(ffmpeg能解析的)格式准備的;再把轉換好的avi文件再用ffmpeg.exe轉換成flv格式的視頻文件。。。
缺點: 要裝第三方東西
用jmf。編程以前,你需要安裝JMF。
而且 jmf 不支持 所有平台
Ⅵ ffmpeg基礎知識
ffmpeg是音視頻處理的c庫, 音視頻在網路傳輸過程中,由於數據量大,所有需要進行壓縮
壓縮目的為了去除冗餘信息,冗餘信息分為:
1、空間冗餘:圖像相鄰像素之間有較強的相關性
2、時間冗餘:視頻序列的相鄰圖像之間內容相似
3、 編碼冗餘:不同像素值出現的概率不同
4、 視覺冗餘:人的視覺系統對某些細節不敏感
5、知識冗餘:規律性的結構可由先驗知識和背景知識得到
● 無損壓縮(Winzip)
壓縮前解壓縮後圖像完全一致
壓縮比低
● 有損壓縮(H.264)
壓縮前解壓縮後圖像不一致
壓縮比高
利用人的視覺系統的特性(人眼能見的動畫頻率和圖像細節有限制)
音視頻壓縮其實就是對音視頻進行編碼,
視頻編碼格式
音頻編碼格式
封裝格式
流媒體協議
YUV ,是一種 顏色 編碼 方法。常使用在各個視頻處理組件中。 YUV在對照片或視頻編碼時,考慮到人類的感知能力,允許降低色度的帶寬。
YUV是編譯true-color顏色空間(colorspace)的種類,Y'UV,YUV, YCbCr , YPbPr 等專有名詞都可以稱為YUV,彼此有重疊。「Y」表示 明亮度 (Luminance、Luma),「U」和「V」則是**[色度]
YUV格式有兩大類:(平面格式)planar和(打包格式)packed。
1.planar:先存儲Y,然後U,然後V
2.packed:yuv交叉存儲
還有我們常說的YUV420sp與YUV420p。
YUV420sp: 一種two-plane模式,即Y和UV分為兩個平面,U、V交錯排列。
YUV420p: 先把U存放完後,再存放V。UV是連續的。
YUV420的數據大小為: 亮度(行×列) + V(行×列/4) + U(行×列/4)即:W H 3/2,
普遍的編碼器都以接受planar的I420數據(YUV420P)
4*4的I420數據排列如下:
y1 y2 y3 y4
y5 y6 y7 y8
y9 y10 y11 y12
y13 y14 y15 y16
u1 u2 u3 u4
v1 v2 v3 v4
Android相機的採集的視頻是NV21(YUV420sP), 也是YUV的格式 只不過U和V的交叉的。
y1 y2 y3 y4
y5 y6 y7 y8
y9 y10 y11 y12
y13 y14 y15 y16
u1 v1 u2 v2
u3 v3 u4 v4
在採集相機數據時需要把UV數據給轉換成上面的 順序。
I frame :幀內編碼幀 ,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術)的第一個幀,經過適度地壓縮,做為隨機訪問的參考點,可以當成圖象。I幀可以看成是一個圖像經過壓縮後的產物。
P frame: 前向預測編碼幀,通過充分將低於圖像序列中前面已編碼幀的時間冗餘信息來壓縮傳輸數據量的編碼圖像,也叫預測幀;
B frame: 雙向預測內插編碼幀 ,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列後面已編碼幀之間的時間冗餘信息來壓縮傳輸數據量的編碼圖像,也叫雙向預測幀;
I frame:自身可以通過視頻解壓演算法解壓成一張單獨的完整的圖片。
P frame:需要參考其前面的一個I frame 或者B frame來生成一張完整的圖片。
B frame:則要參考其前一個I或者P幀及其後面的一個P幀來生成一張完整的圖片。
PTS:Presentation Time Stamp。PTS主要用於度量解碼後的視頻幀什麼時候被顯示出來
DTS:Decode Time Stamp。DTS主要是標識讀入內存中的幀數據在什麼時候開始送入解碼器中進行解碼。
在沒有B幀存在的情況下DTS的順序和PTS的順序應該是一樣的。
DTS主要用於視頻的解碼,在解碼階段使用。PTS主要用於視頻的同步和輸出.在顯示的時候使用。
如上圖:I frame 的解碼不依賴於任何的其它的幀.而p frame的解碼則依賴於其前面的I frame或者P frame.B frame的解碼則依賴於其前的最近的一個I frame或者P frame 及其後的最近的一個P frame.
libavformat
用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;音視頻的格式解析協議,為 libavcodec 分析碼流提供獨立的音頻或視頻碼流源。
libavcodec
用於各種類型聲音/圖像編解碼;該庫是音視頻編解碼核心,實現了市面上可見的絕大部分解碼器的功能,libavcodec 庫被其他各大解碼器 ffdshow,Mplayer 等所包含或應用。
libavfilter
filter(FileIO、FPS、DrawText)音視頻濾波器的開發,如水印、倍速播放等。
libavutil
包含一些公共的工具函數的使用庫,包括算數運算 字元操作;
libswresample
原始音頻格式轉碼。
libswscale
(原始視頻格式轉換)用於視頻場景比例縮放、色彩映射轉換;圖像顏色空間或格式轉換,如 rgb565,rgb888 等與 yuv420 等之間轉換。
音視頻解5封裝流程:
ffmpeg解碼流程: