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功能和完成播放回调...相关推荐

  1. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  2. Android 音视频开发(六) -- Android Mediaprojection 截屏和录屏

    Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍照功能 Andro ...

  3. [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

    参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...

  4. android可用视频地址,「Android」一款可以获取国内各大视频网站直接播放地址的应用...

    GetVideo 是一款可以在 Android 手机上获取各大视频网站直接播放地址的应用,之后便可以配合 MX Player 播放,支持芒果tv.央视.优酷.腾讯.爱奇艺.聚力体育等网站. 开始青小蛙 ...

  5. android主流视频直播sdk,Android视频直播SDK集成指引

    手动安装 目前 ZegoLiveRoom SDK 仅支持通过拷贝库文件的方式,集成步骤如下. 1 准备环境 请确保开发环境满足以下技术要求: Android Studio 2.1 或以上版本 已经下载 ...

  6. 顶峰Android手机视频转换器,凡人Android手机视频转换器

    凡人Android手机视频转换器是一款专门针对谷歌Android安卓操作系统的手机开发的Android视频转换器工具,可以帮助您将各种流行的视频格式转换为Android手机所支持的视频格式和音频格式. ...

  7. Android音视频编辑库,Android音视频处理.pdf

    Android音视频处理 Android 视频处理 沈青海 admin@3 Copyright 2008-2009 Farsight. All rights reserved. 频处理 } Media ...

  8. android分享视频到微信,android 分享文本、图片、音乐、视频到微信朋友圈、好友、我的收藏...

    [实例简介]WeChatOpenSdkSample [实例截图] [核心代码] package net.sourceforge.simcpux; import android.Manifest; im ...

  9. java jmf播放视频_使用JMF实现java视频播放器

    JMF这个多媒体开发框架太牛了,简单的几句代码就能实现一个视频播放器的开发,厉害,就是支持的格式少了一些,没关系,这个视频播放器可以播放mpg,avi,fvl等等,想播放其他的请开发自己的插件,下面将 ...

最新文章

  1. SQL数据库的数据体系结构
  2. 大数据风控-提高授信审查效率,做好这7点是关键
  3. hex editor怎么搜索代码_代码审计从入门到放弃(三) phplimit
  4. DCMTK:解压缩RLE压缩的DICOM文件
  5. 从贪心选择到探索决策:基于强化学习的多样性排序
  6. CentOS7挂载nfs盘快速指南
  7. 两个音轨合并_两个双音轨mkv视频合并保持原双音轨不变 MKV怎么合并视频,合并之后仍保留MKV的双音轨...
  8. Spark 集群安装
  9. 51单片机redefinition_lcd12864程序在keil中出现好多重新定义,尝试了很多办法都改不了,求助大家了...
  10. mysql 慢查询及深入调优
  11. 廖雪峰Python教程练习题
  12. 基于PHP+MySQL游戏商城销售网站的设计与实现
  13. 酷狗歌词Krc批量转换工具Lrc [附转换编码DLL]
  14. android+京东分类菜单,Android仿京东商品分类
  15. 谈谈量化交易的一些“深坑”
  16. matlab中counter怎么用,matlab中fspecial函数的用法
  17. Proteus,keil5仿真运行stm32程序,流水灯详细教程
  18. socket套接字各个接口
  19. 什么是云计算和大数据?他们之间的区别是什么?
  20. 中国大学MOOC-陈越、何钦铭-数据结构-2020春期中考试

热门文章

  1. 警惕!恐吓邮件泛滥,CAC安全中心过滤超400万封
  2. windows编程1
  3. 十分钟看懂图像语义分割技术(转载)
  4. 嗖嗖嗖主题网外贸企业主题制作视频教程--第四讲 Wordpress首页模板文件index.php静态页面完善
  5. APICloud AVM框架开发消防检查助手APP
  6. PS网页设计教程XIX——在Photoshop中创建一个优雅的作品集的网页布局
  7. coreldraw错误代码14001_coreldraw错误1怎么解决-解决coreldraw提示错误1的方法 - 河东软件园...
  8. MySQL查询数据中每种类型的占比
  9. iOS - 音频AAC编码
  10. 魔兽世界8.0服务器不稳定老掉线,Win7系统玩魔兽世界老是掉线的原因和解决方案...