【移動應用開發技術】如何在Android中壓縮視頻_第1頁
【移動應用開發技術】如何在Android中壓縮視頻_第2頁
【移動應用開發技術】如何在Android中壓縮視頻_第3頁
【移動應用開發技術】如何在Android中壓縮視頻_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發技術】如何在Android中壓縮視頻

如何在Android中壓縮視頻?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面在下將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。使用方法基本原理:將android環境下可執行文件ffmpeg存放在本地,代碼執行ffmpeg的壓縮命令。//將開源庫中asset目錄的ffmpeg可執行文件,拷貝到

app的data/data/files目錄

FFmpeg.getInstance(this).loadBinary(null);執行ffmpeg的一個命令:比如查看ffmpeg的當前版本:./ffmpeg-version接著就可以在代碼中,使用ffmpeg的各種命令了:把命令寫入String[],然后調用fFmpeg.execute即可獲取視頻文件的信息String[]

command

=

new

String[]{"-i",

arg.filePath};

try

{

fFmpeg.execute(commands,

new

ExecuteBinaryResponseHandler(){

@Override

public

void

onStart()

{}

@Override

public

void

onProgress(String

message)

{

Log.e("dml",

"onProgress:

message

is

"

+

message);

}

@Override

public

void

onFailure(String

message)

{

Log.e("dml",

"onFailure:

message

is

"

+

message);

}

@Override

public

void

onSuccess(String

message)

{

Log.e("dml",

"onSuccess:

message

is

"

+

message);

}

@Override

public

void

onFinish()

{

Log.e("dml",

"onFinish:

");

}

});

}

catch

(FFmpegCommandAlreadyRunningException

e)

{

e.printStackTrace();

}壓縮視頻:String[]

commands

=

new

String[]{"-threads","1","-i",

arg.filePath,

"-c:v",

"libx264","-crf","30","-preset",

"superfast"

,"-y",

"-acodec","libmp3lame",arg.thumbVideoPath};

fFmpeg.execute(commands,

new

ExecuteBinaryResponseHandler(){});參數解釋:-threads:執行線程數,傳入1單線程壓縮-i:input路徑,傳入視頻文件的路徑-c:v:編碼格式,一般都是指定libx264-crf:編碼質量,取值范圍是0-51,默認值為23,數字越小輸出視頻的質量越高。這里的30是我們經過測試得到的經驗值-preset:轉碼速度,ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast編碼速度最快,但壓縮率低,生成的文件更大,placebo則正好相反。x264所取的默認值為medium。需要說明的是,preset主要是影響編碼的速度,并不會很大的影響編碼出來的結果的質量。-acodec:音頻編碼,一般采用libmp3lamearg.thumbVideoPath:最后傳入的是視頻壓縮后保存的路徑-y:輸出時覆蓋輸出目錄已存在的同名文件(如果不加此參數,就不會覆蓋)問題解決此開源庫用于視頻壓縮在實際開發中存在不少問題,下面一一解決1.壓縮進度反饋執行轉碼命令后,onProgress只是不停輸出字符串,而且文本很長需要正則表達式從中截取轉碼進度反饋:@Override

public

void

onProgress(String

s)

{

Pattern

timePattern

=

Ppile("(?<=time=)[\\d:.]*");

Scanner

sc

=

new

Scanner(s);

String

match

=

sc.findWithinHorizon(timePattern,

0);

if

(match

!=

null)

{

String[]

matchSplit

=

match.split(":");

if

(duration!=

0)

{

float

progress

=

(Integer.parseInt(matchSplit[0])

*

3600

+

Integer.parseInt(matchSplit[1])

*

60

+

Float.parseFloat(matchSplit[2]))

/

duration;

int

showProgress

=

(int)

(progress

*

100);

if(showProgress>100){

showProgress

=

100;

}

pressProgress(getTag(),showProgress);

}

}

}2.低碼率視頻壓縮會變大實際中發現有些原質量較差的視頻壓縮后,體積反而變大。處理方法:壓縮前先執行對視頻提取信息的命令,小于1024kb/s的視頻不壓縮:@Override

public

void

onProgress(String

s)

{

//Log.d("dml","pre

onProgress

=

"

+

s);

if(s.contains("Stream

#0:0")){

String

tem

=

s.substring(0,

s.indexOf("kb/s"));

String

type

;

int

pos

=

tem.lastIndexOf(",");

if

(pos

!=

-1)

{

type

=

tem.substring(pos

+

1,tem.length()).trim();

try

{

Integer

integer

=

Integer.parseInt(type);

if(integer

>

1024){

pressV(fFmpeg);//執行壓縮

}else

{

//放棄壓縮,直接使用原文件

}

}catch

(Exception

e){

}

}

}

}并且在壓縮成功后,檢查壓縮后的文件和原文件大小,如果變大了,直接使用原文件。3.多線程壓縮多個視頻開源庫中執行ffmpeg的命令是在AsycTask執行的:ffmpegExecuteAsyncTask

=

new

FFmpegExecuteAsyncTask(command

,

timeout,

ffmpegExecuteResponseHandler);

f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論