GPUImage与ffmpeg整合

bool VideoPlayer::DecodeVideoPacket(AVPacket* packet, JNIEnv* env, bool updateTime)
{
	int frameFinished = 0;
	AVCodecContext* codec_ctx = m_stream_ctx[m_video_stream].codec_ctx;
	AVStream *stream = m_fmt_ctx->streams[m_stream_ctx[m_video_stream].stream_number];

	int decodeByte = avcodec_decode_video2(codec_ctx, m_video_frame, &frameFinished, packet);
	if (decodeByte <= 0) return false;

	if (!frameFinished) return true; // wait for next frame.

	bool ret = WaitForFrame(stream, m_video_frame, m_video_stream);
	if (!ret) return ret;

	if (updateTime) UpdateTime(env, false);

	m_buffer_manager.RenderFrame(m_video_frame, env);

	env->CallVoidMethod(m_obj, m_notify_bitmap_ready_method);
	return ret;
}

bool BufferManager::SetBitmap(JNIEnv* env, jobject bitmap)
{
    if (env == NULL || bitmap == NULL) return false;

    if (m_bitmap == bitmap) return true;

    m_bitmap = bitmap;
    m_window_changed = true;

    int ret;
    if ((ret = AndroidBitmap_getInfo(env, bitmap, &m_bitmap_info)) < 0)
    {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return false;
    }
      
    if ((ret = AndroidBitmap_lockPixels(env, bitmap, &m_bitmap_pixels)) < 0)
    {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
        return false;
    }

    return true;
}

bool BufferManager::RenderFrame(AVFrame *frame, JNIEnv* env)
{
	bool ret = true;
	if (!SetupEnvironment()) return false;

    if (frame == NULL || m_bitmap_pixels == NULL) return false;

    sws_scale( m_video_sws,
               (uint8_t const * const *)frame->data,
               frame->linesize,
               0, 
               m_bitmap_info.height,
               (uint8_t*const*) &m_bitmap_pixels, 
               (const int *)&(m_bitmap_info.stride));

	return ret;
}
两个模块锁定同一个bitmap对象,ffmepg更新一帧数据到bitmap后,通过jni反射到GPUImage,驱动GPUImage的egl render流程
GPUImage是一个强大的图片滤镜处理工具类,同时也支持视频实时滤镜和美白功能。它可以用于制作市面上大多数修图软件所具有的功能,并且一些软件可能就是基于此库制作的。\[1\] GPUImage提供了125个滤镜,分为四类。其中,常用的滤镜包括饱和度滤镜(GPUImageSaturationFilter),可以通过调节参数来改变图像的饱和度。\[2\] 另外,FFmpeg也是一个功能强大的多媒体处理库,它也具有滤镜处理的功能。FFmpeg有两套接口,一套是将要废弃的老接口,比如编码接口。\[3\]关于FFmpeg的滤镜处理,我会在另一篇文章中详细介绍。 #### 引用[.reference_title] - *1* *2* [利用GpuImage打造自己的修图软件](https://blog.csdn.net/huang_yong_/article/details/78173117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [FFmpeg 音视频编码 AVFilter添加水印 编码到MP4文件 编码后进行RTMP推流 用FFmpegGPUImage输出视频进行软...](https://blog.csdn.net/m0_37677536/article/details/93216200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值