videoview 框架笔记
来源:互联网 发布:砍柴网源码下载 编辑:程序博客网 时间:2024/05/30 05:18
大致理一下 显示选择合适的播放器 最后选择了OXMPlayer
=================================================================base\core\java\android\widget\videoview
openvideo(){
//这里发送广播暂停music;
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
mContext.sendBroadcast(i);
mMediaPlayer = new Mediaplayer();
}
base\media\java\android\media\mediaplayer.java
base\media\jni\android_media_mediaplayer.cpp
av\media\libmedia\mediaplayer.cpp
checkPermission("android.permission.INTERNET")
av\media\libmediaplayerservice\MediaPlayerFactory.h
略多= =!
enum player_type {
PV_PLAYER = 1,
SONIVOX_PLAYER = 2,
STAGEFRIGHT_PLAYER = 3,
NU_PLAYER = 4,
// Test players are available only in the 'test' and 'eng' builds.
// The shared library with the test player is passed passed as an
// argument to the 'test:' url in the setDataSource call.
TEST_PLAYER = 5,
OMX_PLAYER = 6,
};
virtual sp<MediaPlayerBase> createPlayer() {
ALOGV(" create OMXPlayer");
==================================================================================
关于omxplayer的创建过程
============================================================
OMXPLayer
OMXPlayer --> OMX_GraphManagerCreate()
OMXCoreMgr --> OMX_ERRORTYPE OMXCoreMgr::OMX_Init()
GMPlayer --> GMPlayer::init()
-->SysEventThreadFunc() 线程
-->SysEventHandler中处理Event
-->Event类型 OMX_Core.h
typedef enum OMX_EVENTTYPE 略多= =!
{
OMX_EventCmdComplete, /**< component has sucessfully completed a command */
OMX_EventError, /**< component has detected an error condition */
OMX_EventMark, /**< component has detected a buffer mark */
OMX_EventPortSettingsChanged, /**< component is reported a port settings change */
OMX_EventBufferFlag, /**< component has detected an EOS */
OMX_EventResourcesAcquired, /**< component has been granted resources and is
automatically starting the state change from
OMX_StateWaitForResources to OMX_StateIdle. */
OMX_EventComponentResumed, /**< Component resumed due to reacquisition of resources */
OMX_EventDynamicResourcesAvailable, /**< Component has acquired previously unavailable dynamic resources */
OMX_EventPortFormatDetected, /**< Component has detected a supported format. */
OMX_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
OMX_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
OMX_EventMax = 0x7FFFFFFF
} OMX_EVENTTYPE;
OMX_GraphManager --> GMPlayerWrapper 建立方法映射 返回gm
omxplayer创建线程 fsl_osal_thread_create(&pPCmdThread, NULL, ProcessAsyncCmdThreadFunc, (fsl_osal_ptr)this);
ProcessAsyncCmd
================================================================================================
OMXPlayer转载GMPlayer
OMX_ERRORTYPE GMPlayer::Load(OMX_STRING contentURI)
ret = LoadParser(role);
-- ret = LoadComponent(role, &Parser);
-->componentBase::ConstructComponent
virtual OMX_ERRORTYPE Parser::SetParameter(OMX_INDEXTYPE, OMX_PTR)
在此传入strcpy((char *)pMediaName, (const char *)&(pContentURI->contentURI));
if(E_FSL_OSAL_SUCCESS != fsl_osal_thread_create(&pThreadId, NULL, DoThread, this)) {
这个线程将处理OMX_StateExecuting 发送的CMD
ret = OMX_SetParameter(Parser->hComponent, OMX_IndexParamContentURI, Content);
ret = GetContentPipe(&hPipe, (OMX_STRING)&Content->contentURI);
ret = OMX_GetParameter(Parser->hComponent, OMX_IndexParamAudioPortFormat, &sAudioPortFmt);
ret = OMX_SetParameter(Parser->hComponent, OMX_IndexParamAudioPortFormat, &sAudioPortFmt);
ret = OMX_GetParameter(Parser->hComponent, OMX_IndexParamVideoPortFormat, &sVideoPortFmt);
ret = OMX_SetParameter(Parser->hComponent, OMX_IndexParamVideoPortFormat, &sVideoPortFmt);
ret = Parser->StateTransUpWard(OMX_StateIdle);
ret = Parser->StateTransUpWard(OMX_StateExecuting);
K_______________Loading component parser.rtsp ...
OMX_ERRORTYPE ComponentBase::ConstructComponent(OMX_HANDLETYPE pHandle)
C_LOG("%s__%x",__func__,this);41eb9710 添加指针LOG
在dothread中打印对应指针
void *DoThread(void *arg)
{
C_LOG("%s",__func__);
ComponentBase *base = (ComponentBase*)arg;
OMX_ERRORTYPE ret1, ret2;
while(1) {
base->Down();
C_LOG("WHILE DOTHREAD_%x",arg);
--> DoThread -->
OMX_ERRORTYPE State::ProcessCmd()
IdleState::ToExecuting() -->
virtual OMX_ERRORTYPE StreamingParser::InstanceInit()
-->启动组件奔跑吧兄弟
base->CurState->ProcessBuffer();
处理数据 <--
- ->寻找omx_component
--> 根据role 找寻GMcomponent
LoadParser(role);
SetupPipeline();
ret = LoadComponent(role, &AudioDecoder);
K_______________Loading component audio_decoder.aac ... 41ec78d8
K_______________Loading component audio_render.android ... 41686220
K_______________Loading component video_decoder.avc ... 40eee008
K_______________Loading component video_render.surface ... 40064770
LoadClock();
K_______________Loading component clocksrc ... 40132bc8
AttachClock(PARSER_CLOCK_PORT, Parser, 2);
StartPipeline();
传说集齐了以下八颗龙珠就可以召唤神龙
GMComponent *Parser;
GMComponent *AudioDecoder;
GMComponent *VideoDecoder;
GMComponent *AudioPostProcess;
GMComponent *VideoPostProcess;
GMComponent *AudioRender;
GMComponent *VideoRender;
GMComponent *Clock;
==================================================================================
OMX_ERRORTYPE IdleState::ToExecuting()
{
C_LOG("%s",__func__);
OMX_ERRORTYPE ret = OMX_ErrorNone;
ret = base->InstanceInit();
if(ret != OMX_ErrorNone)
base->InstanceDeInit();
return ret;
}
base -->ComponentBase
在StreamingParserInit()中 已经将base指定为StreamingParser
->read_head
->rtsp_read_header
B ff_rtsp_connect
ff_rtsp_send_cmd
ff_rtsp_setup_input_streams
===============================================================================
=============================================================
source 线程入口 fsl_osal_thread_create
加载模式
GMPlayer::loadcomponet
--> GMComponent->load(role)
-->OMX_GetHandle(&hComponent, (OMX_STRING)compNames[i], (OMX_PTR)this, &GMCallBacks)
-->pComponentInfoPtr = SearchComponent(cComponentName);
-->ConstructComponent(pHandleInfo, hHandle, pComponentInfoPtr);
-->pHandleInfo->hlib = LibMgr->load((fsl_osal_char *)pComponentInfoPtr->LibName);
-->ComponentEntry = (OMX_ERRORTYPE (*)(void*))LibMgr->getSymbol(pHandleInfo->hlib, \(fsl_osal_char *)pComponentInfoPtr->EntryFunction);
-->ComponentEntry(hHandle); =: OMX_ERRORTYPE StreamingParserInit(OMX_HANDLETYPE)
最终调用到组件的Init方法
启用线程
==========================================================================================================
DoThread -->
OMX_ERRORTYPE State::ProcessCmd()
IdleState::ToExecuting() -->
virtual OMX_ERRORTYPE StreamingParser::InstanceInit()
-->启动组件奔跑吧兄弟
base->CurState->ProcessBuffer();
ret = base->ProcessClkBuffer();
if(ret == OMX_ErrorNoMore) {
ret = base->ProcessDataBuffer();
}
处理数据
=======================================================================
ret = Parser->StateTransUpWard(OMX_StateIdle);
ret = Parser->StateTransUpWard(OMX_StateExecuting);
=====================================================================================\
结构
StreamingParser 的类中有这几个重要成员
List<AVPacket> AssemblePktList
AVFormatContext *ic
AVFormatParameters params
RTSPStream
{
PayloadContext
{
AVIOContext
{
PayDynamicProtocolHandler
}
AVStream
{
AVCodecContext
AVCodec
}
=============================================
算法
Parser::ProcessDataBuffer()
-->
GetandSendOneVideoBuf
GetandSendOneAudioBuf
-->
StreamIngParser::getnextSample中启动线程
--> 以为是音视频线程分开 但是调试发现只有一个线程
DoReadPacket
OMX_ERRORTYPE StreamingParser::ReadPacketFromStream()
数据来源入口
-->err = ic->iformat->read_packet(ic, pkt);
-->AVPacket *StreamingParser::AssemblePacket(AVPacket *pkt)
list-->add(pkt)
- videoview 框架笔记
- VideoView笔记
- VideoView学习笔记
- VideoView
- videoView
- VideoView
- VideoView
- VideoView
- vitamio 开源框架使用(VideoView)
- Android 学习笔记(四):videoView
- Android视频媒体相关,VideoView和开源框架vitamio
- android视频播放器笔记之VideoView API
- android开发笔记之多媒体—VideoView播放视频
- Android 播放视频 VideoView 《第一行代码》学习笔记
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- Android-- VideoView
- MediaController+VideoView
- 11 VideoView
- Android 常用权限
- 应用架构设计“防火”经验分享
- 使用hibernate tools插件生成POJO
- wordpress文章内容调用
- CSS背景颜色渐变
- videoview 框架笔记
- 1412251650-蓝桥杯-基础练习 杨辉三角形
- 32位 Ubuntu 14.04 安装 DiskSim
- 使用json-lib把JSON对象转换成java bean list的例子
- 第四章
- ascll码表
- Top 5 Beautiful C++ std Algorithms Examples
- 多年后,才知道自己是多么的无知
- uboot 使用 以及 启动代码分析(转载网络)