1、释放所分配的内存

释放顺序:释放队列->释放OpenSL->释放Audio->释放FFmpeg

1.1、释放队列

JfQueue.cpp

void JfQueue::clearAVPacket() {

//有可能释放资源时线程还在加锁中

pthread_cond_signal(&condPacket);

pthread_mutex_lock(&mutexPacket);

while (!queuePacket.empty()){

//先出队再释放

AVPacket *packet = queuePacket.front();

queuePacket.pop();

av_packet_free(&packet);

av_free(packet);

packet = NULL;

}

pthread_mutex_unlock(&mutexPacket);

}

暂停播放:

void JfAudio::stop() {

if (pcmPlayerObject != NULL){

(*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay, SL_PLAYSTATE_STOPPED);

}

}

1.2、释放OpenSL、Audio:

void JfAudio::release() {

stop();

if (queue != NULL){

delete(queue);

queue = NULL;

}

if (pcmPlayerObject != NULL){

(*pcmPlayerObject)->Destroy(pcmPlayerObject);

pcmPlayerObject = NULL;

pcmPlayerPlay = NULL;

pcmBufferQueue = NULL;

}

if (outputMixObject != NULL){

(*outputMixObject)->Destroy(outputMixObject);

outputMixObject = NULL;

outputMixEnvReb = NULL;

}

if (engineObject != NULL){

(*engineObject)->Destroy(engineObject);

engineObject = NULL;

engineEngine = NULL;

}

if (buffer != NULL){

free(buffer);

buffer = NULL;

}

if (pACodecCtx != NULL){

avcodec_close(pACodecCtx);

avcodec_free_context(&pACodecCtx);

pACodecCtx = NULL;

}

if (playStatus != NULL){

playStatus = NULL;

}

if (callJava != NULL){

callJava = NULL;

}

}

1.3、释放FFmpeg:

这个比较麻烦,可能网络初始化中,可能还有其他线程,所以设置线程超时回调:void JfFFmpeg::decodeAudioThread()

int avformat_callback(void *ctx){

JfFFmpeg *jfFFmpeg = (JfFFmpeg *)ctx;

if (jfFFmpeg->playStatus->exit){

return AVERROR_EOF;

}

return 0;

}

pAFmtCtx->interrupt_callback.callback = avformat_callback;

pAFmtCtx->interrupt_callback.opaque = this;

释放FFmpeg资源

void JfFFmpeg::release() {

if (playStatus->exit){

return;

}

//这里的代码会直接继续向下走,但是某些线程可能还在执行

//如果在解码线程执行过程中就给线程加锁,一直等待线程执行完然后

playStatus->exit = true;

pthread_mutex_lock(&init_mutex);

int sleepCount = 0;

while (!exit){

if (sleepCount > 1000){

exit = true;

}

if (LOG_DEBUG){

LOGD("WAIT FFMPEG EXIT %d",sleepCount);

}

sleepCount++;

av_usleep(1000 * 10);//10ms

}

if (audio != NULL){

audio->release();

delete(audio);

audio = NULL;

}

if (pAFmtCtx != NULL){

avformat_close_input(&pAFmtCtx);

avformat_free_context(pAFmtCtx);

pAFmtCtx = NULL;

}

if (playStatus != NULL){

playStatus = NULL;

}

if (callJava != NULL) {

callJava = NULL;

}

pthread_mutex_unlock(&init_mutex);

}

1.4、Java调用暂停

public void stop(){

//在C++层有一个while循环,可能会耗时较长

new Thread(new Runnable() {

@Override

public void run() {

n_stop();

}

}).start();

}

private native void n_stop();

extern "C"

JNIEXPORT void JNICALL

Java_com_example_myplayer_player_JfPlayer_n_1stop(JNIEnv *env, jobject instance) {

// TODO

if (ffmpeg != NULL){

ffmpeg->release();

delete(ffmpeg);

ffmpeg = NULL;

if (callJava != NULL){

delete(callJava);

callJava = NULL;

}

if (playStatus != NULL){

delete(playStatus);

playStatus = NULL;

}

}

}

2、处理异常情况

比如:数据流还在加载中,就停止播放。

android音乐播放器暂停播放,Android万能音频播放器07--添加停止播放功能并释放内存...相关推荐

  1. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  2. linux数字音频播放器,Moode Audio Player数字音频播放系统的体验

    Element14 Raspberry Pi 3B Raspberry Pi 3B ARM开发板封装 Volumio OS数字音频播放系统-主页控制主界面 上周末,我们为几台ARM微型计算机推出了Ra ...

  3. Android音乐设计论文,基于安卓Android的音乐播放的设计与实现

    基于安卓Android的音乐播放的设计与实现(含开题报告,毕业论文12600字,程序代码) [摘  要]    本文旨在用于Android系统上的音乐播放器应用程序的设计与实现进行讨论.Android ...

  4. 电脑端音乐播放器html5,原生js的音频播放器,兼容pc端和移动端(原创)

    插件描述:基于原生的音频播放器效果,小巧易用 更新时间:2018/12/10 下午3:08:16 更新说明: 1. 更新demo的音频地址 2. 组件的图片地址使用本地base64的图片格式 更新时间 ...

  5. Vue3+TypeScript实现网易云音乐WebApp(播放界面:播放、暂停、音量控制、播放进度控制(点击/拖拽进度条)、上一首、下一首)

    1. 成果展示 真实接口地址 本项目使用的是真实线上的网易云API 线上演示地址 目前只做了每日推荐(需登录)以及排行榜功能,点个star吧大佬们! 项目GitHub地址 main分支是Vue3+Ty ...

  6. 带倍速音频播放器_带有播放列表HTML5音频播放器

    带倍速音频播放器 HTML5 Audio player with playlist HTML5 audio player. Many of you faced with the task of cre ...

  7. 用html做成的音频播放器,HTML5制作酷炫音频播放器插件图文教程

    上图便是这个音频播放器的UI界面图,里面还隐藏了一个歌曲的播放列表.整个播放器的UI除了大背景的人像图和歌曲的星星评分使用了图片其他全部由CSS和font-face绘制而成,看上去有难度的地方就只有C ...

  8. 自定义音频播放器_创建自定义HTML5音频播放器

    自定义音频播放器 在本教程中,我将向您介绍HTML5音频,并向您展示如何创建自己的播放器. 如果您想走捷径,请查看Envato市场上可用的现成的HTML5音频播放器 . 它使您可以从各种来源创建播放列 ...

  9. c语言 写播放器,C语言实现Mini-Cooledit音频播放器(13页)-原创力文档

    多媒体实验报告 PAGE PAGE 1 多媒体实验报告 姓名:李浩 日期:2013.6.21 作业一:Mini-Cooledit音频播放器 实验题目 Mini-Cooledit音频播放器 二.实验任务 ...

最新文章

  1. shell实例100例《一》
  2. ioca0中断 pic单片机_关于PIC单片机的一些经验总结 -单片机-电子工程世界网
  3. C九:free与malloc
  4. sql数据库JDBCTemplate和JPA使用
  5. android中intent放数据类型,Android Intent传递数据底层分析详细介绍
  6. centos php自动提示,CentOS环境实现Git命令自动补全
  7. Ubuntu18.04安装OpenPCDet及配置spconv
  8. 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论...
  9. CorelDRAW2021版本下载 百度网盘
  10. 计算机新建文件夹的步骤打开,如何制作文件夹!(新建文件夹的操作步骤)
  11. 【预测模型】基于遗传算法优化最小二乘支持向量机实现数据分类matlab代码
  12. 12行代码拿下所有lol皮肤!!Python超简单爬虫【内附详细教学 】
  13. Ubuntu20.04服务器版本如何使用命令从U盘拷贝文件到服务器
  14. SNIPER: Efficient Multi-Scale Training解读
  15. ubuntu上的音频分析工具
  16. 【松岩L2点金圈】历劫方知股海深,掀天浪起百舟倾。
  17. 安卓4.3系统,请问如何关闭通知栏里金山手机毒霸的常驻通知
  18. 基于ESP32-CAM 和 OpenCV 设计的手势控制虚拟鼠标
  19. 库存商品出入库方式分析
  20. 英文版编程入门教程推荐(C#/C++/C/Java/Python/Swift等)

热门文章

  1. 树莓派pico的软件安装及使用
  2. VIVADO的.XCI文件探索之一:创建XCI文件
  3. 《第七天》---By余华
  4. Python: 棋盘放麦子
  5. 手机电子名片html,个人简历/电子名片 HTML模板
  6. FCPX插件:LUT Gallery for mac(LUTS调色预设预览管理)及安装教程
  7. 计算机重装系统恢复数据,电脑重装系统后数据恢复图文详解
  8. arm linux 2.6下载,ARM+LINUX(montavista2.6.x)环境下SIMCOM5218使用
  9. 看“千人工程”事件有感
  10. 计算机技能节活动作文,技能节观后感这500字作文