gpt4 book ai didi

android - 使用 FFMPEG 调整视频帧大小

转载 作者:行者123 更新时间:2023-11-30 17:15:50 25 4
gpt4 key购买 nike

我需要使用 ffmpeg 调整相机预览帧的大小。我已经编写了 ffmpeg 代码和相关的 java 代码,我正在做的是将 byte[] 发送到 native 代码并在其他 byte[] 中获取输出,但我在 native 代码中总是得到输出缓冲区为零。

这是我的 native 代码:

jint Java_com_sample_FfmpegNdk_resizeRawImage( JNIEnv *env, jobject thiz, jbyteArray input_array, jarray output_array, jint width, jint height) {
jbyte *data;
jsize array_size = (*env)->GetArrayLength(env, input_array);

data = (*env)->GetByteArrayElements(env, input_array, NULL);

LOGD_CUSTOM(env, "Data Length: (%d)", strlen(data));
LOGD_CUSTOM(env, "Array Length: (%d)", array_size);

AVFrame *frame1 = av_frame_alloc();
avpicture_fill((AVPicture*)frame1, data, AV_PIX_FMT_NV12, 720, 480);

struct SwsContext *resize;
resize = sws_getContext(720, 480, AV_PIX_FMT_NV12, width, height, AV_PIX_FMT_NV12, SWS_BICUBIC, NULL, NULL, NULL);

AVFrame* frame2 = av_frame_alloc();

int num_bytes = avpicture_get_size(AV_PIX_FMT_NV12, width, height);

uint8_t* frame2_buffer = (uint8_t *)av_malloc(num_bytes);

avpicture_fill((AVPicture*)frame2, frame2_buffer, AV_PIX_FMT_NV12, width, height);

LOGD_CUSTOM(env, "Frame1 Data: (%d)", strlen(frame1->data));

sws_scale(resize, frame1->data, frame1->linesize, 0, height, frame2->data, frame2->linesize);

LOGD_CUSTOM(env, "Frame2 Data: (%d)", strlen(frame2->data));

(*env)->ReleaseByteArrayElements(env, output_array, (jbyte*)frame2->data, JNI_ABORT);

jsize array_size_s = (*env)->GetArrayLength(env, output_array);

LOGD_CUSTOM(env, "Array Length After: (%d)", array_size_s);

sws_freeContext(resize);

free(data);

return 0;
}

这是我获取相机预览的代码

myCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(final byte[] data, Camera camera) {
if (data != null) {
byte[] new_data = new byte[1024];
Log.e("lenght", "IIp lenght : " + data.length);
FfmpegNdk.resizeRawImage(data, new_data, 480, 270);
Log.e("lenght", "oIp lenght : " + new_data.length);
}
}
});

最佳答案

我认为 JNI_ABORT 就是原因,该标志阻止 JVM 将数据复制回客户端。

尝试更改此行

(*env)->ReleaseByteArrayElements(env, output_array, (jbyte*)frame2->data, JNI_ABORT);

(*env)->ReleaseByteArrayElements(env, output_array, (jbyte*)frame2->data, JNI_COMMIT);

JNI_COMMIT 将复制回数据,您需要使用

释放帧缓冲区
av_frame_free(&frame2)

欲了解更多信息,请查看 http://developer.android.com/training/articles/perf-jni.html#arrays

关于android - 使用 FFMPEG 调整视频帧大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com