簡體   English   中英

Android使用FFMPEG合並兩個具有不同(大小,編解碼器,幀,長寬比)的視頻

[英]Android Merging two video with different (sizes,codec,frames,aspect raito) using FFMPEG

我正在制作一個應用程序,該應用程序可以合並從另一個活動中獲取的兩個或兩個以上的視頻文件。 選擇文件后,我們將文件傳遞到另一個發生合並的活動。 我已經按照以下鏈接進行了操作: AndroidWarZone FFMPEG

在這里,我找到了如何僅合並具有不同質量的兩個文件的方法。 命令如下:

String[] complexCommand = {"ffmpeg","-y","-i","/storage/emulated/0/videokit/sample.mp4",
"-i","/storage/emulated/0/videokit/in.mp4","-strict","experimental",
"-filter_complex",
"[0:v]scale=640x480,setsar=1:1[v0];[1:v]scale=640x480,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
"-ab","48000","-ac","2","-ar","22050","-s","640x480","-r","30","-vcodec","mpeg4","-b","2097k","/storage/emulated/0/vk2_out/out.mp4"}

由於我要在數組中選擇要播放的視頻,並將其傳遞到下一頁,因此我在命令中做了一些更改,例如:

private void mergeVideos() {
    String savingPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/video.mp4";

    ArrayList<File> fileList = mList;

    List<String> filenames = new ArrayList<String>();

    for (int i = 0; i < fileList.size(); i++) {
        filenames.add("-i");
        filenames.add(fileList.get(i).toString());
    }

    Log.e("Log===",filenames.toString());

    String joined = TextUtils.join(", ",filenames);

    Log.e("Joined====",joined);

    String complexCommand[] = {"-y", joined,
            "-filter_complex",
            "[0:v]scale=640x480,setsar=1:1[v0];[1:v]scale=640x480,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
            "-ab","48000","-ac","2","-ar","22050","-s","640x480","-r","30","-vcodec","mpeg4","-b","2097k", savingPath};
    Log.e("RESULT====",Arrays.toString(complexCommand));

   execFFmpegBinary(complexCommand);  }

在日志中,這是我得到的輸出:

這是我在mList中添加的接收數據的

E/RECEIVED DATA=====: [/mnt/m_external_sd/DCIM/Camera/VID_31610130_011933_454.mp4, /mnt/m_external_sd/DCIM/Camera/VID_23120824_054526_878.mp4]
E/RESULT====: [-y, -i, /mnt/m_external_sd/DCIM/Camera/VID_31610130_011933_454.mp4, -i, /mnt/m_external_sd/DCIM/Camera/VID_23120824_054526_878.mp4, -filter_complex, [0:v]scale=640x480,setsar=1:1[v0];[1:v]scale=640x480,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1, -ab, 48000, -ac, 2, -ar, 22050, -s, 640x480, -r, 30, -vcodec, mpeg4, -b, 2097k, /storage/emulated/0/video.mp4]

在這里,結果是在exeFFMPEGBinary()內部運行但無法正常工作的complexCommand

這是我的exceFFMPEGBinary()

private void execFFmpegBinary(final String[] combine) {
    try{
    fFmpeg.execute(combine, new ExecuteBinaryResponseHandler() {
        @Override
        public void onFailure(String s) {
            Log.d("", "FAILED with output : " + s);
        }

        @Override
        public void onSuccess(String s) {
            Log.d("", "SUCCESS with output : " + s);
            Toast.makeText(getApplicationContext(),"Success!",Toast.LENGTH_SHORT)
                    .show();
        }

        @Override
        public void onProgress(String s) {
            Log.d("", "progress : " + s);
        }

        @Override
        public void onStart() {
            progressDialog.setMessage("Processing...");
            progressDialog.show();
        }

        @Override
        public void onFinish() {
            progressDialog.dismiss();
        }
    });
} catch (FFmpegCommandAlreadyRunningException e) {
    // do nothing for now
}
}

我已經完成並運行了我的項目,現在的問題是它沒有合並/連接任何東西,只有一秒鍾的ProgressDialog出現了,而我所得到的只是我的日志中的內容:

E/FFMPEG====: ffmpef : coorect loaded

這意味着ffmpeg正在加載,並且什么也沒有實現。 我沒有任何有關onFailur,onSuccess(),onStart()的日志。

任何建議都可以幫助我實現自己的目標。 謝謝。

注意:我已經使用Mp4Parser完成了合並,但是里面有一個小故障,它需要具有相同規格的文件。 所以這不是我的要求。

編輯

我進行了更多研究,並將其連接起來,但這也不起作用,這是鏈接: 連接兩個文件

我也從以下鏈接找到了這些東西: FFMPEG合並/連接 ,發現他的代碼段工作正常。 但不是我的。

我也使用了該命令,但是它不起作用,也沒有給我任何日志結果。 FFMPEG加載除外。

這是命令:

complexCommand = new String[]{"-y", "-i", file1.toString(), "-i", file2.toString(), "-strict", "experimental", "-filter_complex",
            "[0:v]scale=1920x1080,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1","-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264","-crf","27","-q","4","-preset", "ultrafast", rootPath + "/output.mp4"};

請首先使用該演示,確保它在您的設備上運行。 如果是這樣,請從博客中獲取merge命令,並在演示中使用它。 現在,在您的應用程序中嘗試一個簡單命令,如果可行,請嘗試合並命令。 如果以上任何步驟失敗,請直接與我聯系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM