android音乐播放器暂停播放,Android万能音频播放器07--添加停止播放功能并释放内存...
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--添加停止播放功能并释放内存...相关推荐
- 视频教程-FFmpeg打造Android万能音频播放器-Android
FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...
- linux数字音频播放器,Moode Audio Player数字音频播放系统的体验
Element14 Raspberry Pi 3B Raspberry Pi 3B ARM开发板封装 Volumio OS数字音频播放系统-主页控制主界面 上周末,我们为几台ARM微型计算机推出了Ra ...
- Android音乐设计论文,基于安卓Android的音乐播放的设计与实现
基于安卓Android的音乐播放的设计与实现(含开题报告,毕业论文12600字,程序代码) [摘 要] 本文旨在用于Android系统上的音乐播放器应用程序的设计与实现进行讨论.Android ...
- 电脑端音乐播放器html5,原生js的音频播放器,兼容pc端和移动端(原创)
插件描述:基于原生的音频播放器效果,小巧易用 更新时间:2018/12/10 下午3:08:16 更新说明: 1. 更新demo的音频地址 2. 组件的图片地址使用本地base64的图片格式 更新时间 ...
- Vue3+TypeScript实现网易云音乐WebApp(播放界面:播放、暂停、音量控制、播放进度控制(点击/拖拽进度条)、上一首、下一首)
1. 成果展示 真实接口地址 本项目使用的是真实线上的网易云API 线上演示地址 目前只做了每日推荐(需登录)以及排行榜功能,点个star吧大佬们! 项目GitHub地址 main分支是Vue3+Ty ...
- 带倍速音频播放器_带有播放列表HTML5音频播放器
带倍速音频播放器 HTML5 Audio player with playlist HTML5 audio player. Many of you faced with the task of cre ...
- 用html做成的音频播放器,HTML5制作酷炫音频播放器插件图文教程
上图便是这个音频播放器的UI界面图,里面还隐藏了一个歌曲的播放列表.整个播放器的UI除了大背景的人像图和歌曲的星星评分使用了图片其他全部由CSS和font-face绘制而成,看上去有难度的地方就只有C ...
- 自定义音频播放器_创建自定义HTML5音频播放器
自定义音频播放器 在本教程中,我将向您介绍HTML5音频,并向您展示如何创建自己的播放器. 如果您想走捷径,请查看Envato市场上可用的现成的HTML5音频播放器 . 它使您可以从各种来源创建播放列 ...
- c语言 写播放器,C语言实现Mini-Cooledit音频播放器(13页)-原创力文档
多媒体实验报告 PAGE PAGE 1 多媒体实验报告 姓名:李浩 日期:2013.6.21 作业一:Mini-Cooledit音频播放器 实验题目 Mini-Cooledit音频播放器 二.实验任务 ...
最新文章
- shell实例100例《一》
- ioca0中断 pic单片机_关于PIC单片机的一些经验总结 -单片机-电子工程世界网
- C九:free与malloc
- sql数据库JDBCTemplate和JPA使用
- android中intent放数据类型,Android Intent传递数据底层分析详细介绍
- centos php自动提示,CentOS环境实现Git命令自动补全
- Ubuntu18.04安装OpenPCDet及配置spconv
- 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论...
- CorelDRAW2021版本下载 百度网盘
- 计算机新建文件夹的步骤打开,如何制作文件夹!(新建文件夹的操作步骤)
- 【预测模型】基于遗传算法优化最小二乘支持向量机实现数据分类matlab代码
- 12行代码拿下所有lol皮肤!!Python超简单爬虫【内附详细教学 】
- Ubuntu20.04服务器版本如何使用命令从U盘拷贝文件到服务器
- SNIPER: Efficient Multi-Scale Training解读
- ubuntu上的音频分析工具
- 【松岩L2点金圈】历劫方知股海深,掀天浪起百舟倾。
- 安卓4.3系统,请问如何关闭通知栏里金山手机毒霸的常驻通知
- 基于ESP32-CAM 和 OpenCV 设计的手势控制虚拟鼠标
- 库存商品出入库方式分析
- 英文版编程入门教程推荐(C#/C++/C/Java/Python/Swift等)
热门文章
- 树莓派pico的软件安装及使用
- VIVADO的.XCI文件探索之一:创建XCI文件
- 《第七天》---By余华
- Python: 棋盘放麦子
- 手机电子名片html,个人简历/电子名片 HTML模板
- FCPX插件:LUT Gallery for mac(LUTS调色预设预览管理)及安装教程
- 计算机重装系统恢复数据,电脑重装系统后数据恢复图文详解
- arm linux 2.6下载,ARM+LINUX(montavista2.6.x)环境下SIMCOM5218使用
- 看“千人工程”事件有感
- 计算机技能节活动作文,技能节观后感这500字作文