导航:首页 > 操作系统 > rtspandroid视频采集

rtspandroid视频采集

发布时间:2022-10-07 06:04:11

A. 请教android平台的RTSP协议和音视频解码器

接调用Mediaplayer就可以了,底层使用OPENCORE或者STAGEFRIGHT实现的

B. android VideoView 支持rtsp 的mp4格式吗

Android 中的VideoView支持MP4格式的视频。通过VideoView播放视频的步骤:
1、在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件
2、调用VideoView的如下两个方法来加载指定的视频,setVidePath(String path):加载path文件代表的视频;setVideoURI(Uri uri):加载uri所对应的视频。
3、调用VideoView的start()、stop()、psuse()方法来控制视频的播放。
VideoView通过与MediaController类结合使用,开发者可以不用自己控制播放与暂停。

C. android怎么播放rtsp实时网络串流代码

android播放rtsp实时网络串流核心代码如下:

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.VideoView;
public class rtspActivity extends Activity {
/** Called when the activity is first created. */
Button playButton ;
VideoView videoView ;
EditText rtspUrl ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
rtspUrl = (EditText)this.findViewById(R.id.url);
playButton = (Button)this.findViewById(R.id.start_play); playButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
PlayRtspStream(rtspUrl.getEditableText().toString()); } });
videoView = (VideoView)this.findViewById(R.id.rtsp_player); }
//play rtsp stream
private void PlayRtspStream(String rtspUrl){
videoView.setVideoURI(Uri.parse(rtspUrl));
videoView.requestFocus();
videoView.start();
}
}

D. ijkPLayer 0.8.8播放rtsp(android),编译出来的库需要在真机上调试吗

编译环境是:

virtualbox下的ubuntu
jdk-8u112-linux-x64 .tar.gz
android-ndk-r13-linux-x86_64.zip
android-sdk_r24.4.1-linux.tgz

配置好这些后安装: install homebrew, git, yasm

搭建好环境后就可以编译了,开始我编译出了0.8.4版本,发现播放不了rtsp,播放就是黑屏,后来发现有人说新版本有这个问题,退回到旧版本就没有问题了,于是我使用了K0.7.6

E. android.media.AsyncPlayer这个类应该怎么用

代码结构:

Open Core 的代码在Android 代码的 External/Opencore 目录中 。这个目录是OpenCore
的根目录,其中包含的子目录如下所示 :

android :这里面是一个上层的库,它实现了一个为Android 使用的音视频采集,播放的接口,和DRM 数字版权管理的接口实现。

baselibs :包含数据结构和线程安全等内容的底层库

codecs_v2 :音视频的编解码器,基于 OpenMAX 实现

engines :核心部分 ,多媒体 引擎的实现

extern_libs_v2 :包含了 khronos 的 OpenMAX 的头文件

fileformats :文件格式的解析( parser )工具

nodes :提供一些PVMF 的NODE ,主要是编解码和文件解析方面的。

oscl :操作系统兼容库

pvmi : 输入输出控制的抽象接口

protocols :主要是与网络相关的 RTSP 、 RTP 、 HTTP 等协议 的相关内容

pvcommon : pvcommon 库文件的 Android.mk 文件,没有源文件。

pvplayer : pvplayer 库文件的 Android.mk 文件,没有源文件。

pvauthor : pvauthor 库文件的 Android.mk 文件,没有源文件。

tools_v2 :编译工具以及一些可注册的模块。

本文主要介绍Android MediaPlayer的架构,主要由OpenCore 里的PV Player来实现的。

1.概述

Android的MediaPlayer包含了Audio和Video的播放功能,Music和Video两个应用程序都是调用MediaPlayer实现的。

代码主要分布在以下的目录中:

java程序的路径:

packages/apps/Music/src/com/android/music/

JAVA类的路径:

frameworks/base/media/java/android/media/MediaPlayer.java

JAVA本地调用部分(JNI):

frameworks/base/media/jni/android_media_MediaPlayer.cpp

编译为 libmedia_jni.so

头文件:

frameworks/base/include/media/

多媒体库:

frameworks/base/media/libmedia/

编译为 libmedia.so

多媒体服务:

frameworks/base/media/libmediaplayerservice/

编译为 libmediaplayerservice.so

具体实现:

external/opencore/

编译为 libopencoreplayer.so

libopencoreplayer.so是主要的实现部分,其他的库基本上都是在其上建立的封装和为建立进程间通讯的机制。

2.框架


运行的时候,大致可以分成Client和Server两个部分,分别在两个进程中运行,使用Binder机制实现IPC通讯。从框架结构上来看,IMediaPlayerService.h、IMediaPlayerClient.h和MediaPlayer.h三个类定义了MeidaPlayer的接口和架构,MediaPlayerService.cpp和mediaplayer.cpp两个文件用于MeidaPlayer架构的实现,MeidaPlayer的具体功能在PVPlayer(库libopencoreplayer.so)中的实现。

2.1 IMediaPlayerClient.h

描述一个MediaPlayer客户端的接口

class IMediaPlayerClient: public IInterface

{

public:

DECLARE_META_INTERFACE(MediaPlayerClient);

virtual void notify(int msg, int ext1, int ext2) = 0;

};

class BnMediaPlayerClient: public BnInterface

{

public:

virtual status_t onTransact( uint32_t code,

const Parcel& data,

Parcel* reply,

uint32_t flags = 0);

};

在定义中,IMediaPlayerClient类继承IInterface,并定义了一个MediaPlayer客户端的接口,BnMediaPlayerClient继承了BnInterface,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。事实上,根据BnInterface类模版的定义,BnInterface类相当于双继承了BnInterface和ImediaPlayerClient,这是Android一种常用的定义方式。

2.2 mediaplayer.h

对外的接口类,它最主要是定义了一个MediaPlayer类:

class MediaPlayer : public BnMediaPlayerClient

{

public:

MediaPlayer();

~MediaPlayer();

void onFirstRef();

void disconnect();

status_t setDataSource(const char *url);

status_t setDataSource(int fd, int64_t offset, int64_t length);

status_t setVideoSurface(const sp& surface);

status_t setListener(const sp& listener);

status_t prepare();

status_t prepareAsync();

status_t start();

status_t stop();

status_t pause();

bool isPlaying();

status_t getVideoWidth(int *w);

status_t getVideoHeight(int *h);

status_t seekTo(int msec);

status_t getCurrentPosition(int *msec);

status_t getDuration(int *msec);

status_t reset();

status_t setAudioStreamType(int type);

status_t setLooping(int loop);

status_t setVolume(float leftVolume, float rightVolume);

void notify(int msg, int ext1, int ext2);

static sp decode(const char* url, uint32_t *pSampleRate, int*
pNumChannels);

static sp decode(int fd, int64_t offset, int64_t length, uint32_t
*pSampleRate, int* pNumChannels);

//……

}

从接口中可以看出MediaPlayer类刚好实现了一个MediaPlayer的基本操作,例如播放(start)、停止(stop)、暂停(pause)等。

另外的一个类DeathNotifier在MediaPlayer类中定义,它继承了IBinder类中的DeathRecipient类:

class DeathNotifier: public IBinder:: DeathRecipient

{

public:

DeathNotifier() {}

virtual ~DeathNotifier();

virtual void binderDied(const wp& who);

};

事实上,MediaPlayer类正是间接地继承了IBinder,而MediaPlayer:: DeathNotifier类继承了IBinder::
DeathRecipient,这都是为了实现进程间通讯而构建的。

2.3 IMediaPlayer.h

主要的的内容是一个实现MediaPlayer功能的接口:

class IMediaPlayer: public IInterface

{

public:

DECLARE_META_INTERFACE(MediaPlayer);

virtual void disconnect() = 0;

virtual status_t setVideoSurface(const sp& surface) = 0;

virtual status_t prepareAsync() = 0;

virtual status_t start() = 0;

virtual status_t stop() = 0;

virtual status_t pause() = 0;

virtual status_t isPlaying(bool* state) = 0;

virtual status_t getVideoSize(int* w, int* h) = 0;

virtual status_t seekTo(int msec) = 0;

virtual status_t getCurrentPosition(int* msec) = 0;

virtual status_t getDuration(int* msec) = 0;

virtual status_t reset() = 0;

virtual status_t setAudioStreamType(int type) = 0;

virtual status_t setLooping(int loop) = 0;

virtual status_t setVolume(float leftVolume, float rightVolume) = 0;

};

class BnMediaPlayer: public BnInterface

{

public:

virtual status_t onTransact( uint32_t code,

const Parcel& data,

Parcel* reply,

uint32_t flags = 0);

};

在IMediaPlayer类中,主要定义MediaPlayer的功能接口,这个类必须被继承才能够使用。值得注意的是,这些接口和MediaPlayer类的接口有些类似,但是它们并没有直接的关系。事实上,在MediaPlayer类的各种实现中,一般都会通过调用IMediaPlayer类的实现类来完成。

2.4 头文件IMediaPlayerService.h

描述一个MediaPlayer的服务,定义方式如下所示:

class IMediaPlayerService: public IInterface

{

public:

DECLARE_META_INTERFACE(MediaPlayerService);

virtual sp create(pid_t pid, const
sp& client, const char* url) = 0;

virtual sp create(pid_t pid, const
sp& client, int fd, int64_t offset, int64_t length) =
0;

virtual sp decode(const char* url, uint32_t *pSampleRate, int*
pNumChannels) = 0;

virtual sp decode(int fd, int64_t offset, int64_t length, uint32_t
*pSampleRate, int* pNumChannels) = 0;

};

class BnMediaPlayerService: public BnInterface

{

public:

virtual status_t onTransact( uint32_t code,

const Parcel& data,

Parcel* reply,

uint32_t flags = 0);

};

由于有纯虚函数,IMediaPlayerService
以及BnMediaPlayerService必须被继承实现才能够使用,在IMediaPlayerService定义的create和decode等接口,事实上是必须被继承者实现的内容。注意,create的返回值的类型是sp,这个IMediaPlayer正是提供实现功能的接口。

3 实现

3.1 App

在packages/apps/Music/src/com/android/music/里的MediaPlaybackService.java文件中,包含了对MediaPlayer的调用。

在MediaPlaybackService.java中包含对包的引用:

import android.media.MediaPlayer;

在MediaPlaybackService类的内部,定义了MultiPlayer类:

private class MultiPlayer {

private MediaPlayer mMediaPlayer = new MediaPlayer();

}

MultiPlayer类中使用了MediaPlayer类,其中有一些对这个MediaPlayer的调用,调用的过程如下所示:

mMediaPlayer.reset();

mMediaPlayer.setDataSource(path);

mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

reset,setDataSource和setAudioStreamType等接口就是通过JAVA本地调用(JNI)来实现的。

3.2 Jni

在frameworks/base/media/jni/android_media_MediaPlayer.cpp中实现,其中android_media_MediaPlayer_reset函数的实现如下所示:

static void android_media_MediaPlayer_reset(JNIEnv *env, jobject thiz)

{

sp mp = getMediaPlayer(env, thiz);

if (mp == NULL ) {

jniThrowException(env, "java/lang/IllegalStateException", NULL);

return;

}

process_media_player_call( env, thiz, mp->reset(), NULL, NULL );

}

先获取一个MediaPlayer指针,通过对它的调用来实现实际的功能。

register_android_media_MediaPlayer用于将gMethods注册为的类"android/media/MediaPlayer",其实现如下所示。

static int register_android_media_MediaPlayer(JNIEnv *env)

{

jclass clazz;

clazz = env->FindClass("android/media/MediaPlayer");

// ......

return AndroidRuntime::registerNativeMethods(env,
"android/media/MediaPlayer", gMethods, NELEM(gMethods));

}

"android/media/MediaPlayer"对应JAVA的类android.media.MediaPlayer。

3.3 libmedia.so

frameworks/base/media/libmedia/mediaplayer.cpp文件实现mediaplayer.h提供的接口,其中一个重要的片段如下所示:

const sp& MediaPlayer::getMediaPlayerService()

{

Mutex::Autolock _l(mServiceLock);

if (mMediaPlayerService.get() == 0) {

sp sm = defaultServiceManager();

sp binder;

do {

binder = sm->getService(String16("media.player"));

if (binder != 0)

break;

LOGW("MediaPlayerService not published, waiting...");

usleep(500000); // 0.5 s

} while(true);

if (mDeathNotifier == NULL) {

mDeathNotifier = new DeathNotifier();

}

binder->linkToDeath(mDeathNotifier);

mMediaPlayerService = interface_cast(binder);

}

LOGE_IF(mMediaPlayerService==0, "no MediaPlayerService!?");

return mMediaPlayerService;

}

其中最重要的一点是binder =
sm->getService(String16("media.player"));这个调用用来得到一个名称为"media.player"的服务,这个调用返回值的类型为IBinder,根据实现将其转换成类型IMediaPlayerService使用。

一个具体的函数setDataSource如下所示:

status_t MediaPlayer::setDataSource(const char *url)

{

LOGV("setDataSource(%s)", url);

status_t err = UNKNOWN_ERROR;

if (url != NULL) {

const sp& service(getMediaPlayerService());

if (service != 0) {

sp player(service->create(getpid(), this, url));

err = setDataSource(player);

}

}

return err;

}

F. android 怎么播放rtsp流

package com.video.rtsp;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.VideoView;

public class rtspActivity extends Activity {
/** Called when the activity is first created. */

Button playButton ;
VideoView videoView ;
EditText rtspUrl ;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

rtspUrl = (EditText)this.findViewById(R.id.url);
playButton = (Button)this.findViewById(R.id.start_play);
playButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
PlayRtspStream(rtspUrl.getEditableText().toString());
}
});

videoView = (VideoView)this.findViewById(R.id.rtsp_player);

}

//play rtsp stream
private void PlayRtspStream(String rtspUrl){
videoView.setVideoURI(Uri.parse(rtspUrl));
videoView.requestFocus();
videoView.start();
}

}

更多请关注扣丁学堂。

G. Android MediaRecorder 采集AAC的RTP打包。

1.不懂这个

2、3.RTP封装AAC的时候把AAC数据的头去掉,参照rfc3640的mpeg4的audio部分里面有例子,RTP的payload(负载)格式网上有的是,我不知道你是什么情况,我的情况是实现aac的rtsp实时流,然后用vlc播放,主要的就是SDP里的profile-level-id,config等描述的填写,封包什么的rfc里有介绍。

我也是新手,前些日子为了搞这个花了好长时间,有时间看一下rfc3640,希望能对你有所帮助

H. android 怎么播放rtsp流

package com.video.rtsp;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.VideoView;

public class rtspActivity extends Activity {
/** Called when the activity is first created. */

Button playButton ;
VideoView videoView ;
EditText rtspUrl ;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

rtspUrl = (EditText)this.findViewById(R.id.url);
playButton = (Button)this.findViewById(R.id.start_play);
playButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
PlayRtspStream(rtspUrl.getEditableText().toString());
}
});

videoView = (VideoView)this.findViewById(R.id.rtsp_player);

}

//play rtsp stream
private void PlayRtspStream(String rtspUrl){
videoView.setVideoURI(Uri.parse(rtspUrl));
videoView.requestFocus();
videoView.start();
}

}

I. android如何通过rtsp查看网络摄像头

rtsp视频直播流在android上可以直接播放...但是要注意:要rtsp的帧数不要太高,不然解码解不动...

J. 请教大神,android video view播放rtsp格式实时视频,有10秒的延迟,怎么能设

android播放rtsp实时网络串流核心代码如下:

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.VideoView;
public class rtspActivity extends Activity {
/** Called when the activity is first created. */
Button playButton ;
VideoView videoView ;
EditText rtspUrl ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
rtspUrl = (EditText)this.findViewById(R.id.url);
playButton = (Button)this.findViewById(R.id.start_play); playButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
PlayRtspStream(rtspUrl.getEditableText().toString()); } });
videoView = (VideoView)this.findViewById(R.id.rtsp_player); }
//play rtsp stream
private void PlayRtspStream(String rtspUrl){
videoView.setVideoURI(Uri.parse(rtspUrl));
videoView.requestFocus();
videoView.start();
}
}

阅读全文

与rtspandroid视频采集相关的资料

热点内容
小苮儿网盘提取码 浏览:238
怎么给磁盘加密c盘 浏览:381
内核驱动编译v1 浏览:575
韩国电影伦理中文 浏览:67
大乐透复式算法计算器 浏览:845
啄木鸟40部 浏览:502
我的世界服务器版本下载地址 浏览:925
怎么制作一个游戏的服务器 浏览:800
python中xticks用法 浏览:905
西瓜视频解压软心砖 浏览:137
程序员被孤立怎么办 浏览:807
主角秦风重生小说免费全文阅读 浏览:937
电影名卧布吉岛 浏览:161
泰国肉肉电影 浏览:499
电影无处可逃结局是什么 浏览:102
压缩性模量 浏览:352
平安老师讲解压力化解 浏览:459
快递员的电影是什么名字 浏览:780
日本电影叫什么鱼的名字 浏览:663
找书pdf 浏览:392