簡體   English   中英

FFMPEG輸出文件不包含任何流[Android]視頻concat

[英]FFMPEG output file does not contain any stream [Android] video concat

我一直試圖合並(連接)兩個相同高度和寬度的mp4視頻但發生了一些錯誤。 它說輸出文件沒有任何流。 請幫忙。 代碼如下:

String[] arg = new String[]{
                ActualVideoFile.getAbsolutePath(), path
        };
        String list = generateList(arg);
        String[] command = new String[]{
                " -f concat -i " + list + " -c:v copy " + mergedVideo.getAbsolutePath()
        };
        try {
            ffmpeg.execute(command, new FFmpegExecuteResponseHandler() {
                @Override
                public void onSuccess(String message) {
                    Log.e("SUCCESS", message);
                }

                @Override
                public void onProgress(String message) {
                    Log.e("onProgress", message);
                }

                @Override
                public void onFailure(String message) {
                    Log.e("onFailure", message);
                }

                @Override
                public void onStart() {
                    Log.e("onStart", "start");
                }

                @Override
                public void onFinish() {
                    Log.e("FINISH", "FINISHED");

                }
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            e.printStackTrace();
        }

logcat的:

E/onFailure: ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
                                                            built with gcc 4.8 (GCC)
                                                            configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
                                                            libavutil      55. 17.103 / 55. 17.103
                                                            libavcodec     57. 24.102 / 57. 24.102
                                                            libavformat    57. 25.100 / 57. 25.100
                                                            libavdevice    57.  0.101 / 57.  0.101
                                                            libavfilter     6. 31.100 /  6. 31.100
                                                            libswscale      4.  0.100 /  4.  0.100
                                                            libswresample   2.  0.101 /  2.  0.101
                                                            libpostproc    54.  0.100 / 54.  0.100
                                                          Output #0, mp4, to ' -f concat -i /data/data/com.myapp/cache/ffmpeg-list-768575373.txt -c:v copy /storage/emulated/0/myapp/MergedVideos/1465426928071_Video.mp4':
                                                          Output file #0 does not contain any stream

任何幫助將不勝感激謝謝

這是我的完整代碼片段。我正在為視頻添加圖片疊加層。 為了測試,我將視頻和圖像保存在assets文件夾中

    File myDirectory = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/");
    File outputDirectory = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/video" + System.currentTimeMillis() + ".mp4");



    Log.d("directory path",Environment.getExternalStorageDirectory() + "/EditedVideo_2/");


    if (!myDirectory.exists())
    {
        myDirectory.mkdirs();
    }

    File f = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/sample.mp4");
    if (!f.exists()) try
    {

        InputStream is = getAssets().open("sample.mp4");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();


        FileOutputStream fos = new FileOutputStream(f);
        fos.write(buffer);
        fos.close();
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }


    Log.d("Path = ",f.getPath());



   File imageFile = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/ic_launcher.png");
    if (!imageFile.exists()) try
    {

        InputStream is = getAssets().open("ic_launcher.png");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();


        FileOutputStream fos = new FileOutputStream(imageFile);
        fos.write(buffer);
        fos.close();
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }




    FFmpeg ffmpeg = FFmpeg.getInstance(this);


    try {
        ffmpeg.loadBinary(new LoadBinaryResponseHandler()
        {

            @Override
            public void onStart()
            {
                Log.d("Event ","onStart");
            }

            @Override
            public void onFailure()
            {
                Log.d("Event ","onFailure");
            }

            @Override
            public void onSuccess()
            {
                Log.d("Event ","onSuccess");
            }

            @Override
            public void onFinish()
            {
                Log.d("Event ","onFinish");
            }
        });
    } catch (FFmpegNotSupportedException e) {
        // Handle if FFmpeg is not supported by device
    }





    try {
        // to execute "ffmpeg -version" command you just need to pass "-version"
        //String[] cmd = {"-version"};



        String[] cmd = {"-i",""+f.getPath(),"-i",""+imageFile.getPath(),"-filter_complex","overlay=10:main_h-overlay_h-10",outputDirectory.getPath()};
        ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler()
        {

            @Override
            public void onStart()
            {
                Log.d("Event ","onStart");
            }

            @Override
            public void onProgress(String message)
            {
                Log.d("Event ","onProgress - "+message);

            }

            @Override
            public void onFailure(String message)
            {
                Log.d("Event ","onFailure - "+message);
            }

            @Override
            public void onSuccess(String message)
            {
                Log.d("Event ","onSuccess - "+message);
            }

            @Override
            public void onFinish()
            {
                Log.d("Event ","onFinish");
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // Handle if FFmpeg is already running
    }

有同樣的問題。 原來它是命令的構建方式。

這是不正確的,因為您需要分割每個命令:

String[] command = new String[]{" -f concat -i " + list + " -c:v copy " + mergedVideo.getAbsolutePath();

Chirag您的回答是:

String[] cmd = {"-i",""+f.getPath(),"-i",""+imageFile.getPath(),"-filter_complex","overlay=10:main_h-overlay_h-10",outputDirectory.getPath()};

希望這可以幫助。

暫無
暫無

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

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