一个简单的Android命令行播放器


aihuafeng66t
克里斯蒂亚诺诺 2024-01-11 18:34:13 51833 赞同 0 反对 0
分类: 资源 标签: 运维
一个简单的Android命令行播放器

利用:
mediaplayer和SurfaceComposerClient

在native层创建surface,然后指定url进行播放。

环境: Android 8.1 rk3399pro

例如:
TestMediaserver http://172.18.10.76/1.ts

目录结构:

frameworks/av/media/test_player
├── Android.mk
└── TestMediaPlayer.cpp


TestMediaPlayer.cpp:

#define LOG_TAG "test_mediaserver"
#define LOG_NDEBUG 0

#include <media/mediaplayer.h>
#include <media/IMediaHTTPService.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/ISurfaceComposer.h>
#include <ui/DisplayInfo.h>
#include <ui/Rect.h>
#include <ui/Region.h>
#include <android/native_window.h>

using namespace android;

bool gIsEnd;

class TestMediaPlayerListener : public MediaPlayerListener
{
public:
    TestMediaPlayerListener(sp<MediaPlayer>& player):mp(player) {}
    void notify(int msg, int ext1, int ext2, const Parcel *obj)
    {
        (void)msg;
        (void)ext1;
        (void)ext2;
        (void)obj;
        
        switch (msg) 
        {
        
            case MEDIA_INFO:
            {
                ALOGE("MEDIA_INFO,  ext1 : %d, ext2 : %d ", ext1, ext2);
                if (MEDIA_INFO_RENDERING_START == ext1) {
                    ALOGE("begin to rendering frame now!!!!!!!!!");
                }
            }
            break;
            
            case MEDIA_PREPARED:
            {
                ALOGE("MEDIA_PREPARED,  ext1 : %d, ext2 : %d ", ext1, ext2);
                if (mp.get()) 
                {
                    gIsEnd = false;
                    mp->start();
                }
            }
            break;
            
            case MEDIA_ERROR:
                ALOGE("MEDIA_ERROR,  ext1 : %d, ext2 : %d ", ext1, ext2);
            break;
            
            case MEDIA_PLAYBACK_COMPLETE:
            {
                ALOGE("MEDIA_PLAYBACK_COMPLETE,  ext1 : %d, ext2 : %d ", ext1, ext2);
                gIsEnd = true;
            }
            break;
            
            case MEDIA_STOPPED:
            {
                ALOGE("MEDIA_STOPPED,  ext1 : %d, ext2 : %d ", ext1, ext2);
            }
            break;
            
            default:
                break;
        }
        
    }
    
private:
    sp<MediaPlayer>  mp;
};

int main (int argc __unused, char **argv __unused) {
    
    if (argc < 2)
    {
        printf("Use  TestMediaserver  http://xxxxx \n");
        return 0;
    }
    
    int argv_index = 0;
    for(; argv_index<argc; argv_index++)
    {
         printf("argv[%d]: %s \n", argv_index, argv[argv_index]);
    }
    
    String8  url(argv[1]);
    
    bool isStreaming = false;
    if (url.contains("http://") || url.contains("https://"))
    {
        printf("This is a streaming playback url: %s\n", url.string());
        isStreaming = true;
    }
    else
    {
        printf("local file \n");
    }
    
    sp<MediaPlayer> mp = new MediaPlayer();
    
    if (true == isStreaming)
    {
        sp<IMediaHTTPService> httpService = NULL;
        mp->setDataSource(
                    httpService,
                    url.string(),
                    NULL);
    }
    else
    {
        // open fd in here
    }
    
    // create a client to surfaceflinger
    sp<SurfaceComposerClient> client = new SurfaceComposerClient();
    
    sp<SurfaceControl> surfaceControl = 
    client->createSurface( String8("resize"), 
    800, 
    600, 
    PIXEL_FORMAT_RGB_565, 0);
    
    sp<Surface> surface = surfaceControl->getSurface();
    SurfaceComposerClient::openGlobalTransaction();
    surfaceControl->setLayer(100000);
    SurfaceComposerClient::closeGlobalTransaction();
    
    mp->setVideoSurfaceTexture( surface->getIGraphicBufferProducer() );
    
    sp<TestMediaPlayerListener> listener = new TestMediaPlayerListener(mp);
    
    mp->setListener(listener);
    
    mp->prepareAsync();
    
    while(1)
    {
        if (true == gIsEnd)
        {
            ALOGE("Exit!!!!!!!!!!!!!!!");
            break;
        }
        usleep(1000);
    }
    
    SurfaceComposerClient::openGlobalTransaction();
    surfaceControl->clear();
    SurfaceComposerClient::closeGlobalTransaction();
    
    mp->reset();
    ALOGE(" End !!!!!!!!!!");
    
    return 0;
}

Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
        TestMediaPlayer.cpp

LOCAL_SHARED_LIBRARIES := \
        liblog \
        libmediaplayerservice \
        libmedia \
        libutils \
        libbinder \
        libgui \

LOCAL_C_INCLUDES := \
        frameworks/av
 
 

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
克里斯蒂亚诺诺L1
粉丝 0 资源 831 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  132
统信桌面专业版【全盘安装UOS系统】介绍  132
银河麒麟桌面操作系统安装佳能打印机驱动方法  122
银河麒麟桌面操作系统 V10-SP1用户密码修改  111
麒麟系统连接打印机常见问题及解决方法  35
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
麒麟系统连接打印机常见问题及解决方法 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益210.13元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!