FFmpeg Android 移植,改 main 函数JNI调用

安卓NDK开发实战:从JNI原理到性能优化与避坑指南 在移动开发领域,性能优化与底层硬件交互是高级开发的核心诉求。通过理解JNI(Java Native Interface)这一跨语言通信的桥梁,开发者能够突破Java虚拟机的限制,直接调用C/C++代码,实现性能敏感型计算和复用庞大的成熟生态库。其技术价值在于为应用提供了与系统底层、硬件及现有C/C++生态对话的能力,从而在图像处理、音视频编解码等场景中发挥关键作用。例如,在`ndk编译opencv3`这类任务中,正是通过NDK将计算机视觉库集成到安卓应用,解决了密集计算和算法复用的需求。同时,在`安卓缓存r 阅读详情

缘起

  至于还不知道ffmpeg的同学,请移步FFmpeg常用基本命令,翻阅一两下,看看它的功能能不能让你的app更好玩更强大。
   它可以合成音视频,播放各类编码的音视频,截取某一段,让多张图片合成一个视频并且和音频合成、转格式等等。

   配音秀里的配音很好玩,我们也想做一个配音的模块。于是找到了工具ffmpeg。试图把它移植到Android上。ffmpeg大概捣鼓了我3、4天,差不多是一个版本版本的试,网上的很多文章都不行,最后让我成功的是这篇文章《android 使用ffmpeg 并调用接口》 。我试过很多版本,只有ffmpeg1.2和ndkr9搭配,能移植成功。


思路

ffmpeg是一个c写的程序,ffmpeg.c里面有main函数,我们先把它在Android ndk下编译出来libffmpeg.so文件,然后利用这个库,来编译ffmpeg.c文件,把ffmpeg.c文件中的main函数改为video_merge函数,即video_merge(int argc,char **argv)。那么接下来像这样子合成视频视频:

void jstringToCstr(JNIEnv *env,jstring _jstring,jbyte **_cstr){
  jboolean isCopy=0;
  (*_cstr)=(*env)->GetStringUTFChars(env,_jstring,&isCopy);
}

JNIEXPORT jstring JNICALL Java_com_lzw_iword_video_Myffmpeg_stringFromJNI
  (JNIEnv * env, jclass clz, jstring videoPath, jstring audioPath, jstring avPath){
  char const *str1;
  int n = 0;
  char *argv[20];
  jbyte* str[3];
  jstringToCstr(env,videoPath,&str[0]);
  jstringToCstr(env,audioPath,&str[1]);
  jstringToCstr(env,avPath,&str[2]);

  argv[n++] = "ffmpeg";
  argv[n++] = "-i";
  argv[n++] = str[0];
  argv[n++] = "-i";
  argv[n++] = str[1];
  argv[n++] = "-y";
  argv[n++] = "-strict";
  argv[n++] = "-2";
  argv[n++] = str[2];
  int ret = vedio_merge(n, argv);
  str1 = "Using FFMPEG doing your job";
  return (*env)->NewStringUTF(env, str1);
}

也就像在命令行下调用:ffmpeg -i src1 -i src2 -y output


环境

 ubuntu 12.04


先去看那篇教程,不行了再来翻阅这篇,讲讲在那篇教程下还会遇到的问题。


改接口调用

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
 PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE) 
 LOCAL_LDLIBS := -lffmpeg -llog -ljnigraphics -lz -ldl -lgcc  //这些就是所要关联的库了,刚才把ffmpeg.so复制到android-ndk-r8d/platforms/android-14/arch-arm/usr/lib目录下的原因就是为了这个
 LOCAL_MODULE    := ffmpeg-jni
 LOCAL_SRC_FILES := ffmpeg-jni.c ffmpeg/cmdutils.h ffmpeg/cmdutils.c ffmpeg/ffmpeg.h ffmpeg/ffmpeg_opt.c ffmpeg/ffmpeg_filter.c  //必须把这几个文件编译进去,不然会很多undefinded的。。

include $(BUILD_SHARED_LIBRARY)
在改接口调用的时候,那篇文章,用了这个Android.mk,

首先,

LOCAL_LDLIBS := -lffmpeg

这个我一直没有运行成功。

这个表示链接库,也就是要编译当前这个MODULE,那些所需要的函数等就去一个目录找,找libffmpeg.so文件,-l的意思是说link的意思,ffmpeg表示库的名字,至于lib和.so系统自动会加上。

于是我用了这个:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE =myffmpeg

LOCAL_SRC_FILES :=libffmpeg.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)
LOCAL_MODULE=ffmpeg-jni
LOCAL_LDLIBS := -llog -ljnigraphics -lz -ldl -lgcc -lm
LOCAL_SRC_FILES := myffmpeg.c ffmpeg/cmdutils.h ffmpeg/cmdutils.c ffmpeg/ffmpeg.h ffmpeg/ffmpeg_opt.c ffmpeg/ffmpeg_filter.c
LOCAL_SHARED_LIBRARIES:=myffmpeg 
include $(BUILD_SHARED_LIBRARY)

注意到这个先编译了一个共享库myffmpeg,然后再通过

LOCAL_SHARED_LIBRARIES:=myffmpeg

链接进来编译最终我们需要的ffmpeg-jni。

这时候要把libffmpeg.so文件放在jni的目录下,像这样:



调试ffmpeg

ffmpeg移植后,也用了jni来调用函数,但可能出现很多问题,怎么调试呢?

如果我们也能得到像命令行下这个调式信息就好了,


这个是log日志,我们只用找到相应的位置,把它的printf语句附近加一个Log.i就可以了。


这个printf的位置,你可以在eclipse下从原来的main函数入口在av_log类似的位置按住ctrl键点击,跳转到函数位置一步步跟踪下去得到。它在ffmpeg/libavutil/log.c里面的av_log_default_callback函数里,像这样:



注意到LOGD了么,它是


...是可变长参数。可变长参数最简单的例子就是printf,有时可以pirntf("%d",a),还可以printf("%d %d",a,a);前一个是两个参数,后一个是三个参数。就是用类似的语法做到的。

__android_log_print就是android提供的打印到Logcat里的函数。

这样,你就可以看到输出日志了,对于为什么合成不了,是不支持mp3还是不支持amr,还是视频问题就可以通过这个日志来帮忙了。

有时会突然异常突出。

如何知道出错位置呢。

命令行下输入:adb shell logcat | ndk-stack -sym obj/local/armeabi


你会发现合成好了,app还是会崩溃退出,因为ffmpeg原来的main函数最后面有个exit语句,注释掉即可。


合成好了,又会发现,再把它调用一次,会出现NVALID HEAP ADDRESS IN dlfree ffmpeg的错误。原因是ffmpeg内存泄漏,还有一些动态申请的空间没有释放掉。我们干脆让ffmpeg的合成放在一个service里好了。合成一次,然后就把那个service杀掉。


AnroidMainfest.xml :

在你的程序里注册一个receiver:



所以,你就可以第一次调用ffmpeg生成一个没有声音的video文件,播放它,让用户配音,然后第二次调用,合成用户的声音以及视频。

在我这里,比较蛋疼的是,如果录音AAC Encoder的话,能合成视频,但是不能用mediaplayer播放AAC文件(小米2s专有问题?),而如果用armnb的话便不能合成,还要重新生成libffmpeg.so,在configure里enable-armnb,还有一些问题没有成功,就是enable-armnb之后运行./config.sh编译armnb出问题,说不能找到相应的文件。找到了又说它所include的文件又没找到。同样,enable-libmp3lame也没弄成功。


之所以要求也能播放,是因为合成一次10s的1280*720与10秒的录音要大概1分钟的时间。希望用户可以先听听配音的效果,然后再确定合不合成。

观察配音秀的dubbing文件夹就可以发现,配音秀录好了用户的声音,得到tmp.amr,tmp.pcm然后上传到服务器,进行合成,再把合成好的下载下来。

当配音的时候,已经下载好了原声的视频、字幕、已经去除了需要配音的片段的声音的音频。这样配音的时候,它一直播放那个音频就行,到用户配音的时候,音频里是静音的。


Eclipse里用ndk-build

  其实不用在命令行中进行ndk build,选中项目,右击选择Android tools,然后选择Add native Support,那么每次在项目里运行的时候,自动会ndk build。


一键生成jni函数头


每次都要自己来写这个挺麻烦的,其实可以一键生成:

配置一个external tools,


就是用javah命令来生成,然后让它集成到eclipse里面。

在eclipse里的标题栏里点击就可以在jni目录里看到com_lzw_iword_video_Myffmpeg.h类似的文件,像这样:


像这样,把这个头文件include进你的c文件然后,复制粘贴函数头就行。


如果君移植ffmpeg到Android,或者用ffmpeg遇到什么问题,可以评论评论提提问呗,交流交流~


Android平台C++媒体播放器开发:从FFmpeg解码到音视频同步实战 在移动应用开发中,高性能音视频处理是核心技术领域之一,其底层实现通常依赖于C/C++语言以保证执行效率。其核心原理涉及媒体数据的解封装、解码、渲染与同步流程,通过FFmpeg等开源库实现跨格式编解码,结合多线程架构管理数据流。这项技术的工程价值在于能够为短视频、直播、游戏等场景提供稳定高效的播放能力,解决音画同步、低延迟等关键问题。本文以Android平台为例,详细解析如何利用NDK、OpenGL ES和OpenSL ES构建本地播放器,涵盖FFmpeg集成、线程模型设计及音视频同步策略,帮助开发者深入理解 阅读详情

相关推荐

Android平台libredwg交叉编译与JNI集成实践指南

在移动端处理DWG图纸文件是Android开发中的常见需求,而DWG作为AutoCAD的私有二进制格式,需要借助C/C++库进行解析。交叉编译正是将这类依赖C库移植到ARM架构Android系统的核心技术。通过NDK工具链与Autotools项目的配合,开发者可以构建出适配Android的.so库,并借助JNI实现Java层调用。本文从工具链选型、依赖库处理、configure参数配置到Android Studio的CMake集成,系统梳理了libredwg的完整交叉编译流程。掌握这一套方法论,同样适用于O

weixin_34246551的博客 552

Android ndk 将C语言main方法转为JNI调用

一、C main()方法int main(int argc, char *argv[])包括两个参数,整数型argc,字符串指针数组型argv,main方法是由命令行调用的,格式为:文件名 参数1 参数2 参数3 ······例如:MyFile aaa bbb ccc 111 222 333 MyFile为文件名,aaa----333位参数,传入时编译器自动将输入的参数数量传给argc(这个数量包括

magicwangcsdn的博客 1175

JNI_FFmpeg_demo

NDK开发Demo以及FFmpeg学习的demo,自己学习的东西自己留着用

将FFMPEG编译成Android可用的静态库

目录 一、下载NDK和FFmpeg 二、编写编译FFmpeg的脚本 三、Android21版本以下(不包含21)编译时注意的问题 一、下载NDK和FFmpeg FFmpeg是多媒体视频处理工具,有非常强大的功能,包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。我们开发Android端的播放器的时候经常会用到FFmpeg这个强大的多媒体处理库。想使用FFmpeg这个库,我们需要对...

qq_32019367的博客 1448

SA8155 QNX显示框架与WFD配置实战:从黑屏排查到高可用设计

智能座舱中,车载显示系统的稳定性直接关系到驾驶安全。QNX作为高安全性的操作系统,在座舱仪表、ADAS等关键域中承担着确定性调度与隔离职责,其图形体系Screen与显示输出框架WFD协同工作,构成从应用渲染到面板点亮的完整链路。WFD配置涉及时序、通道映射与行为控制,任何参数偏差或加载异常都可能导致黑屏、花屏等故障。为保障系统可用性,需结合心跳监控、日志采集、通路重试与备份显示切换等策略,构建兼具快速感知与恢复能力的防御体系。本文以SA8155平台为例,深入拆解QNX显示框架的架构与WFD配置要点,结合一次

weixin_29165465的博客 204

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2854

FFmpeg - C++中使用ffmpeg库

http://blog.sina.com.cn/s/blog_8cfe05150100uhm2.html ffmpeg库的接口都是c函数,其头文件也没有extern "C"的声明,所以在cpp文件里调用ffmpeg函数要注意了。 一般来说,一个用C写成的库如果想被C/C++同时可以使用,那在头文件应该加上 #ifdef __cplusplus extern "C" { #endi

leonpengweicn的专栏 7259

Python实战:逐笔高频因子构建与回测全流程解析

本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。

grass的博客 391

FFmpeg For Android (三) 移植main函数到安卓上执行ffmpeg命令

根据上一篇文章《FFmpeg For Android (二) Ubuntu下编译FFmpeg源码》我们熟悉了如何在Ubuntu下编译FFmpeg, 但我们却不知道有何用… 本篇将讲解 移植ffmpeg 的main函数到安卓上 直接执行ffmpeg命令 现在你将可以做很多有趣的app 比如 支持几乎全格式的视频、音频转换、剪切、合并、水印、混合、视频转gif 获取某一帧图片(则获取支持全格式视频的

没错, 我是东芝 8504

MATLAB实战:蓝牙GFSK调制解调全流程解析(附误码率优化技巧)

本文深入解析了蓝牙GFSK调制解调在MATLAB中的全流程实现,包括高斯滤波器设计、调制解调技术及误码率优化技巧。通过实战案例和代码示例,帮助工程师提升蓝牙通信系统的性能表现,特别是在降低误码率方面的有效方法。

weixin_29046035的博客 277

Python读取ECMWF grib数据;Anaconda配置eccodes和cfgrib环境及安装过程

python读取grib数据,eccodes,cfgrib安装。

qq_36714629的博客 2244

ffmpeg.c总体调用

本文主要以转码为例子,流程主要为解析命令,转码,转码又可以细分为:打开编解码器,开始转码,关闭编解码器。FFmpeg的总体函数调用结构图如下图所示:命令解析ffmpeg_parse_options命令解析主要在ret = ffmpeg_parse_options(argc, argv);find_option po = find_option(options, opt);  //从全局const ...

evsqiezi 2404

开源模型应用落地-qwen模型小试-入门篇(二)

在windows环境下,使用transformer设置模型参数/System Prompt/历史对话

以微薄之力,予他人些许温暖. 3234

Android直播开发之旅(6):详解ffmpeg命令在Android平台上的使用

(码字不易,转载请声明出处:http://blog.youkuaiyun.com/andrexpert/article/details/74015671)     上一篇文章讲解如何在linux系统环境下编译so共享库,并将其移植到Android平台上使用。基于此,本文将着重讲解如果通过移植main函数,使Android平台支持直接使用ffmpeg命令实现对音视频的处理,就像PC端一样直接、方便。 一、移...

老蒋也疯狂 5450

Vue3 - 详细实现虚拟列表前端虚拟滚动列表解决方案,vue3长列表优化之虚拟列表,解决列表动态高度不固定高度及图片视频图文异步请求加载问题,虚拟列表DOM大量数据同时加载渲染卡顿太慢及下滑列表闪烁

vue3,vue3虚拟列表,用vue3实现一个虚拟列表,长列表高度不一致如何实现虚拟滚动加载列表,虚拟列表有图片视频,图文列表,上万条数据同时渲染解决,长列表dom渲染太卡,列表滚动条加载超多数据,瀑布流,在Vue3中如何实现列表的虚拟滚动,虚拟列表滑动白屏闪烁闪一下,虚拟列表每个项的高度不确定,可动态改变高度,vue3虚拟滚动列表,页面数据太多加载很慢怎么办,vue3实现不定高的虚拟列表,定高和不定高,虚拟列表非固定高度,vue3长列表优化之虚拟列表实现,vue3虚拟列表高度不固定,用vue3实现一个虚拟

🏆 前端领域优质创作者 1万+

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5286

ffmpeg开发之旅(6):详解ffmpeg命令在Android平台上的使用

ffmpeg开发之旅(6):详解ffmpeg命令在Android平台上的使用 (码字不易,转载请声明出处:http://blog.youkuaiyun.com/andrexpert/article/details/74015671)     上一篇文章讲解如何在linux系统环境下编译so共享库,并将其移植到Android平台上使用。基于此,本文将着重讲解如果通过移植main函数,使A

刘国栋的博客 4740

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ffmpeg采集android屏幕,Android移植ffmpeg.so实现屏幕录制功能(下)

由于赶项目原因耽误了段时间才更新,忽然发现人的记忆真是经不起时间的折腾,哎。。话不多说,接上篇!拿到编译好的ffmpeg.so文件,就可以使用里面的函数方法进行做屏幕录制的操作,但是经过查找和询问,发现ffmpeg在android设备上不支持屏幕录制,但是可以实现图片和音频合成,但是我对ffmpeg函数不熟悉,于是又到网络搜索一番,发现一篇文章给的提示: http://bbs.rg4.net/t...

weixin_42550052的博客 723

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android平台FFmpeg集成指南:从编译到JNI调用的完整实践

音视频处理是移动应用开发中的常见需求,涉及编解码、格式转换、剪辑合成等核心技术。其原理基于对多媒体数据的解析、转换与重构,通过算法实现高效处理。在Android开发中,本地音视频处理能力能显著提升应用性能与用户体验,避免云端传输延迟,增强离线功能。FFmpeg作为开源音视频处理库,提供了完整的解决方案,支持多种编解码器和封装格式。通过JNI技术,开发者可将FFmpeg集成到Android应用中,实现视频转码、音频提取等核心功能。本文详细介绍了FFmpeg在Android平台的编译配置、CMake集成及JNI

weixin_34151004的博客 402

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android应用集成FFmpeg:从编译裁剪到JNI调用的完整实践指南

音视频处理是移动应用开发中的常见需求,其核心在于对多媒体数据的编解码、封装与滤镜处理。FFmpeg作为一套开源的音视频处理解决方案,通过其模块化设计(如libavcodec、libavformat、libavfilter)提供了强大的底层能力。在Android平台集成FFmpeg,并非简单移植,而是需要针对移动端ARM架构进行交叉编译,并通过JNI(Java Native Interface)桥接Java/Kotlin层与C/C++原生库。这一技术方案的价值在于实现了对音视频处理流程的彻底掌控,避免了第三方

weixin_30781107的博客 313

音视频开发实战03-FFmpeg命令行工具移植

作为一个音视频开发者,在日常工作中经常会使用ffmpeg 命令来做很多事比如转码等等,一个简单的命令就可以解决很多事情,如果通过执行一些命令就能完成日常开发工作,那么能极大的提升我们的开发效率,但是这些命令只能在PC上使用,在移动端是无法直接使用的,这也就引出了这篇文章的所要讲的内容–FFmpeg命令行工具编译。

bookzhan的专栏 1714

Android应用集成FFmpeg音视频处理引擎完整指南

音视频处理是多媒体应用开发的核心技术之一,涉及编解码、格式转换、流媒体处理等基础概念。其原理在于通过算法对音频和视频数据进行压缩、解压与编辑,以实现高效的存储与传输。在移动开发领域,这项技术能显著扩展Android原生MediaCodec的能力边界,解决格式支持不全、复杂处理需求等工程难题。尤其在Android平台进行音视频编辑、格式转换等场景下,集成成熟的音视频处理引擎成为关键。本文将聚焦于如何通过交叉编译、JNI封装等技术路径,将强大的FFmpeg库成功集成到Android应用中,并详细阐述其编译配置、

weixin_30251829的博客 427

ffplay.c移植到安卓示例

参考ffmpeg单线程的解码视频示例, http://blog.youkuaiyun.com/danjuan123/article/details/65444098#comments#reply 这一篇主要使用的ffplay.c移植到安卓上面,了解ffmpeg多线程解码音视频,就是简单的替换jni/src/下面的ffplay.c文件 修改Android.mk文件 include $(CLEAR_V...

danjuan123的专栏 1198

Android集成FFmpeg全攻略:从编译裁剪到工程实践

音视频处理是移动开发中的常见需求,其核心在于编解码、封装格式转换与滤镜处理等技术原理。FFmpeg作为业界领先的多媒体框架,提供了强大的底层处理能力,能够实现高度定制化的媒体处理流水线。在Android平台上集成FFmpeg,不仅能满足离线处理、私有化部署等场景需求,还能构建统一的跨平台媒体处理核心。本文聚焦于FFmpeg在Android端的实际集成方案,深入探讨如何通过交叉编译、JNI封装和CMake构建,将FFmpeg高效、稳定地集成到移动应用中,并针对包体积优化、性能调优等工程实践问题提供具体解决方案

weixin_34248487的博客 354

Android NDK开发指南:从JNI到性能优化实战

原生开发套件(NDK)是Android平台上实现高性能计算的关键技术,它通过Java Native Interface(JNI)实现Java/Kotlin与C/C++的互操作。NDK的核心价值在于提升计算密集型任务(如图像处理、3D渲染)的执行效率,实测显示某些场景性能可提升10倍以上。开发者需要掌握JNI编程模型、内存管理机制以及CMake构建系统,典型应用场景包括OpenCV集成、音视频编解码等。通过NEON指令集优化和多线程处理,可以进一步释放ARM芯片的硬件潜力。随着Rust语言的引入,NDK开发正

congjukun0600的博客 430

开源项目下架风险自查清单:选型、防御与迁移的实操指南

你依赖的一个开源项目,可能在下个月就从仓库里消失:代码删除、提交历史清空、issue 区关闭。这类下架通常没有缓冲期,等你发现依赖拉取失败,业务侧往往已经在报警了。本文把这件事拆成四步——选型时怎么识别风险、平时怎么防御、下架后怎么迁移、以及一份可以直接执行的收尾清单。 开源项目依赖风险自查清单 ## 选型前必查的5项风险自查清单 引入一个新依赖之前,花二十分钟过一遍这五项,能过滤掉大部分「

gitblog_00094的博客 401
上一篇: App第一次启动时翻页介绍的简洁实现
下一篇: 用AVOS Cloud加速移动开发,map.save()即可把键值对保存到服务器上
lzw_java
博客等级 码龄15年 49粉丝 73原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值