新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → C++流媒体解码编程技巧讨论[灌水] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7048 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: C++流媒体解码编程技巧讨论[灌水] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     小男孩123 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:9
      积分:86
      门派:XML.ORG.CN
      注册:2009/10/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给小男孩123发送一个短消息 把小男孩123加入好友 查看小男孩123的个人资料 搜索小男孩123在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看小男孩123的博客楼主
    发贴心情 C++流媒体解码编程技巧讨论[灌水]

    C/C++以速度快,性能高而著称,C/C++本质是一种中级的计算机程序设计语言,它即保证了类似低级汇编语言效率,同时也坚固类似高级语言所具有的特点,C/C++的程序编写不依赖于计算机的硬件,所以你即可以拿它来编写系统软件,也可以用来开发应用软件,它的应用越乎我们的想像,除了PC机上的开发外,也被广泛的用在单片机,嵌入式等手机开发等领域,目前市场上流行的大部分程序都是建立在C语言的基础上来完成的

    现在”3G网络”的概念成为了人们对未来网络最常见的一种说法,不过什么是3g呢,其实它的全称为3rd Generation,即第三代数字通信。它能够处理比以前更多的服务,如图像,音视频等多种多媒体形式提供给用户,而它和前两代的唯一区别就是3G网络最大的速率可以达到2Mbps,远远超过了前两代网络,这使得手机影院等大数据流应用,可以实现,为用户带来更好的移动体验。电信运营商及通信设备制造商都非常关注。

    3G网络的到来,为移运运营商提供了商机,目前中国三个运营商纷纷引入自己的3g标准,其中,移动做为3g的先导者,自然不会错失这个机会,在今年08年推出了自己的手机系统OPhone OS平台,OPhone OS平台本身是基于Linux开放系统所设计,并不断的完善,相信不少见过OPhone OS手机的用户都被它的惊人的人性化界面所打动,其实OPhone OS系统所拥有的不单单是这些,为了极大的满足人们日益的需求,OPhone OS平台除保留了Gmail,Gtalk等原有业务外,还内置了中国移动的全部增值服务,为用户提供了更贴心的体验。同时移动还推出了线上软件销售商店Mobile Market,为个人和公司提供了面向移动拥有的5亿手机用户和庞大商业客户的销售机会。这样看来,手机上的个人娱乐软件和商业管理软件,如果中国移动大力推动,会带来很大市场。联通、电信虽然手机用户规模相对小些,但相信也会大力发展。

    这也是我为什么要在下面向大家,以OPhone平台为例,介绍移动平台上流媒体编成的技巧。

    话说回来,和Linux一样,OPhone OS保留了原有的开发语言C/C++,Java,不过OPhone OS对其进行了极大的优化,C/C++虽然效率高,不过这样并不安全,因为恶意的程序,会使得系统变得不安全,Java虽然很安全,不过效率太低,不利于大的项目开发,而且单纯的Java程序并不能完成一些特定的任务,在这种情况下,OPhone OS平台寻求到了完美的解决方案,JNI(Java Native Interface,Java本地化方法)技术运用而生,JNI简单的说,是让C/C++做完底层开发,并为Java提供接口以为调用,这样,JNI方式即不失低效率,也保证了平台安全性

    OPhone OS平台的流媒体支持
    OpenCore模块为OPhone OS平台提供了核心的多媒体支持,它处于整个平台的Libraries层,以os的方式为上层语言提供服务,OpenCore主要是用C/C++来实现,开发者可以修改及移植别的编/解码器,然后通过上层软件使用,OpenCore不能直接被用户所使用,必需借住其它的方式调用,如Java的JNI方式,OpenCore模块内置了OpenMAX1L interface接口进行扩展,这种技术分离了具体硬件的依赖,方便了开发者的移植,目前OPhone OS平台提供了3GP,MP4,ACV等媒体格式的支持,如果是在线看的话,还支持http,rtp等协议

    OPhone OS媒体源码文件
    曾经写过一个关于音频部分的,介绍过如何下载这部分的源码,接着我简单讲一下相关的C代码
    Opencore目录包括了所有关于媒体方面的源码,其中最重要的是android,engines和codecs_v2,protocols四个目录,android主要包括了一些纯虚类,为适配器,engines为媒体引擎部分,主要是OPhone OS平台内置的编解码程序,后一个为第三方所提供,为OPhone OS系统的扩展应用,protocols目录里提供了在线流媒体的协议,包括http,rtp,rtsp,我们重点说一下protocols的结构,
    opencore\protocols\http_parcom\include\http_composer.h头文件中enum HTTPVersion
    {
        HTTP_V1_0 = 0,
        HTTP_V1_1
    };

    // HTTPMethod enum
    enum HTTPMethod
    {
        HTTP_METHOD_GET = 0,            // both HTTP 1.0 and HTTP 1.1
        HTTP_METHOD_HEAD,           // both HTTP 1.0 and HTTP 1.1
        HTTP_METHOD_POST,           // both HTTP 1.0 and HTTP 1.1
        HTTP_METHOD_DELETE,         // both HTTP 1.0 and HTTP 1.1
        HTTP_METHOD_LINK,           // HTTP 1.0 only
        HTTP_METHOD_UNLINK,         // HTTP 1.0 only
        HTTP_METHOD_OPTIONS,        // HTTP 1.1 only
        HTTP_METHOD_PUT,            // HTTP 1.1 only
        HTTP_METHOD_TRACE,          // HTTP 1.1 only
        HTTP_METHOD_CONNECT,        // HTTP 1.1 only
    };
    列出来http协议下流媒体的支持的http协议为1.0和1.1,从中我们可以看出来,OPhone OS媒体部分支持Get和Post方式播放数据

    下面我们来通过Java的JNI方式去调用,我们以SDK中的MediaPlayerDemo_Video.java说明
    package com.example.android.apis.media;

    import com.example.android.apis.R;
    import com.example.android.apis.app.AlarmController;

    import android.app.Activity;
    import android.graphics.PixelFormat;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnBufferingUpdateListener;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;


    public class MediaPlayerDemo_Video extends Activity implements
            OnBufferingUpdateListener, OnCompletionListener,
            MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {

        private static final String TAG = "MediaPlayerDemo";
        private int mVideoWidth;
        private int mVideoHeight;
        private MediaPlayer mMediaPlayer;
        private SurfaceView mPreview;
        private SurfaceHolder holder;
        private String path;
        private Bundle extras;
        private static final String MEDIA = "media";
        private static final int LOCAL_AUDIO = 1;
        private static final int STREAM_AUDIO = 2;
        private static final int RESOURCES_AUDIO = 3;
        private static final int LOCAL_VIDEO = 4;
        private static final int STREAM_VIDEO = 5;

        /**
         *
         * Called when the activity is first created.
         */
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.mediaplayer_2);
            mPreview = (SurfaceView) findViewById(R.id.surface);
            holder = mPreview.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            extras = getIntent().getExtras();

        }

        private void playVideo(Integer Media) {
            try {

                switch (Media) {
                    case LOCAL_VIDEO:
                        /*
                         * TODO: Set the path variable to a local media file path.
                         */
                        path = "";
                        if (path == "") {
                            // Tell the user to provide a media file URL.
                            Toast
                                    .makeText(
                                            MediaPlayerDemo_Video.this,
                                            "Please edit MediaPlayerDemo_Video Activity, "
                                                    + "and set the path variable to your media file path."
                                                    + " Your media file must be stored on sdcard.",
                                            Toast.LENGTH_LONG).show();

                        }
                        break;
                    case STREAM_VIDEO:
                        /*
                         * TODO: Set path variable to progressive streamable mp4 or
                         * 3gpp format URL. Http protocol should be used.
                         * Mediaplayer can only play "progressive streamable
                         * contents" which basically means: 1. the movie atom has to
                         * precede all the media data atoms. 2. The clip has to be
                         * reasonably interleaved.
                         *
                         */
                        path = "http://xxx.xxx.xxx.xxx/xxx.3gp";
                        if (path == "") {
                            // Tell the user to provide a media file URL.
                            Toast
                                    .makeText(
                                            MediaPlayerDemo_Video.this,
                                            "Please edit MediaPlayerDemo_Video Activity,"
                                                    + " and set the path variable to your media file URL.",
                                            Toast.LENGTH_LONG).show();

                        }

                        break;


                }

                // Create a new media player and set the listeners
                mMediaPlayer = new MediaPlayer();
                mMediaPlayer.setDataSource(path);
                mMediaPlayer.setDisplay(holder);
                mMediaPlayer.prepare();
                mMediaPlayer.setOnBufferingUpdateListener(this);
                mMediaPlayer.setOnCompletionListener(this);
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);


            } catch (Exception e) {
                Log.e(TAG, "error: " + e.getMessage(), e);
            }
        }

        public void onBufferingUpdate(MediaPlayer arg0, int percent) {
            Log.d(TAG, "onBufferingUpdate percent:" + percent);

        }

        public void onCompletion(MediaPlayer arg0) {
            Log.d(TAG, "onCompletion called");
        }

        public void onPrepared(MediaPlayer mediaplayer) {
            Log.d(TAG, "onPrepared called");
            mVideoWidth = mMediaPlayer.getVideoWidth();
            mVideoHeight = mMediaPlayer.getVideoHeight();
            if (mVideoWidth != 0 && mVideoHeight != 0) {
                holder.setFixedSize(mVideoWidth, mVideoHeight);
                mMediaPlayer.start();
            }

        }

        public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
            Log.d(TAG, "surfaceChanged called");

        }

        public void surfaceDestroyed(SurfaceHolder surfaceholder) {
            Log.d(TAG, "surfaceDestroyed called");
        }


        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            Log.d(TAG, "surfaceCreated called");
            playVideo(extras.getInt(MEDIA));


        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            // TODO Auto-generated method stub
            if (mMediaPlayer != null) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }

        }

    }

    case STREAM_VIDEO:
    path = "http://xxx.xxx.xxx.xxx/xxx.3gp";
    这里大家可以为MediaPlayer指定一个URL,播放器会为这个通过http播放媒体数据OPhone OS平台目前只支持HTTP download方式来播放media文件. 下一个版本会支持streaming流媒体,以前程序的巧妙之处在于,JNI方式将java和C/C++分工来完成一个复杂的任务,目前在流媒体方式,大家可以下载Spb TV(OPhone OS平台下的流媒体电视)

    如果对OPhone平台有兴趣,提供一个学习网站
    http://www.ophonesdn.com,上面的开发入门资料很丰富,同时还有个发帖赢OPhone手机活动,鼓励大家分享经验,同时也可以获得体验一下OPhone手机如何酷炫的机会。移动最近刚跟一批工程师签约了他们开发的软件,看样子这确实会给大家带来一些更好发展的机会。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/13 20:45:00
     
     稻飞虱D 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:30
      积分:197
      门派:XML.ORG.CN
      注册:2009/9/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给稻飞虱D发送一个短消息 把稻飞虱D加入好友 查看稻飞虱D的个人资料 搜索稻飞虱D在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看稻飞虱D的博客2
    发贴心情 
    感谢楼主分享自己的总结
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/15 12:27:00
     
     小男孩123 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:9
      积分:86
      门派:XML.ORG.CN
      注册:2009/10/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给小男孩123发送一个短消息 把小男孩123加入好友 查看小男孩123的个人资料 搜索小男孩123在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看小男孩123的博客3
    发贴心情 
    大家多来看看,这篇文章有好处的
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/16 15:37:00
     
     猪猪887 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:11
      积分:95
      门派:XML.ORG.CN
      注册:2009/10/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给猪猪887发送一个短消息 把猪猪887加入好友 查看猪猪887的个人资料 搜索猪猪887在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看猪猪887的博客4
    发贴心情 
    这个肯定还需要导入整个apiDemo目录,因为.java文件用到一些其它目录的东西,直接打开这个源码,会提示你找不到部分资料的,新手运行的话,需要注意这个,
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/19 18:35:00
     
     猪猪887 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:11
      积分:95
      门派:XML.ORG.CN
      注册:2009/10/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给猪猪887发送一个短消息 把猪猪887加入好友 查看猪猪887的个人资料 搜索猪猪887在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看猪猪887的博客5
    发贴心情 
    刚才我上ophoneSDN去看了,发现资料很多,以后可以好好学学了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/22 16:08:00
     
     稻飞虱D 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:30
      积分:197
      门派:XML.ORG.CN
      注册:2009/9/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给稻飞虱D发送一个短消息 把稻飞虱D加入好友 查看稻飞虱D的个人资料 搜索稻飞虱D在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看稻飞虱D的博客6
    发贴心情 
    我认为JNI是个值得研究的东西。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/24 23:06:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客7
    发贴心情 
    JNI方式可以深入研究一下。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/11/9 17:19:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/13 21:38:53

    本主题贴数7,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    125.000ms