android 播放视频结束回调,Android万能音频播放器09-添加Seek功能和完成播放回调...
1、Seek功能
播放本地音视频才有用
对AVFormatContext加锁,因为在seek的时候,不能继续播放,也就是不能继续读取frame了;
pthread_mutex_lock(&seek_mutex);
int64_t rel = secs * AV_TIME_BASE;
avformat_seek_file(pFormatCtx, -1, INT64_MIN, rel, INT64_MAX, 0);
pthread_mutex_unlock(&seek_mutex);
pthread_mutex_lock(&seek_mutex);
ret = av_read_frame(pFormatCtx, packet);
pthread_mutex_unlock(&seek_mutex);
实现Seek方法;
void JfFFmpeg::seek(int64_t sec) {
if (duration < 0){
return;
}
if (sec >= 0 && sec <= duration){
if (audio != NULL){
playStatus->seeking = true;
audio->queue->clearAVPacket();//可能队列中还有一两秒的缓存,所以要清空
audio->clock = 0;//时间置零,需要重新计算
audio->last_time = 0;
pthread_mutex_lock(&seek_mutex);
int64_t rel = sec * AV_TIME_BASE;
avformat_seek_file(pAFmtCtx,-1,INT64_MIN,rel,INT64_MAX,0);
pthread_mutex_unlock(&seek_mutex);
playStatus->seeking = false;
}
}
}
seeking时不再av_read_frame();
void JfFFmpeg::start() {
if (audio == NULL) {
if (LOG_DEBUG){
LOGE("AUDIO == NULL");
}
}
audio->play();
int count;
while (playStatus != NULL && !playStatus->exit) {
if (playStatus->seeking){
continue;//如果seeking中,不再往下执行
}
if (audio->queue->getQueueSize() > 40){//设置队列只保存40 frames,
continue;
}
AVPacket *avPacket = av_packet_alloc();
pthread_mutex_lock(&seek_mutex);
int ret = av_read_frame(pAFmtCtx,avPacket);
pthread_mutex_unlock(&seek_mutex);
if (ret == 0) {
if (avPacket->stream_index == audio->streamIndex){
count++;
/*if (LOG_DEBUG) {
LOGD("解码第%d帧",count);
}*/
audio->queue->putAVPacket(avPacket);
} else {
av_packet_free(&avPacket);
av_free(avPacket);
avPacket = NULL;
}
} else {
av_packet_free(&avPacket);
av_free(avPacket);
avPacket = NULL;
//队列中的avPacket还没有解码完
while (playStatus != NULL && !playStatus->exit){
if (audio->queue->getQueueSize() > 0){//把缓存中的avPacket也要释放出来
continue;
} else {
playStatus->exit = true;
break;
}
}
}
}
exit = true;
}
}
Java层调用
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myplayer_player_JfPlayer_n_1seek(JNIEnv *env, jobject instance, jint sec) {
// TODO
if (ffmpeg != NULL){
ffmpeg->seek(sec);
}
}
2、完成播放回调
在最后调用完成接口即可。
创建完成播放接口,供C++层调用:
public interface JfOnCompleteListener {
void onComplete();
}
private JfOnCompleteListener jfOnCompleteListener;
public void setJfOnCompleteListener(JfOnCompleteListener jfOnCompleteListener) {
this.jfOnCompleteListener = jfOnCompleteListener;
}
public void onCallComplete(){
stop();
if (jfOnCompleteListener != null) {
jfOnCompleteListener.onComplete();
}
}
然后就是C++调用Java方法的流程,在
void JfFFmpeg::start() {
if (audio == NULL) {
if (LOG_DEBUG){
LOGE("AUDIO == NULL");
}
}
audio->play();
int count;
while (playStatus != NULL && !playStatus->exit) {
if (playStatus->seeking){
continue;//如果seeking中,不再往下执行
}
if (audio->queue->getQueueSize() > 40){//设置队列只保存40 frames,
continue;
}
AVPacket *avPacket = av_packet_alloc();
pthread_mutex_lock(&seek_mutex);
int ret = av_read_frame(pAFmtCtx,avPacket);
pthread_mutex_unlock(&seek_mutex);
if (ret == 0) {
if (avPacket->stream_index == audio->streamIndex){
count++;
/*if (LOG_DEBUG) {
LOGD("解码第%d帧",count);
}*/
audio->queue->putAVPacket(avPacket);
} else {
av_packet_free(&avPacket);
av_free(avPacket);
avPacket = NULL;
}
} else {
av_packet_free(&avPacket);
av_free(avPacket);
avPacket = NULL;
//队列中的avPacket还没有解码完
while (playStatus != NULL && !playStatus->exit){
if (audio->queue->getQueueSize() > 0){//把缓存中的avPacket也要释放出来
continue;
} else {
playStatus->exit = true;
break;
}
}
}
}
if (callJava != NULL){
callJava->onCallComplete(CHILD_THREAD);
}
exit = true;
}
}
并为start方法创建一个子线程:
void *startCallback(void *data){
JfFFmpeg *ffmpeg = (JfFFmpeg *)data;
ffmpeg->start();
pthread_exit(&thread_start);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myplayer_player_JfPlayer_n_1start(JNIEnv *env, jobject instance) {
// TODO
if (ffmpeg != NULL){
//ffmpeg->start();
pthread_create(&thread_start,NULL,startCallback,ffmpeg);
}
}
android 播放视频结束回调,Android万能音频播放器09-添加Seek功能和完成播放回调...相关推荐
- Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- Android 音视频开发(六) -- Android Mediaprojection 截屏和录屏
Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍照功能 Andro ...
- [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件
参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...
- android可用视频地址,「Android」一款可以获取国内各大视频网站直接播放地址的应用...
GetVideo 是一款可以在 Android 手机上获取各大视频网站直接播放地址的应用,之后便可以配合 MX Player 播放,支持芒果tv.央视.优酷.腾讯.爱奇艺.聚力体育等网站. 开始青小蛙 ...
- android主流视频直播sdk,Android视频直播SDK集成指引
手动安装 目前 ZegoLiveRoom SDK 仅支持通过拷贝库文件的方式,集成步骤如下. 1 准备环境 请确保开发环境满足以下技术要求: Android Studio 2.1 或以上版本 已经下载 ...
- 顶峰Android手机视频转换器,凡人Android手机视频转换器
凡人Android手机视频转换器是一款专门针对谷歌Android安卓操作系统的手机开发的Android视频转换器工具,可以帮助您将各种流行的视频格式转换为Android手机所支持的视频格式和音频格式. ...
- Android音视频编辑库,Android音视频处理.pdf
Android音视频处理 Android 视频处理 沈青海 admin@3 Copyright 2008-2009 Farsight. All rights reserved. 频处理 } Media ...
- android分享视频到微信,android 分享文本、图片、音乐、视频到微信朋友圈、好友、我的收藏...
[实例简介]WeChatOpenSdkSample [实例截图] [核心代码] package net.sourceforge.simcpux; import android.Manifest; im ...
- java jmf播放视频_使用JMF实现java视频播放器
JMF这个多媒体开发框架太牛了,简单的几句代码就能实现一个视频播放器的开发,厉害,就是支持的格式少了一些,没关系,这个视频播放器可以播放mpg,avi,fvl等等,想播放其他的请开发自己的插件,下面将 ...
最新文章
- SQL数据库的数据体系结构
- 大数据风控-提高授信审查效率,做好这7点是关键
- hex editor怎么搜索代码_代码审计从入门到放弃(三) phplimit
- DCMTK:解压缩RLE压缩的DICOM文件
- 从贪心选择到探索决策:基于强化学习的多样性排序
- CentOS7挂载nfs盘快速指南
- 两个音轨合并_两个双音轨mkv视频合并保持原双音轨不变 MKV怎么合并视频,合并之后仍保留MKV的双音轨...
- Spark 集群安装
- 51单片机redefinition_lcd12864程序在keil中出现好多重新定义,尝试了很多办法都改不了,求助大家了...
- mysql 慢查询及深入调优
- 廖雪峰Python教程练习题
- 基于PHP+MySQL游戏商城销售网站的设计与实现
- 酷狗歌词Krc批量转换工具Lrc [附转换编码DLL]
- android+京东分类菜单,Android仿京东商品分类
- 谈谈量化交易的一些“深坑”
- matlab中counter怎么用,matlab中fspecial函数的用法
- Proteus,keil5仿真运行stm32程序,流水灯详细教程
- socket套接字各个接口
- 什么是云计算和大数据?他们之间的区别是什么?
- 中国大学MOOC-陈越、何钦铭-数据结构-2020春期中考试
热门文章
- 警惕!恐吓邮件泛滥,CAC安全中心过滤超400万封
- windows编程1
- 十分钟看懂图像语义分割技术(转载)
- 嗖嗖嗖主题网外贸企业主题制作视频教程--第四讲 Wordpress首页模板文件index.php静态页面完善
- APICloud AVM框架开发消防检查助手APP
- PS网页设计教程XIX——在Photoshop中创建一个优雅的作品集的网页布局
- coreldraw错误代码14001_coreldraw错误1怎么解决-解决coreldraw提示错误1的方法 - 河东软件园...
- MySQL查询数据中每种类型的占比
- iOS - 音频AAC编码
- 魔兽世界8.0服务器不稳定老掉线,Win7系统玩魔兽世界老是掉线的原因和解决方案...