android - 打开输出流编码器时出错 #0 :0 for Creating Video from image, Gif,music

标签 android android-studio ffmpeg

我正在尝试从图像、gif 和音乐创建视频。

这是我使用的代码:

{"-y", "-i", imagepath, "-ignore_loop", "0", "-i", gif, "-filter_complex", "[1:v]scale=" + filterdBitmap.getWidth() + ":" + filterdBitmap.getHeight() + "[ovrl];[0:v][ovrl]overlay=0:0", "-ss", "" + startMs / 1000, "-t", "" + endMs / 1000, "-i", songpath, "-c:v", "libx264", "-preset", "ultrafast", "-r", "30", "-pix_fmt", "yuva420p", "-c:a", "aac", "-shortest", outputLocation.getPath()};

我收到的错误是这样的:
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

具体来说,这是完整的回复:
2020-02-29 10:16:01.043 14913-14913/com.photocreator E/fail: 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
    Input #0, png_pipe, from 'file:///storage/emulated/0/1582951553006.jpg':
      Duration: N/A, bitrate: N/A
        Stream #0:0: Video: png, rgba(pc), 639x812, 25 tbr, 25 tbn, 25 tbc
    Input #1, gif, from 'http://13.232.145.224:3003/getpath/video_maker/new/35.gif':
      Duration: N/A, bitrate: N/A
        Stream #1:0: Video: gif, bgra, 288x480, 15 fps, 15 tbr, 100 tbn, 100 tbc
    [mp3 @ 0xaea97200] Skipping 0 bytes of junk at 253.
    Input #2, mp3, from '/storage/emulated/0/Download/supnaringtone-49332.mp3':
      Metadata:
        encoder         : Lavf58.20.100
      Duration: 00:00:21.76, start: 0.025057, bitrate: 64 kb/s
        Stream #2:0: Audio: mp3, 44100 Hz, stereo, s16p, 64 kb/s
        Metadata:
          encoder         : Lavc58.35
    Incompatible pixel format 'yuva420p' for codec 'libx264', auto-selecting format 'yuv420p'
    [libx264 @ 0xaeacfc00] width not divisible by 2 (639x812)
    Output #0, mp4, to '/storage/emulated/0/allkotlin/video/movie_1582951554388.mp4':
        Stream #0:0: Video: h264, none, q=2-31, 128 kb/s, 30 fps (default)
        Metadata:
          encoder         : Lavc57.24.102 libx264
        Stream #0:1: Audio: aac, 0 channels, 128 kb/s
        Metadata:
          encoder         : Lavc57.24.102 aac
    Stream mapping:
      Stream #0:0 (png) -> overlay:main (graph 0)
      Stream #1:0 (gif) -> scale (graph 0)
      overlay (graph 0) -> Stream #0:0 (libx264)
      Stream #2:0 -> #0:1 (mp3 (native) -> aac (native))
    Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

如果我使用 -s 560x560 ,效果很好,但我不能继续使用我的纵横比:

这是我的代码:
public class PhotoEditing extends AppCompatActivity implements GetGifAdapter.GlideInterface, SdCardSongAdapter.MediaInterface
        , FiltersListFragmentListener, EmojiFragmentListener, AddTextFragmentListener {

    public static final String FILE_PROVIDER_AUTHORITY = "com.burhanrashid52.photoeditor.fileprovider";
    @Nullable
    @VisibleForTesting
    Uri mSaveImageUri;
    PhotoEditorView image_preview;
    ImageView image_gif/*,image_preview*/;
    ImageView save, back;
    LinearLayout linearLayout;
    public String sessionId, sessionId1;
    Uri image_selected_uri;

    public Bitmap originalBitmap, filterdBitmap, finalBitmap;
    LinearLayout btn_music_list, btn_music_cut, btn_add_gif, btn_filters_list, btn_emoji, btn_add_text;
    MediaPlayer mediaPlayer;
    String mediaData;
    LinearLayout relativeLayout;
    RelativeLayout seekbar_layout, fm;
    RelativeLayout.LayoutParams layoutparam;
    RangeSeekBar rangeSeekBar;
    Runnable r;
    Handler mHandler;
    private int duration;
    private TextView tvLeft, tvRight;
    RelativeLayout rl_replace, music_fragment;
    FilterListFragment filterListFragment;
    EmojiFragment emojiFragment;
    PhotoEditor photoEditor;
    int screenWidth, screenHeight;
    Bitmap bitmap;
    int brightnessFinal = 0;
    int saturationFinal = 0;
    int constrantFinal = 0;
    int hue = 0;
    String glideData;
    FFmpeg ffmpeg;
    String s;
    String imageHeight;
    String imageWidth ;


    private static final String TAG = "BRIJESH";

    Context context = this;

    static {
        System.loadLibrary("NativeImageProcessor");
    }

    public Bitmap resizeImageToNewSize(Bitmap bitmap, int i, int i2) {
        try {
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            float f = (float) i;
            float f2 = (float) i2;
            if (!(height == i2 && width == i)) {
                float f3 = (float) width;
                float f4 = f / f3;
                float f5 = (float) height;
                float f6 = f2 / f5;
                if (f4 < f6) {
                    f6 = f4;
                }
                f = f3 * f6;
                f2 = f5 * f6;
            }
            Bitmap bitmap1 = Bitmap.createScaledBitmap(bitmap, (int) f, (int) f2, true);
            fm.removeView(image_preview);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(bitmap1.getWidth(), bitmap1.getHeight());

            params.addRule(RelativeLayout.CENTER_HORIZONTAL);
            image_preview.setLayoutParams(params);

            fm.addView(image_preview);
            return bitmap1;
        } catch (Exception unused) {
            fm.removeView(image_preview);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(200, 100);

            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            image_preview.setLayoutParams(params);
            fm.addView(image_preview);

            return bitmap;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photo_editing);

        initialize(this);
        image_preview = findViewById(R.id.image_preview);
        image_preview.getSource().setScaleType(ImageView.ScaleType.FIT_XY);
        photoEditor = new PhotoEditor.Builder(this, image_preview)
                .setPinchTextScalable(true)
                .build();
        image_gif = findViewById(R.id.image_gif);
        linearLayout = findViewById(R.id.linearLayout);
        btn_music_list = findViewById(R.id.btn_music_list);
//        btn_music_cut = findViewById(R.id.btn_music_cut);
        btn_add_gif = findViewById(R.id.btn_add_gif);
        btn_filters_list = findViewById(R.id.btn_filters_list);
        btn_emoji = findViewById(R.id.btn_emoji);
        btn_add_text = findViewById(R.id.btn_add_text);
        fm = findViewById(R.id.frame);
        rl_replace = findViewById(R.id.replace_fragment);
        music_fragment = findViewById(R.id.music_fragment);
        seekbar_layout = findViewById(R.id.seekbar_layout);
        rangeSeekBar = findViewById(R.id.rangeSeekBar);
        rangeSeekBar.setNotifyWhileDragging(true);
        mHandler = new Handler();
        tvLeft = findViewById(R.id.tvLeft);
        tvRight = findViewById(R.id.tvRight);
        relativeLayout = findViewById(R.id.relativeLayout);
        save = findViewById(R.id.btndone);
        back = findViewById(R.id.btnhome);
        mediaPlayer = new MediaPlayer();
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                    onBackPressed();
                } else onBackPressed();
            }
        });

        sessionId1 = getIntent().getStringExtra("gallary");
        sessionId = getPathFromUri(PhotoEditing.this, Uri.parse(sessionId1));
        image_selected_uri = Uri.parse(sessionId);
        loadImage();

        btn_music_list.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                if (seekbar_layout.getVisibility() == View.GONE){
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                }
                MusicListFragment musicListFragment = new MusicListFragment();
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.replace_fragment, musicListFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                seekbar_layout.setVisibility(View.VISIBLE);

//                }
//                else if (seekbar_layout.getVisibility() == View.VISIBLE) {
//                    seekbar_layout.setVisibility(View.GONE);
//                }
            }
        });

//        btn_music_cut.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                if (seekbar_layout.getVisibility() == View.GONE) {
//                    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
//                        seekbar_layout.setVisibility(View.VISIBLE);
//                    }
//                } else if (seekbar_layout.getVisibility() == View.VISIBLE) {
//                    seekbar_layout.setVisibility(View.GONE);
//                }
//            }
//        });

        btn_add_gif.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                GIfFragment gIfFragment = new GIfFragment();
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.replace_fragment, gIfFragment);
                transaction.addToBackStack(null);
                transaction.commit();
            }
        });



        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                image_preview.getSource().setDrawingCacheEnabled(true);
//                Bitmap b = image_preview.getSource().getDrawingCache();
//                MediaStore.Images.Media.insertImage(context.getContentResolver(), b,"", "");
                saveImageToGallery();

            }
        });
    }

    private void loadImage() {
        bitmap = BitmapFactory.decodeFile(image_selected_uri.toString());
        originalBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        originalBitmap = modifyOrientation(originalBitmap, sessionId);
        finalBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true);
        filterdBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int f3672y = displayMetrics.widthPixels;
        int f3673z = displayMetrics.heightPixels;
        float f = getResources().getDisplayMetrics().density;
        int i = f3672y - ((int) (40.0f * f));
        int i2 = f3673z - ((int) (f * 100.0f));
        image_preview.getSource().setImageBitmap(resizeImageToNewSize(bitmap, i, i2));
    }

    private void getDropboxIMGSize(Uri uri){

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(new File(uri.getPath()).getAbsolutePath(), options);
        imageHeight= String.valueOf(options.outHeight);
        imageWidth = String.valueOf(options.outWidth);

    }

    @SuppressLint("MissingPermission")
    private void saveImageToGallery() {
        File file = new File(Environment.getExternalStorageDirectory()
                + File.separator + ""
                + System.currentTimeMillis() + ".jpg");
        try {
            file.createNewFile();

            SaveSettings saveSettings = new SaveSettings.Builder()
                    .setClearViewsEnabled(true)
                    .setTransparencyEnabled(true)
                    .build();

            photoEditor.saveAsFile(file.getAbsolutePath(), saveSettings, new PhotoEditor.OnSaveListener() {
                @Override
                public void onSuccess(@NonNull String imagePath) {
                    Toast.makeText(context, "Image Saved", Toast.LENGTH_SHORT).show();

                    mSaveImageUri = Uri.fromFile(new File(imagePath));
                    getDropboxIMGSize(mSaveImageUri);
                    executeCmd(String.valueOf(mSaveImageUri), mediaData, glideData, rangeSeekBar.getSelectedMinValue().intValue() * 1000, rangeSeekBar.getSelectedMaxValue().intValue() * 1000);

                }

                @Override
                public void onFailure(@NonNull Exception exception) {
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private void executeCmd(String imagepath, String songpath, String gif, int startMs, int endMs) {
        File outputLocation = getConvertedFile(outputPath() + "video", "movie_" + System.currentTimeMillis() + ".mp4");
        Log.e("videofilepath", songpath);
        String[] complexCommand = {"-y", "-i", imagepath,
                "-ignore_loop", "0",
                "-i", gif, "-filter_complex", "[1:v]scale=w='bitand(iw,65534)':h='bitand(ih,65534)' [ovrl];[0:v][ovrl]overlay=0:0",
                "-ss", "" + startMs / 1000, "-t", "" + endMs / 1000, "-i", songpath,
                "-c:v", "libx264", "-preset", "ultrafast", "-r", "30", "-pix_fmt", "yuva420p", "-c:a", "aac", "-shortest", outputLocation.getPath()};

        try {
            ffmpeg.execute(complexCommand, new ExecuteBinaryResponseHandler() {

                @Override
                public void onSuccess(String s) {
                    Log.e("onSuccess", s);
                }

                @Override
                public void onFailure(String s) {
                    Log.e("fail", s);
                }
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            Log.e("catch", e.getMessage());
        }
    }
}

知道这里发生了什么吗?谢谢!

最佳答案

正如错误消息所说,width not divisible by 2 (639x812) .添加比例过滤器以使流尺寸均匀,例如叠加后,
[0:v][ovrl]overlay=0:0,scale=w='bitand(iw,65534)':h='bitand(ih,65534)'

关于android - 打开输出流编码器时出错 #0 :0 for Creating Video from image, Gif,music,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60462126/

相关文章:

android - 在 Android Studio 中为多个模块添加依赖

android - 如何在Android中将一个 fragment 分成两种颜色

ffmpeg - 有没有办法在 ffprobe 中指定解码器

ffmpeg - 将 PCM 音频复用到 WMA 会显着增加文件大小

java - 如何创建从今天起 X 天结束的 Android 日历事件

android - 透明状态栏不能正常工作

java - 如何舍入数学方程式的答案

android - 在 Android Studio 的 Android 项目中运行快速 JUnit 测试的最佳方式

java - 从 Android 联系人列表中的联系人获取家庭位置?

php - 正则表达式:从 FFMPEG 日志中获取 FPS