Android流媒体的实现

Android VideoView组件实现RTSP流媒体播放示例 Android中的VideoView组件是一个用于显示和控制视频播放的视图组件。它提供了一套简单的API来处理视频的播放、暂停、停止等操作,非常适合快速开发需要嵌入视频播放功能的应用。流媒体技术是允许数据以连续的方式传输和播放的技术。随着互联网的发展,流媒体广泛应用于音视频点播、直播等领域。流媒体技术的核心在于“流式传输”,它允许用户在不完全下载文件的情况下即可进行播放,这样大大减少了等待时间。流媒体数据通常通过流媒体服务器进行发布,而RTSP协议则是这类服务器和客户端之间进行通信的主要协议之一。 阅读详情
在mps的setDataSource中,根据url判断应该生成那种dataSource,然后获取默认的player,即nuplayer。进入NuPlayerDriver的setDataSource,
再进入void NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) {
#ifdef MTK_AOSP_ENHANCEMENT
    mIsStreamSource = true;
#endif
    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());

    sp<AMessage> notify = new AMessage(kWhatSourceNotify, id());

    msg->setObject("source", new StreamingSource(notify, source));
    msg->post();
}

到了NuPlayer异步消息的世界,进入setDataSourceAsync
首先判断是什么流媒体
        if (!strncasecmp(url, "http://", 7)
                || !strncasecmp(url, "https://", 8)) {
            mDataSourceType = SOURCE_Http;
            ALOGI("Is http Streaming");
生成一个sp<GenericSource> genericSource =
                new GenericSource(notify, mUIDValid, mUID);
然后触发了kWhatSetDataSource
进入NuPlayerDriver的
void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) {
    Mutex::Autolock autoLock(mLock);

    CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING);

    mAsyncResult = err;
    mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE;
#ifdef MTK_AOSP_ENHANCEMENT
    ALOGD("after notifySetDataSourceCompleted mState=%d", mState);
#endif
    mCondition.broadcast();
}
注意,mCondition是在MPS调用NuPlayerDriver的API的时候就已经wait了的
status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
    ALOGV("setDataSource(%p) file(%d)", this, fd);
    Mutex::Autolock autoLock(mLock);

    if (mState != STATE_IDLE) {
        return INVALID_OPERATION;
    }

    mState = STATE_SET_DATASOURCE_PENDING;

    mPlayer->setDataSourceAsync(fd, offset, length);

    while (mState == STATE_SET_DATASOURCE_PENDING) {
        mCondition.wait(mLock);
    }

    return mAsyncResult;
}
好,下面该prepare了

status_t NuPlayerDriver::prepare_l() {
    switch (mState) {
        case STATE_UNPREPARED:
            mState = STATE_PREPARING;

            // Make sure we're not posting any notifications, success or
            // failure information is only communicated through our result
            // code.
            mIsAsyncPrepare = false;
            mPlayer->prepareAsync();
            while (mState == STATE_PREPARING) {
                mCondition.wait(mLock);
            }
            return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR;
        case STATE_STOPPED:
            // this is really just paused. handle as seek to start
            mAtEOS = false;
            mState = STATE_STOPPED_AND_PREPARING;
            mIsAsyncPrepare = false;
            mPlayer->seekToAsync(0, true /* needNotify */);
            while (mState == STATE_STOPPED_AND_PREPARING) {
                mCondition.wait(mLock);
            }
            return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR;
        default:
            return INVALID_OPERATION;
    };
}

进到NuPlayer的消息处理机制
        case kWhatPrepare:
        {
#ifdef MTK_AOSP_ENHANCEMENT
           ATRACE_ASYNC_BEGIN("Prepare",mPlayerCnt);

            ALOGD("kWhatPrepare, source type = %d", (int)mDataSourceType);
            if (mPrepare == PREPARING)
                break;
            mPrepare = PREPARING;
            if (mSource == NULL) {
                ALOGW("prepare error: source is not ready");
                finishPrepare(UNKNOWN_ERROR);
                break;
            }
#endif
            mSource->prepareAsync();
            break;
        }
这个mSource是GenericSource
进入了onPrepareAsync
此时去create 一个dataSource 
mDataSource = DataSource::CreateFromURI(
                   mHTTPService, uri, &mUriHeaders, &mContentType,
                   static_cast<HTTPBase *>(mHttpSource.get()));

此时就涉及到两个Source,一个是从网络获取数据的Http,一个是cache在本地的流媒体数据

Http的Source被这样创建
mHttpSource = DataSource::CreateMediaHTTP(mHTTPService);
mHttpSource继承于DataSource

第一个Source是聚合在NuCachedSource2中的一个Source

cache的Source被这样创建,本质上也是一个DataSource,因为NuCachedSource2是dataSource的子类

            source = new NuCachedSource2(
                    httpSource,
                    cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
                    disconnectAtHighwatermark);

然后进入initFromDataSource,也就是去选择extractor的类型,这个需要一些数据来判断是哪种流媒体格式

        extractor = MediaExtractor::Create(mDataSource,
                mSniffedMIME.empty() ? NULL: mSniffedMIME.c_str());

那些初始下载的数据是什么时候下的呢?在创建NuCachedSource2的时候就开始了
这是另外一个线程在做的事情
    ssize_t n = mSource->readAt(
            mCacheOffset + mCache->totalSize(), page->mData, kPageSize);
一次性获取kPageSize大小的数据
此时是靠IMediaHTTPConnection来通过匿名共享内存和binder获取的

Bn的部分在MediaHTTPConnection.java (base\media\java\android\media) 

而它使用的又是 HttpURLConnection,是现在libcore下,属于基础架构


回到Extractor,它会调用ssize_t NuCachedSource2::readAt(off64_t offset, void *data, size_t size) {
发kWhatRead调用onRead,然后调用readInternal,从mCache里面copy数据
mCache->copy(delta, data, avail);

有多少拷多少,data是输出参数,给Extractor

注意,判断是什么类型是需要一点数据,这点数据往往就是tmd的tts数据了

bool DataSource::sniff(
        String8 *mimeType, float *confidence, sp<AMessage> *meta) {

策略是所有Sniff,挨个闻一遍,哪个confidence高用谁的,Sniff是Extractor的一个副产品
Android平台实现IP Camera RTSP流媒体播放项目指南 RTSP(Real Time Streaming Protocol)是一种网络控制协议,旨在控制流媒体服务器以提供实时数据流。与HTTP相比,RTSP负责传输控制,而数据传输则由RTP(Real-time Transport Protocol)等协议负责。VLC for Android不仅提供了一个强大的播放器基础,还允许开发者进行高级自定义。你可以通过创建自定义的对象为VLC播放器添加均衡器功能。此外,还有诸多选项可以设置,比如音量控制、亮度调节、播放速度调整等。 阅读详情

相关推荐

大学生智能车竞赛初次尝试经验分享--1(硬件绘制电路,pcb部分)

本人机械电子专业大二暑假参加全国大学生智能车竞赛,之前参加过一些其他类型的比赛有一点基础,由于之前疫情影响所以做智能车比赛断代了,没有学长带也没有思路,从一开始的一头雾水逐渐摸索出我感觉比较实用的经验。 一.首先是硬件的准备工作: 1.硬件部分与要自己设计需要的电路制成pcb。推荐使用Altium Designer20,AD比较常用所以有多实用的教学视频,另外需要自己了解布线规则,包括信号线,电源线常用的宽度 一些电源电路,驱动电路建议用multisim仿真,没有问题再进行制版 单片机有关的需要仿真

weixin_52679034的博客 9834

media cache 对比.

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34403693的博客 737

低电压高效率能源管理芯片BQ25570的基本用法及应用电路实例

BQ25570是一款低电压、高效率、集成了可编程功率追踪(MPPT)功能、BOOST升压功能和BUCK降压功能的综合型能源管理电路。冷启动工作电压为330mV,热启动工作电压为100mV。主要应用于温差发电片TEG、压电、摩擦发电和太阳能板的能量收集,也可以用于人体可穿戴自取能传感设备的能量管理。本文主要介绍了BQ25570相关参数计算、MPPT功能验证、工作逻辑和应用场景,并设计了一版测试电路,给出了不同应用需求的电路配置建议。

weixin_49213602的博客 3454

Android 2.3 Midia Framework

1.       MediaPlayer介绍          MediaPlayer是Android api提供的用来播放音频和视频的类, VideoView也是对其简单的封装。 用MediaPlayer播放视频很简单, 需要4个步骤。 l        通过mediaPlayer.setDataSource设置要播放的uri。 l        通过mediaPlayer.setDisp

愚蠢概念 7977

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2151

Android http progressive streaming分析

1. 数据源设置DataSource 对于http progressive download模式的数据源,分为两步完成: 1.  客户端调用setDataSource(const char*uri, …)后,AwesomePlayer保存了uri的值,其实没有做什么实质的事情,也没有发起连接。真正的连接网络并sniff的过程是在prepare的时候才进行的。 2.  客户端调用prepare

Cheng的专栏 3391

ASTRA Toolbox学习笔记-Python

ASTRA Toolbox 是一个用于处理 X 射线相干散射和 X 射线传输成像的开源算法工具箱。本文档概述了该工具箱的基本概念。

hou9021的博客 8261

Android 13 - Media框架(5)- NuPlayerDriver

前面的章节中我们了解到上层调用setDataSource后,MediaPlayerService::Client(IMediaPlayer)会调用MediaPlayerFactory创建MediaPlayerBase。Android为我们提供了默认的播放器实现NuPlayer,NuPlayerDriver实现了MediaPlayerBase接口,内部调用并管理有NuPlayer,起着承上启下的作用。

青山渺渺 4341

Wi-Fi QoS中AIFSN/CWmin/CWmax/TxOP参数是怎样计算的?

802.11e/WMM的EDCA机制通过AIFS、CWmin/CWmax和TxOP三组参数实现业务优先级控制。AIFS决定最短等待时间(AIFS=SIFS+AIFSN×SlotTime),CWmin/CWmax定义退避范围(2^ECW-1),TxOP设置最大占用时长(32µs单位)。默认配置中,语音业务(VO)优先级最高,其AIFSN最小(2)、CW范围最小(3-7)、TxOP适中(1.504ms);视频(VI)次之;普通数据(BE)和后台(BK)优先级最低。调优需根据网络特性调整参数:VoIP可降低AIF

1042484520@qq.com(邮箱) 1746

计算分子相似度(摩根分子指纹计算)

import numpy as np import pandas as pd import seaborn as sns import matplotlib as plt from rdkit.Chem import Draw from rdkit.Chem import AllChem as Chem from rdkit.Chem import PandasTools from rdkit import DataStructs data = pd.read_csv(r'47_covidLead.csv'

weixin_39417324的博客 1387

Android开发 使用实现 MediaPlayer 音频播放

Android开发 使用实现 MediaPlayer 音频播放 简介: 本篇文章是介绍 MediaPlayer 播放音频的简单运用(不包含视频). 目录: 1.什么是 MediaPlayer 2.MediaPlayer 的常用方法 3.MediaPlayer 的简单运用 1.什么是 MediaPlayer 介绍: MediaPlayer 是处于Android多媒体包下 "android.med...

神经大条蕾弟的博客 5212

SpringBoot4.0+JDK25+GraalVM实战:云原生新纪元,微服务性能翻倍的落地指南

三者的组合不是偶然,而是“框架优化+JDK升级+虚拟机革新”的必然结果——SpringBoot4.0完善了对GraalVM原生镜像的支持,JDK25强化了云原生与AOT编译能力,GraalVM则提供了极致的启动速度和资源利用率,三者协同,刚好命中云原生微服务的核心痛点。SpringBoot4.0+JDK25+GraalVM的组合,不是简单的版本升级,而是云原生微服务的一次性能革命。

2601_94871597的博客 1141

安卓原生 VideoView实现rtsp流媒体的播放

本项目实现安卓原生 VideoView实现rtsp流媒体的播放。 AndroidManifest.xml权限设置 &lt;uses-permission android:name="android.permission.INTERNET"/&gt; activity_main.xml &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;android...

猿来这样-谢厂节的博客 7920

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android流媒体基于,基于Android的流媒体系统的设计与实现

摘要:随着手机移动用户的不断增加和流媒体技术的发展,移动流媒体服务正成为移动业务的研究热点之一.在这一背景下,论文针对移动网络和移动终端的特点 进行了移动流媒体系统的设计与实现.本文分别从需求分析,设计和实现三个步骤讨论了基于Android的流媒体系统.在需求分析阶段,从系统的业务需求和功能需求中抽象出具体的使用人并提 取出用例流程,同时对用例进行了具体的分析和描述.考虑到移动通信网络的带宽和智能...

weixin_39990410的博客 207

efm32 入门.pdf

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

vlc-android 中调用用libvlcjni.so实现流媒体播放

最近公司搞的项目中涉及到流媒体播放,并且需要硬解码,所以想到了VLC这个开源项目。去官网下载了vlc-android源码进行编译,生成的apk安装在公司的设备上可以运行,不错不错,有现成的东西当然不会再去“造轮胎”,把编译后的android 工程导入eclipse 看了所有的代码,觉得对于我们只需要实现流媒体播放的来说显得有些累赘,这篇文章只需要实现流媒体播放的部分 关于源码下载和编译的部分

dssxk的专栏 1473

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 保存流媒体,Android实现使用流媒体播放远程mp3文件的方法

本文实例讲述了Android实现使用流媒体播放远程mp3文件的方法。分享给大家供大家参考,具体如下:package com.shadow.util;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;impo...

weixin_39616880的博客 267

android流媒体架构,基于Android平台的流媒体播放器的设计与实现

摘要:互联网的出现和发展正在逐步改变人们的生活,智能手机的问世正在重新定义这一改变。智能手机与网络、多媒体的融合也越来越紧密,所以通过手机终端浏览网页、观看视频已经成为手机行业基本的标准。移动通信在3G网络技术已经表现很成熟,并在试图发展4G网络,在这些网络技术的支撑下,流媒体服务也在逐步走入人们的生活,受到越来越多的关注。在网络技术持续发展的今天,高效率的流媒体客户端已经成为人们关注的焦点。 本...

weixin_42398730的博客 458

EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程

本文转自EasyDarwin团队成员John的博客:http://blog.youkuaiyun.com/jyt0551/article/details/74502627H.265编码算法作为新一代视频编码标准,在编码效果上有了很大的进步,同样清晰度的视频,265要比264有着更低的码率。关于265对比264的优越性,网上有更专业的文章来作分析,我也仅对这两种算法略知皮毛,因此不多阐述。基于其更高的压缩比,H.

Babosa的专栏 1万+

EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能

对于一个裸的RTSP URL,存放在播放列表上略显单调与枯燥。大家可以看到EasyPlayer在播放完视频后会保存一帧图片到列表上。那么这个功能是如何做到的呢? 如果自己实现解码的话,比如使用ffmpeg解码,这种情况下,将视频帧解码,再编码成jpeg保存下来,应该不是什么难事。相信大多数播放器都是这样处理的。 H264格式的视频码流=>解码=>YUV格式的视频帧=>压缩=>jpeg=>保存到

Babosa的专栏 4332

在android上实现ffmpeg的pipe功能,实现除了file和网络协议以外的流媒体播放

1.ffmpeg支持CONFIG_PIPE_PROTOCOL协议,说白了就是命令管道的使用。   pipe的使用和file的使用是一样的,不同的一点在于file是可以去不断的去读取和seek的,这样在ffmpeg中就会把pipe协议当成一种流媒体来处理。 也就是URLContext->is_streamed的类型。 2.在什么情况下使用ffmpeg的pipe呢?   现在andro

lingxiang0614的专栏 4993

android 流媒体合并,基于Android平台的流媒体播放器的设计与实现

摘要:互联网的出现和发展正在逐步改变人们的生活,智能手机的问世正在重新定义这一改变。智能手机与网络、多媒体的融合也越来越紧密,所以通过手机终端浏览网页、观看视频已经成为手机行业基本的标准。移动通信在3G网络技术已经表现很成熟,并在试图发展4G网络,在这些网络技术的支撑下,流媒体服务也在逐步走入人们的生活,受到越来越多的关注。在网络技术持续发展的今天,高效率的流媒体客户端已经成为人们关注的焦点。本文...

weixin_31200621的博客 216

android播放mp3方法,Android实现使用流媒体播放远程mp3文件的方法

本文实例讲述了Android实现使用流媒体播放远程mp3文件的方法。分享给大家供大家参考,具体如下:package com.shadow.util;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;impo...

weixin_32233079的博客 949

EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)

本文转自EasyDarwin团队John的博客:http://blog.youkuaiyun.com/jyt0551,John是EasyPusher安卓直播推流、EasyPlayer直播流媒体播放端的开发和维护者,在这方面为开源社区贡献了非常多的技术干货和代码,这里对John的辛苦劳作表示感谢!在之前一片博客《 EasyPusher实现安卓Android手机直播推送同步录像功能》(http://blog.csd

Babosa的专栏 4035

Android app实现p2p流媒体服务的基本步骤

1首先每个app每隔开30秒都会向服务器发送自己的端口和ip地址。以及缓存在APP内的视频url.当某个APP要播放某个视频的时候,首先会从同一个县城的ip地址查询是否存在同样的url.如果存在那么直接从这个ip地址去下载或者用流媒体播放这个视频,如果不存在就查询同一个市是否存在,以此类推。这里还要提供一些附加信息:比如使用流量播放视频的app不作为服务器,一是假设位置移动那么ip会不断移动导致播放断开。宽带环境内的APP一般没有问题。这里需要一个Android的流媒体服务器技术。

179
上一篇: 生产者,消费者的几个例子
下一篇: pcm的表示方法
我把葡萄酿成酒
博客等级 码龄12年 275粉丝 198原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值