You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中使用JCodec生成的output.mp4绝对路径咨询

Android中用JCodec通过内存Bitmap生成视频(解决路径困惑)

嘿,我来帮你搞定这个JCodec生成视频的路径问题!你已经把图片加载到内存Bitmap数组里了,核心困惑应该是输出视频该存在哪里、怎么正确获取这个路径对吧?下面我给你一步步捋清楚:

一、先搞懂Android的存储路径选择

Android里存储分两种,选哪种看你的需求:

  • 内部存储(无需权限):只有你的APP能访问,卸载APP会自动删除,适合临时视频或者仅APP内使用的内容
  • 外部存储(需要权限):用户可以通过文件管理器看到,需要在AndroidManifest.xml中申请读写权限(Android 6.0以上还要动态申请)

二、完整代码实现

我把你的代码补全,同时帮你处理路径问题,直接能用:

import org.jcodec.api.awt.AWTSequenceEncoder;
import org.jcodec.common.NIOUtils;
import org.jcodec.common.SeekableByteChannel;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

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

        // 1. 加载内存中的Bitmap数组
        Bitmap[] bitmaps = new Bitmap[3];
        bitmaps[0] = BitmapFactory.decodeResource(getResources(), R.raw.raw1);
        bitmaps[1] = BitmapFactory.decodeResource(getResources(), R.raw.raw2);
        bitmaps[2] = BitmapFactory.decodeResource(getResources(), R.raw.raw3);

        // 2. 选择输出路径(这里给两种选项,选一个就行)
        // 选项1:内部存储路径
        File outputFile = new File(getFilesDir(), "output_video.mp4");
        // 选项2:外部存储公共图片目录(记得处理权限!)
        // File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "output_video.mp4");

        SeekableByteChannel out = null;
        try {
            // 3. 打开输出通道
            out = NIOUtils.writableFileChannel(outputFile.getAbsolutePath());

            // 4. 初始化编码器,设置视频分辨率(要和你的Bitmap尺寸一致!)
            AWTSequenceEncoder encoder = AWTSequenceEncoder.createWithFps(out, 25); // 25帧每秒

            // 5. 逐帧写入Bitmap
            for (Bitmap bitmap : bitmaps) {
                // 把Android Bitmap转成JCodec需要的BufferedImage
                java.awt.image.BufferedImage bufferedImage = new java.awt.image.BufferedImage(
                        bitmap.getWidth(), bitmap.getHeight(), java.awt.image.BufferedImage.TYPE_3BYTE_BGR);
                bitmap.copyPixelsToBuffer(java.nio.ByteBuffer.wrap(((java.awt.image.DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData()));
                
                encoder.encodeImage(bufferedImage);
            }

            // 6. 完成编码,释放资源
            encoder.finish();
            // 这里可以加个Toast提示生成成功
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 7. 关闭通道
            NIOUtils.closeQuietly(out);
            // 别忘了回收Bitmap,避免内存泄漏
            for (Bitmap bitmap : bitmaps) {
                if (bitmap != null && !bitmap.isRecycled()) {
                    bitmap.recycle();
                }
            }
        }
    }
}

三、关键细节说明

  • 路径部分:
    • getFilesDir():获取APP内部存储的私有目录,路径一般是/data/data/你的包名/files/
    • Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES):获取外部存储的公共图片目录,路径一般是/sdcard/Pictures/
  • Bitmap转BufferedImage:JCodec用的是Java的AWT类,所以需要把Android的Bitmap转成BufferedImage才能编码
  • 权限处理:如果用外部存储,Android 6.0+需要动态申请WRITE_EXTERNAL_STORAGE权限(Android 10+还要注意Scoped Storage的规则)
  • 帧率设置:createWithFps(out, 25)里的25是帧率,你可以根据需求调整,比如15、30

四、JCodec依赖配置

别忘了在你的build.gradle(Module级)里添加JCodec的依赖:

dependencies {
    implementation 'org.jcodec:jcodec:0.2.5'
    implementation 'org.jcodec:jcodec-javase:0.2.5'
}

内容的提问来源于stack exchange,提问作者AAMSharif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:17:43