成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何在Android中壓縮視頻-創(chuàng)新互聯(lián)

如何在Android中壓縮視頻?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為瑪曲企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站瑪曲網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

使用方法

基本原理:將android環(huán)境下可執(zhí)行文件ffmpeg存放在本地,代碼執(zhí)行ffmpeg的壓縮命令。

//將開(kāi)源庫(kù)中asset目錄的ffmpeg可執(zhí)行文件,拷貝到 app的data/data/files目錄

FFmpeg.getInstance(this).loadBinary(null);

執(zhí)行ffmpeg的一個(gè)命令:比如查看ffmpeg的當(dāng)前版本:./ffmpeg -version

如何在Android中壓縮視頻

接著就可以在代碼中,使用ffmpeg的各種命令了:把命令寫(xiě)入String[],然后調(diào)用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(){});

參數(shù)解釋:

  1. -threads: 執(zhí)行線程數(shù),傳入1 單線程壓縮

  2. -i:input路徑,傳入視頻文件的路徑

  3. -c:v:編碼格式,一般都是指定libx264

  4. -crf: 編碼質(zhì)量,取值范圍是0-51,默認(rèn)值為23,數(shù)字越小輸出視頻的質(zhì)量越高。這里的30是我們經(jīng)過(guò)測(cè)試得到的經(jīng)驗(yàn)值

  5. -preset:轉(zhuǎn)碼速度,ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast編碼速度最快,但壓縮率低,生成的文件更大,placebo則正好相反。x264所取的默認(rèn)值為medium。需要說(shuō)明的是,preset主要是影響編碼的速度,并不會(huì)很大的影響編碼出來(lái)的結(jié)果的質(zhì)量。

  6. -acodec:音頻編碼,一般采用libmp3lame

  7. arg.thumbVideoPath:最后傳入的是視頻壓縮后保存的路徑

  8. -y:輸出時(shí)覆蓋輸出目錄已存在的同名文件(如果不加此參數(shù),就不會(huì)覆蓋)

問(wèn)題解決

此開(kāi)源庫(kù)用于視頻壓縮在實(shí)際開(kāi)發(fā)中存在不少問(wèn)題,下面一一解決

1.壓縮進(jìn)度反饋

執(zhí)行轉(zhuǎn)碼命令后,onProgress只是不停輸出字符串,而且文本很長(zhǎng) 需要正則表達(dá)式從中截取轉(zhuǎn)碼進(jìn)度反饋:

@Override
        public void onProgress(String s) {
          Pattern timePattern = Pattern.compile("(?<=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;
              }
              notify.compressProgress(getTag(),showProgress);
            }
          }
        }

2.低碼率視頻壓縮會(huì)變大

實(shí)際中發(fā)現(xiàn)有些原質(zhì)量較差的視頻壓縮后,體積反而變大。

處理方法:壓縮前先執(zhí)行對(duì)視頻提取信息的命令,小于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);//執(zhí)行壓縮
                }else {
                  //放棄壓縮,直接使用原文件
                }
              }catch (Exception e){
              }
            }
          }
        }

并且在壓縮成功后,檢查壓縮后的文件和原文件大小,如果變大了,直接使用原文件。

3.多線程壓縮多個(gè)視頻

開(kāi)源庫(kù)中執(zhí)行ffmpeg的命令是在AsycTask執(zhí)行的:

ffmpegExecuteAsyncTask = new FFmpegExecuteAsyncTask(command , timeout, ffmpegExecuteResponseHandler);
ffmpegExecuteAsyncTask.execute();

execute 方法在api 11之后是串行方法,就是說(shuō)開(kāi)源庫(kù)已經(jīng)限制為單線程。

改為:ffmpegExecuteAsyncTask.executeOnExecutor(Executors.newCachedThreadPool()); 可以使用多線程

測(cè)試中發(fā)現(xiàn)多個(gè)視頻同時(shí)壓縮,手機(jī)會(huì)嚴(yán)重發(fā)熱,強(qiáng)烈建議采用原設(shè)計(jì) 。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

當(dāng)前名稱:如何在Android中壓縮視頻-創(chuàng)新互聯(lián)
新聞來(lái)源:http://jinyejixie.com/article32/ceodsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、品牌網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站排名、網(wǎng)站收錄、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
乐清市| 三明市| 霍林郭勒市| 承德县| 漳浦县| 乐东| 忻州市| 大兴区| 昭平县| 甘泉县| 玉田县| 平阴县| 桐梓县| 肃北| 绥芬河市| 防城港市| 蒲城县| 清河县| 河西区| 毕节市| 宁乡县| 新巴尔虎左旗| 新丰县| 姜堰市| 黔江区| 林口县| 布尔津县| 始兴县| 会宁县| 乃东县| 满洲里市| 错那县| 马公市| 建湖县| 阜康市| 建昌县| 新龙县| 台南市| 唐海县| 许昌市| 九江市|