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
相关产品推荐
相关产品推荐

