精华内容
下载资源
问答
  • 一、前言 随着多媒体硬件环境和软件环境的不断完善,目前,大部分计算机软件...然而,由于多媒体软件涉及的媒体复杂多样、开发周期短并且需要多种专业人员参与,因此,为了能进行实用高效的开发,必须选用简单易用、开
    一、前言
    

      随着多媒体硬件环境和软件环境的不断完善,目前,大部分计算机软件开发中都涉及多媒体软件技术的应用。

      进行多媒体应用程序设计,从原理上说,可以采用从C++到多媒体专用开发系统(如TOOLBOOK、AUTHORWARE、DIRECTOR)等多种层次的工具。然而,由于多媒体软件涉及的媒体复杂多样、开发周期短并且需要多种专业人员参与,因此,为了能进行实用高效的开发,必须选用简单易用、开发效率高的软件。

      Visual Basic是Microsoft公司开发的Windows编程工具软件。由于它具有先进的设计思想、快速易掌握的使用方法及控制媒体对象手段灵活多样等特点,受到了多媒体软件开发人员的关注和青睐,也因此成为多媒体应用程序开发的理想工具。

      二、Visual Basic的多媒体控件MCI.OCX

      MCI(媒体控制接口)是Microsoft公司为实现Windows系统下设备无关性而提供的媒体控制接口标准。用户可以方便地使用MCI控制标准的多媒体设备。

      MCI包含在Windows多媒体扩展的MMSYSTEM模块中,用来协调事件间以及MCI设备驱动程序间的通讯,提供了与设备无关的接口属性。通常应用程序是通过指定一个MCI设备类型来区分MCI设备,设备类型指明了当前实际使用设备的物理类型,不同的设备类型使用不同的控件属性来进行描述(见附表1)。

      从使用的控制方式上来说,MCI设备分为复合和简单两类。一个简单MCI设备并不需要设备元素。例如,CD音频和音碟机就是在一个已经安装好了的硬盘上工作的,它们不需要应用程序为其操作的媒体内容提供任何信息。但对于复合的MCI设备,就需要应用程序提供设备元素,即一个包含全部路径名的源数据文件或目的文件。

      Visual Basic语言的Custom Control(用户控制部件)概念体现了当今软件设计的发展潮流--面向对象技术,编程者可以在Visual Basic的工具箱(Toolbox)中嵌入各式各样五花八门的用户控件,每个用户控制部件都有一定的属性和操作方法,编程者通过属性的设置和方法的控制完成特定的功能。为了方便地控制多媒体,在专业版Visual Basic工具箱中提供了一个用于多媒体目的的用户控件--MCI.OCX。

      多媒体MCI控件MCI.OCX专用于对多媒体控制接口MCI设备的多媒体数据文件实施记录和回放,从目的效果上来说,该控件通过一组按钮来发出种种设备控制命令以实现对诸如:音频面板、MIDI音序器、CD-ROM驱动器、音频CD播放机、录像带播放、录音带录放等设备的控制。在Visual Basic程序设计时,当在表中加入多媒体MCI控件时(在工具箱内双击MCI控件),则出现下列按钮群:向前(Prev)、向后(Next)、播放(Play)、暂停(Pause)、返回(Back)、单步(Step)、停止(Stop)、记录(Record)和出带(Eject)。

      应用程序对MCI的这组按钮操作非常灵活方便,如当我们打开一个MCI设备后,就可以根据该设备类型的属性随时从控件中选择合适的状态按钮来表示即刻设备的物理状态。所有MCI控件可以有下列几种方式来编程:⑴控件及其各按钮的可见性和使能性;⑵可变或完全对控件进行重新定义;⑶在一个窗口表格中可以同时控制多个设备。

      三、多媒体控制部件MCI.OCX的调用

      在Visual Basic3.0专业版中,多媒体控件MCI.OCX(在Visual Basic 3.0和4.0中,多媒体控件的扩展名为.VBX)是作为可选用部件提供的。为了使用它,首先要执行FileAdd File菜单命令,把Windowssystem目录下的MCI.OCX加入到工具箱(Toolbox)中,这时会在工具箱中出现相应的MCI.OCX图标。如果使用的是Visual Basic4.0版(或5.0版),选择oolsCustom Controls菜单或直接键入Ctrl+T,即可出现对话框,在Available Controls列表框中选中Microsoft Multimedia Controls条目旁边的检查框,同样会在工具箱中出现MCI.OCX图标。

      双击工具箱中的多媒体控件MCI.OCX图标,调用MCI.OCX控件之后,表单FORM中将出现一排灰色的媒体控制按钮(九个)。

      四、Visual Basic多媒体应用程序设计步骤

      多媒体控件MCI.OCX包含有一组高级的与设备无关的控制命令。在使用该多媒体控件时,首先用OPEN命令打开MCI设备(多媒体设备)并建立一个与之对应的文件,以便来进行录或放等操作(但是对诸如CDAudio、VCR和录像带不能使用相应文件)。一旦设备打开成功,就可以向它发出各种操作命令(见附表的按钮命令)来完成指定的工作任务。最后记住,要用Close命令来关闭设备和数据文件。

      使用MCI.OCX来进行多媒体应用程序开发是很方便的,因为大多数属性都是容易理解的,其中Command属性尤为重要,它是在运行过程中向多媒体设备发命令。格式为:

      Form.Mmcontrol.Command=cmdstring$

      其中,cmdstring$变量是如下可执行命令名:Open、Close、Play、Pause、Stop、Back、Step、Prev、Next、Seek、Record、Eject、Sound和Save。一旦给其命令设置,它就立刻执行,所发生的错误存在Error属性中。

      下面以播放DEMO.WAV(波形文件)文件为例,说明Visual Basic多媒体应用程序设计步骤。

      首先,创建一个包含有多媒体控件(MCI.OCX)的表格(Form),于是屏幕上显示出形状类似录音机的控制键,不过这时多媒体控制部件是不能马上拿来用的(各键呈灰色),须通过程序代码来改变键的状态。

      其次,在Form_Load过程中,插入相应程序代码。如下

      Sub Form_Load()

      ‘在发出 OPEN 命令前要设置多媒体设备的属性

      Form1.MMControl1.Notify=False

      Form1.MMControl1.Wait=True

      Form1.MMControl1.Shareable=False

      Form1.MMControl1.DeviceType="WaveAudio"

      Form1.MMControl1.FileName="c:windowss

      Mmdatademo.wav"

      Form1.MMControl1.Command="Open"

      End Sub

      最后,运行上述程序,控制键呈黑色,这时就可以使用Play、Record等键操作数据文件DEMO.WAV了。例如用鼠标点按Play键就能听到.WAV音效(计算机应装有发音设备)。

      通过上面陈述,不难发现,Visual Basic利用多媒体控件MCI.OCX设贫嗝教逵τ贸?序很容易掌握。

      五、Visual Basic多媒体应用程序设计实例

      1、播放CD音乐

      在很多多媒体软件系统中,都提供了激光唱盘的播放软件,利用多媒体控件MCI.OCX,我们可以轻松地编制出符合自己使用要求的简易激光唱盘播放机。

      表1给出了简易CD播放器的主要控制部件定义,其后是对应于各个触发事件的源程序代码。

      完整的源程序清单如下:

      `CD播放机实用程序

      `运行程序前请在CD-ROM驱动器中装入一张激光唱碟’“LOAD”按钮触发事件

      Private Sub Command1_Click()

      `装入CD唱片

      On Error GoTo MCI_ERROR

      MMControl1.Command = "Open"

      On Error GoTo 0

      `设置时间格式

      MMControl1.TimeFormat = vbMCIFormatTmsf

      `关闭LOAD按钮,显示图片

      Command1.Enabled = False

      Picture1.Picture = Picture3.Picture

      ` 设置初始轨道数

      Label1.Caption = "1"

      Exit Sub

      MCI_ERROR:

      DisplayErrorMessageBox

      Resume MCI_EXIT

      MCI_EXIT:

      Unload CD

      End Sub

      Private Sub Form_Load()

      MMControl1.Wait = True

      MMControl1.UpdateInterval = 0

      ` 设置设备类型

      MMControl1.DeviceType = "CDAudio"

      `设置缺省轨道数为0

      Label1.Caption = "0"

      nd Sub

      Private Sub Form_Unload(Cancel As Integer)

      MCITest.Show

      End Sub

      ’“出带”按钮触发事件

      Private Sub MMControl1_EjectClick(Cancel As Integer)

      Command1.Enabled = True

      Picture1.Picture = Picture2.Picture

      MMControl1.UpdateInterval = 0

      On Error GoTo MCI_ERROR2

      MMControl1.Command = "Eject"

      MMControl1.Command = "Close"

      On Error GoTo 0

      Label1.Caption = "0"

      Label3.BackColor = &H404040

      Exit Sub

      MCI_ERROR2:

      DisplayErrorMessageBox

      Resume Next

      End Sub

      ’“向前”按钮触发事件

      Private Sub MMControl1_NextCompleted(ErrorCode As Long)

      Label1.Caption = Str$(MMControl1.Track)

      End Sub

      ’“暂停”按钮触发事件

      Private Sub MMControl1_PauseClick(Cancel As Integer)

      MMControl1.UpdateInterval = 0

      Label3.BackColor = &H404040

      End Sub

      ’“播放”按钮触发事件

      Private Sub MMControl1_PlayClick(Cancel As Integer)

      MMControl1.UpdateInterval = 1000

      Label1.Caption = Str$(MMControl1.Track)

      End Sub

      ’“向后”按钮触发事件

      Private Sub MMControl1_PrevCompleted(ErrorCode As Long)

      Label1.Caption = Str$(MMControl1.Track)

      End Sub

      Private Sub MMControl1_StatusUpdate()

      Label1.Caption = Str$(MMControl1.Position And &HFF)

      If MMControl1.Mode = vbMCIModePlay Then

      Label3.BackColor = &H80FF&

      Else

      Label3.BackColor = &H404040

      End If

      End Sub

      ’“停止”按钮触发事件

      Private Sub MMControl1_StopClick(Cancel As Integer)

      MMControl1.UpdateInterval = 0

      Label3.BackColor = &H404040

      MMControl1.To = MMControl1.Start

      MMControl1.Command = "Seek"

      MMControl1.Track = 1

      Label1.Caption = "1"

      End Sub

      2、播放AVI(音频视频接口)文件

      电影(包括声音和图像)是广大计算机工作者最为关心的媒体信息之一,电影处理技术也是多媒体关键技术之一。而在多媒体系统中,AVI(Audio Video Interface,音频视频接口)文件是存储电影(包括声音和图像)的标准格式,这些AVI文件一般是通过捕获实时视频信号得来的,也可以通过扫描仪获取图像或者使用动画制作软件得到。于是,屏幕窗口上的音频视频操作,就变成了对AVI文件(文件后缀为AVI)的处理。在实际工作中,播放AVI文件(即影片)的方法有许多种,而其中以利用Visual Basic的多媒体控件方法最为简单、方便。下面以一个具体实例来说明如何播放AVI文件:假设用户当前目录下有名字为DEMO.AVI的视频音频文件,则利用Visul Basic播放该影片需要经过如下步骤:

      (1)在Visual Basic的窗体中加入一个MMControl多媒体控件、一个PictureBox图片框控件和两个ComandButton命令按钮部件;

      (2)设置各个控件的属性,其中窗体命名为Form1,MMControl多媒体控件命名为MMControl1、PictureBox图片框控件命名为Picture1、两个ComandButton命令按钮控件分别命名为Play和Close;

      (3)编写各触发事件源程序代码并且运行。源程序代码为:

      Private Sub Play_Click()

      MMControl1.Filename = "DEMO.AVI"

      MMControl1.DeviceType= = "AVIVIDEO"

      MMControl1.hWndDisplay = Picture1.hWnd

      MMControl1.Command = "OPEN"

      MMControl1.To = 1

      MMControl1.Command = "SEEK"

      MMControl1.Command = "PLAY"

      End Sub

      Private Sub Close_Click()

      MMControl1.Command = "STOP"

      MMControl1.Command = "CLOSE"

      End Sub

      值得注意的是:在播放AVI文件之前,首先应该把AVI(音频视频)驱动程序安装在Windows下。AVI的驱动程序名为MCIAVI.DRV,必须将它拷贝到WINDOWSSYSTEM目录下,同时在SYSTEM.INI文件的[MCI]部分加上:

      AVIVIDEO=MCIAVI.DRV

      这样,运行Windows时,Windows会自动地将AVI的驱动程序安装好。

      以上仅描述了利用多媒体控制部件播放音频文件(.WAV)、CD唱片和音频视频文件(.AVI)的操作过程。实际上利用多媒体控制部件同样可以播放动画文件(.FLI、.FLC)、MIDI文件等其他媒体信息。

      六、结束语

      通过前面论述,不难看出:利用Visual Basic提供的多媒体控制部件MCI.OCX,广大计算机用户可以方便、快捷、高效率地开发出各种多媒体应用程序。但需要强调的是:开发设计Visual Basic多媒体应用程序,除了可以利用多媒体控制部件以外,还可以采用其他手段,例如通过调用API函数等等(鉴于篇幅,这里未做讨论)。可见, Visual Basic确实是专业与非专业多媒体软件开发人员共同拥有的理想开发工具。

      附表1 MCI设备类型定义

      设备类型 设备描述

      CDAudio 激光唱盘播放设备

      DAT 数字化磁带音频播放机

      DigitalVideo 动态数字视频图像设备

      Animation 动画播放设备

      Other 未给出标准定义的MCI设备

      Overlay 模拟视频图像叠加设备

      Sequence MIDI音序发生器

      VCR 可以使用程序控制的磁盘录像机

      VideoDisc 可以使用程序控制的激光视盘机

      WaveAudio 播放数字化波形音频的设备???

      附表2 多媒体控制部件特有事件列表

      事件 说明

      Done 完成MCI命令动作(Notify为真)

      ButtonClick 单击按钮

      ButtonCompleted 按钮执行命令完成

      ButtonGetFocus 按钮获得输入焦点

      ButtonLostFocus 按钮失去输入焦点

      StatusUpdate 更新媒体控制对象的状态信息 

    展开全文
  • Android多媒体开发

    千次阅读 2016-10-02 12:38:29
    Android多媒体开发系列文章 Android多媒体开发:录音机 ...一般理解为多种媒体的综合 多媒体是计算机和视频技术的结合,实际上它是两个媒体;声音和图像,或者用现在的术语:音响和电视。 多媒体(Multi

    Android多媒体开发系列文章

    1. Android多媒体开发:录音机
    2. Android多媒体开发:照相机
    3. TextureView+MediaPlayer实现在线短视频播放
    4. Android多媒体开发:第三方框架

    一、什么是多媒体

    • 多媒体(duō méi tǐ) 的英文单词是Multimedia,它由media和multi两部分组成。一般理解为多种媒体的综合

    • 多媒体是计算机和视频技术的结合,实际上它是两个媒体;声音和图像,或者用现在的术语:音响和电视。

    • 多媒体(Multimedia),在计算机系统中,组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体

    • 使用的媒体包括文字、图片、照片、声音 (包含音乐、语音旁白、特殊音效)、动画和影片,以及程式所提供的互动功能

    • 多媒体是超媒体(Hypermedia)系统中的一个子集,而超媒体系统是使用超链接 (Hyperlink)构成的全球信息系统

    • 全球信息系统是因特网上使用 TCP/IP 协议和 UDP/IP 协议

    二、音乐播放器

    Android 官方提供了MediaPlayer 核心类,用于播放音乐,其状态流程如下图所示。MediaPlayer 必须严格按照状态图操作,否则就会出现错误,这些错误都是底层抛出,严格按照状态图操作的话一般就不会出问题。

    MediaPlayer,原生的API,可以播放音视频,但是支持的格式比较少,实际开发中用的比较少,但是还是很有必要学习,熟悉API,因为Vitamio框架的API大部分跟原生的API是一样的

    1、MediaPlayer使用流程图

    这里写图片描述

    2、MediaPlayer核心方法

    方法 说明
    create() 播放本地res/raw/目录下的资源
    reset() 重置为初始状态
    setAudioStreamType() 设置音乐格式,例如:AudioManager.STREAM_MUSIC
    setDataSource() 设置音频源,本地网络资源均可
    prepare() 播放前的准备工作
    prepareAsync() 异步进行准备工作,播放网络音频的时候使用
    start() 开始或恢复播放
    pause() 暂停播放
    stop() 停止播放
    release() 释放资源
    getDuration() 获取音乐最大长度(毫秒单位)
    getCurrentPosition() 获取当前的播放进度
    seekTo() 拖拽进度
    setDisplay() 设置输出画面
    setOnPreparedListener() 设置准备监听

     
    为了演示MediaPlayer 的使用,我们需要提前准备一个mp3 文件放到sdcard 中

    需求:制作一个播放器,能够播放/暂停/停止音乐文件,并且添加一个SeekBar(可以拖拽的ProgressBar),当音乐播放时SeekBar 也会不断的跟新当前的进度,当用户拖动SeekBar 时可以更改播放的进度

    这里写图片描述

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="play"
                android:text="播放"/>
    
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="pause"
                android:text="暂停"/>
    
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="stop"
                android:text="停止"/>
    
        </LinearLayout>
    
        <SeekBar
            android:id="@+id/sb"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    

    代码实现

    public class MainActivity extends Activity implements OnSeekBarChangeListener {
    
            private SeekBar     sb;
            private MediaPlayer player;
            private int         duration;
            // 播放器的几个状态
            private static final int PLAYING  = 1;// 播放状态
            private static final int PAUSING  = 2;// 暂停状态
            private static final int STOPPING = 3;// 停止状态
            private volatile     int CURRENT  = 0;// 当前状态
            private Timer timer;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                sb = (SeekBar) findViewById(R.id.sb);
                //设置拖动监听
                sb.setOnSeekBarChangeListener(this);
            }
    
            //播放
            public void play(View view) {
                if (player != null) {
                    if (CURRENT == PLAYING) {
                        Toast.makeText(this, "音乐已经在播放了", Toast.LENGTH_SHORT).show();
                        return;
                    } else if (CURRENT == PAUSING) {
                        player.start();
                        CURRENT = PLAYING;
                        return;
                    }
                }
                try {
                    //创建一个播放器对象
                    player = new MediaPlayer();
                    //给播放器设置音乐路径
                    player.setDataSource("/mnt/sdcard/test.mp3");
                    //设置音乐格式
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    //准备
                    player.prepare();
                    //获取音乐最大长度(毫秒单位)
                    duration = player.getDuration();
                    //给SeekBar 设置最大值
                    sb.setMax(duration);
                    //音乐开始播放
                    player.start();
                    //设置当前的状态为播放
                    CURRENT = PLAYING;
                    if (timer == null) {
                        //创建定时器
                        timer = new Timer();
                    }
                    /**
                     * 参数1:匿名内部类,相当于Runnable 类
                     * 参数2:第一次延时多长时间(毫秒)后执行,0 则代表立即执行
                     * 参数3:每隔多长时间(毫秒)执行一次
                     */
                    timer.schedule(new TimerTask() {
    
                        @Override
                        public void run() {//该方法每1 秒被调用一次
                            if (CURRENT == PLAYING) {
                                runOnUiThread(new Runnable() {
    
                                    @Override
                                    public void run() {
                                        //双重判断,尽可能避免线程问题,因为该段代码时在主线程中的,
                                        //第一次判断是在子线程中进行的
                                        if (player != null && CURRENT == PLAYING) {
                                            //获取当前的播放进度
                                            int currentPosition = player.getCurrentPosition();
                                            //设置给SeekBar
                                            sb.setProgress(currentPosition);
                                        }
                                    }
                                });
                            }
    
                        }
                    }, 0, 1000);
    
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(this, "音乐播放失败" + e, 0).show();
                }
            }
    
            /**
             * 暂停
             */
            public void pause(View view) {
                if (player != null && CURRENT == PLAYING) {
                    player.pause();
                    CURRENT = PAUSING;
                }
            }
    
            /**
             * 停止
             */
            public void stop(View view) {
                if (player != null) {
                    if (CURRENT == PLAYING || CURRENT == PAUSING) {
                        CURRENT = STOPPING;
                        //取消定时器
                        timer.cancel();
                        timer = null;
                        player.stop();
                        player.reset();
                        player.release();
                        player = null;
                        sb.setProgress(0);
                    }
                }
            }
    
            /*
            * 拖动过程中回调多次
            */
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (player == null) {
                    sb.setProgress(0);
                } else {
                    player.seekTo(progress);
                }
            }
    
            /*
            * 开始拖动前回调一次
            */
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                if (player == null) {
                    Toast.makeText(this, "音乐播放器还未开始", Toast.LENGTH_SHORT).show();
                }
            }
    
            /*
            * 结束拖动后回调一次
            */
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
    
            @Override
            protected void onDestroy() {
                super.onDestroy();
                stop(null);
            }
    
        }

    3、播放本地res/raw/目录下的资源

    MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
    mediaPlayer.start(); // no need to call prepare(); create() does that for you

    4、播放本地URI资源

    Uri myUri = ....; // initialize Uri here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(getApplicationContext(), myUri);
    mediaPlayer.prepare();
    mediaPlayer.start();

    5、播放网络资源

    String url = "http://........"; // your URL here
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDataSource(url);
    mediaPlayer.prepare(); // might take long! (for buffering, etc)
    mediaPlayer.start();

    6、异步准备

    String url = "http://........"; // your URL here
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });

    7、在后台Service异步执行播放任务

    public class MyService extends Service implements MediaPlayer.OnPreparedListener {
        MediaPlayer mMediaPlayer;
        private static final String ACTION_PLAY = "com.example.action.PLAY";
        MediaPlayer mMediaPlayer = null;
    
        public int onStartCommand(Intent intent, int flags, int startId) {
            ...
            if (intent.getAction().equals(ACTION_PLAY)) {
                mMediaPlayer = ... // initialize it here
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.prepareAsync(); // prepare async to not block main thread
            }
        }
    
        /** Called when MediaPlayer is ready */
        public void onPrepared(MediaPlayer player) {
            player.start();
        }
    }
    
     public void initMediaPlayer() {
            // ...initialize the MediaPlayer here...
    
            mMediaPlayer.setOnErrorListener(this);
        }
    
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            // ... react appropriately ...
            // The MediaPlayer has moved to the Error state, must be reset!
        }
    

    8、在手机睡眠时使用唤醒锁

    mMediaPlayer = new MediaPlayer();
    // ... other initialization here ...
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
    
    //wifi锁
    WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
        .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");
    
    wifiLock.acquire();
    
    //当暂停,不再需要网络时释放锁
    wifiLock.release();

    9、在前台服务运行播放任务

    这里写图片描述这里写图片描述

    String songName;
    // assign the song name to songName
    PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0,
                    new Intent(getApplicationContext(), MainActivity.class),
                    PendingIntent.FLAG_UPDATE_CURRENT);
    Notification notification = new Notification();
    notification.tickerText = text;
    notification.icon = R.drawable.play0;
    notification.flags |= Notification.FLAG_ONGOING_EVENT;
    notification.setLatestEventInfo(getApplicationContext(), "MusicPlayerSample",
                    "Playing: " + songName, pi);
    startForeground(NOTIFICATION_ID, notification);

    10、处理音频焦点

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
        AudioManager.AUDIOFOCUS_GAIN);
    
    if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // could not get audio focus.
    }

    requestAudioFocus() 方法的第一个参数是一个 AudioManager.OnAudioFocusChangeListener,当任何时候音频焦点发生变化的时候,会回调 OnAudioFocusChangeListener的onAudioFocusChange()方法

    class MyService extends Service
                    implements AudioManager.OnAudioFocusChangeListener {
        // ....
        public void onAudioFocusChange(int focusChange) {
            // Do something based on focus change...
        }
    }

    11、播放完毕时手动释放资源

    public class MyService extends Service {
       MediaPlayer mMediaPlayer;
       // ...
    
       @Override
       public void onDestroy() {
           if (mMediaPlayer != null) mMediaPlayer.release();
       }
    }

    三、Mp3文件简介

    ID3

    一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版。 其中:v1版的ID3在mp3文件的末尾128字节,以TAG三个字符开头,后面跟上歌曲信息。 v2版一般位于mp3的开头,可以存储歌词,该专辑的图片等大容量的信息。

    V1与V2

    • ID3V1记录在MP3文件的末尾,长度固定
    • ID3V2就记录在MP3文件的首部。 ID3V2一共有4个版本,但流行的播放软件一般只支持第3版,既ID3v2.3。
    • 对ID3V2的操作比ID3V1要慢。而且ID3V2结构比ID3V1的结构要复杂得多,但比ID3V1全面且可以伸缩和扩展。

    四、视频播放器

    1、SurfaceView

    SurfaceView提供了一个绘画的界面,你可以控制该界面的格式和大小,SurfaceView 负责在屏幕正确位置安置一个界面。SurfaceView的其中一个目的,是为了在子线程渲染屏幕,但需要注意几点

    • 所有SurfaceView 和SurfaceHolder.Callback 的方法,都必须在主线程调用
    • 必须保证绘制线程,必须在SurfaceView 有效的情况下才能使用,也就是在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间调用

    SurfaceView是View的子类,等同于TextView、ImageView等一系列控件。核心功能可以通过子线程进行界面的绘制,绘制需要注意的内容:

    所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。

    由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface

    • 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面
    • SurfaceView 是双缓冲机制,一个用来缓冲数据,另一个用来展现数据,可以提高数据展示的速度,单缓冲需要先加载数据再去展示数据,但是双缓冲在展示第一个页面数据的时候已经把第二个页面的数据加载好了
    • 对画面的实时更新要求较高,重量级组件,可见时才创建
    • SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止播放,再次创建时再开始播放
    • 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView

    2、使用MediaPlayer+SurfaceView 播放视频

    在该节中,视频播放依然使用MediaPlayer 类,为了方便演示,我们直接使用本文中创建的工程,只需在布局文件添加SurfaceView 控件即可

    布局文件

    <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="@dimen/activity_vertical_margin"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            tools:context=".MainActivity">
    
            <SurfaceView
                android:id="@+id/sv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
    
        </RelativeLayout>

    实现代码

    public class MainActivity extends Activity {
            private MediaPlayer player;
            static int currentPosition;
            private SurfaceView sv;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                sv = (SurfaceView) findViewById(R.id.sv);
                //拿到surfaceview的控制器
                final SurfaceHolder sh = sv.getHolder();
    
                //      Thread t = new Thread(){
                //          @Override
                //          public void run() {
                //              try {
                //                  sleep(200);
                //              } catch (InterruptedException e) {
                //                  e.printStackTrace();
                //              }
                //              runOnUiThread(new Runnable() {
                //                  @Override
                //                  public void run() {
                //                      MediaPlayer player = new MediaPlayer();
                //                      player.reset();
                //                      try {
                //                          player.setDataSource("sdcard/2.3gp");
                //                          player.setDisplay(sh);
                //                          player.prepare();
                //                          player.start();
                //                      } catch (Exception e) {
                //                          e.printStackTrace();
                //                      } 
                //                      
                //                  }
                //              });
                //              
                //          }
                //      };
                //      t.start();
                //SurfaceView是重量级组件,可见时才会创建
                //给SurfaceHolder设置CallBack,类似于侦听,可以知道SurfaceView的状态
                sh.addCallback(new Callback() {
    
                    //surfaceView销毁时调用
                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {
                        //每次surfaceview销毁时,同时停止播放视频
                        if(player != null){
                            currentPosition = player.getCurrentPosition();
                            player.stop();
                            player.release();
                            player = null;
                        }
                    }
                    //surfaceView创建时调用
                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
                        //每次surfaceView创建时才去播放视频
                        if(player == null){
                            player = new MediaPlayer();
                            player.reset();
                            try {
                                player.setDataSource("sdcard/2.3gp");
                                player.setDisplay(sh);
                                player.prepare();
                                player.start();
                                player.seekTo(currentPosition);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    //surfaceView结构改变时调用
                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
                    }
                });
            }
        }

    使用VideoView 播放视频

    VideoView 跟MediaPlayer 相比播放视频步骤要简单的多,因为VideoView 原生提供了播放,暂停、快进、快退、进度条等方法。使用起来要方便的很多

    1、设置布局文件,布局文件比较简单,因此这里只给你VideoView 标签

     <VideoView
     android:id="@+id/vv"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />

    2、设置VideoView 的播放文件路径和媒体控制器,调用start 方法即可播放媒体文件

    //实例化VideoView 对象
    vv = (VideoView) findViewById(R.id.vv);
    //从界面获取播放路径
    et_path = (EditText) findViewById(R.id.et_path);
    
    //给VideoView 设置视频路径
    vv.setVideoPath(et_path.getText().toString());
    //设置VideoView 控制器,我们当前类实现了MediaPlayerControl 接口
    vv.setMediaController(new MediaController(this));
    //开始播放
     vv.start();
     //设置当前播放器窗口设置为焦点
     vv.requestFocus();

    3、覆写MediaPlayerControl 接口中的抽象方法

     @Override
        public void start() {
        }
    
        @Override
        public void pause() {
    
        }
    
        @Override
        public int getDuration() {
            return 0;
        }
    
        @Override
    
        public int getCurrentPosition() {
            return 0;
        }
    
        @Override
        public void seekTo(int pos) {
        }
    
        @Override
        public boolean isPlaying() {
            return false;
        }
    
        @Override
        public int getBufferPercentage() {
            return 0;
        }
    
        @Override
        public boolean canPause() {
            return false;
        }
    
        @Override
        public boolean canSeekBackward() {
            return false;
        }
    
        @Override
        public boolean canSeekForward() {
            return false;
        }
    
        @Override
        public int getAudioSessionId() {
            return 0;
        }
    
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
            return super.onKeyMultiple(keyCode, repeatCount, event);
        }

    注意:上面的方法都是回调方法,我们可以在这些方法里面实现我们的业务逻辑。只有当我们给VideoView设置setMediaController 后控制器才会出现

    这里写图片描述

    收音机

    • 播放协议: MMS
    • MMS(Microsoft Media Server protocol)是一种串流媒体传送协议 ,android并不支持这种流媒体协议

    引入Vitamo框架进行播放

    • 核心类:io.vov.vitamio.MediaPlayer
    • 操作:同系统的MediaPlayer,代码编写与播放网络音乐相近

    视频处理

    电影文件有很多基本的组成部分。首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着,你有一组流,例如,你经常有的是一个音频流和一个视频流。(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元素)。在流中的数据元素被称为帧Frame。每个流是由不同的编码器来编码生成的。编解码器描述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC。接着从流中被读出来的叫做包Packets。包是一段数据,它包含了一段可以被解码成方便我们最后在应用程序中操作的原始帧的数据。

    七个模块分别为:读文件模块,解复用模块 ,视频解码模块,音频解码音频,颜色空间转换模块,视频显示模块,音频播放模块

    粗略的分为五类,分别是 Source filer, Demux flter, Decoder filter, Color Space converter filter,Render filter,各类 filter的功能与作用简述如下

    Source filter

    Source filter 源过滤器的作用是为下级 demux filter 以包的形式源源不断的提供数据流。在通常情况下,我们有多种方式可以获得数据流,一种是从本地文件中读取,一种是从网上获取,Sourcefilter 另外一个作用就是屏蔽读本地文件和获取网络数据的差别,在下一级的 demux filter 看来,本地文件和网络数据是一样的。

    Demux filter

    解复用过滤器的作用是识别文件类型,媒体类型,分离出各媒体原始数据流,打上时钟信息后送给下级 decoder filter。为识别出不同的文件类型和媒体类型,常规的做法是读取一部分数据,然后遍历解复用过滤器支持的文件格式和媒体数据格式,做匹配来确定是哪种文件类型,哪种媒体类型;有些媒体类型的原始数据外面还有其他的信息,比如时间,包大小,是否完整包等等。demux filter 解析数据包后取出原始数据,有些类型的媒体不管是否是完整包都立即送往下级 decoder filter,有些类型的媒体要送完整数据包,此时可能有一些数据包拼接的动作;当然时钟信息的计算也是 demux filter 的工作内容,这个时钟用于各媒体之间的同步。在本例中,AVI Splitter 是 Demux filter。

    Decoder filter

    解码过滤器的作用就是解码数据包,并且把同步时钟信息传递下去。对视频媒体而言,通常是解码成 YUV 数据,然后利用显卡硬件直接支持 YUV 格式数据 Overlay 快速显示的特性让显卡极速显示。YUV格式是一个统称,常见的有 YV12,YUY2,UYVY 等等。有些非常古老的显卡和嵌入式系统不支持 YUV 数据显示,那就要转换成 RGB 格式的数据,每一帧的每一个像素点都要转换,分别计算 RGB 分量,并且因为转换是浮点运算,虽然有定点算法,还是要耗掉相当一部分 CPU,总体上效率底下;对音频媒体而言,通常是解码成 PCM 数据,然后送给声卡直接输出。在本例中,AVI Decompress 和 ACM Warper 是 decoder filter。

    Color space converter filter

    颜色空间转换过滤器的作用是把视频解码器解码出来的数据转换成当前显示系统支持的颜色格式。通常视频解码器解码出来的是 YUV 数据,PC 系统是直接支持 YUV 格式的,也支持 RGB 格式,有些嵌入式系统只支持 RGB 格式的。在本例中,视频解码器解码出来的是 RGB8 格式的数据,Color space converter filter 把 RGB8 转换成 RGB32 显示。

    Render filter

    渲染过滤器的作用就是在适当的时间渲染相应的媒体,对视频媒体就是直接显示图像,对音频就是播放声音。视音频同步的策略方法有好几种,其中最简单的一种就是默认视频和音频基准时间相同,这时音频可以不打时钟信息,通过计算音频的采样频率,量化 bit 数,声道数等基本参数就知道音频 PCM 的数据速率,按照这个速率往前播放即可;视频必须要使用同步时钟信息来决定什么时候显示。DirectShow 采用一个有序链表 ,把接收到的数据包放进有序链表中,启动一个定时器,每次定时器时间到就扫描链表,比较时钟信息,或者显示相应的帧,或者什么也不做,每次接收到新的数据帧,首先判断时钟信息,如果是历史数据帧就丢弃,如果是将来显示数据帧就进有序链表,如果当前时间帧就直接显示。如此这样,保持视频和音频在人体感觉误差范围内相对的动态同步。在本例中 VideoRender 和 Default DirectSound Device 是 Render filter,同时也是 Sink filter

    JetPlayer

    JetPlayer jetPlayer = JetPlayer.getJetPlayer();
    jetPlayer.loadJetFile("/sdcard/level1.jet");
    byte segmentId = 0;
    
    // queue segment 5, repeat once, use General MIDI, transpose by -1 octave
    jetPlayer.queueJetSegment(5, -1, 1, -1, 0, segmentId++);
    // queue segment 2
    jetPlayer.queueJetSegment(2, -1, 0, 0, 0, segmentId++);
    
    jetPlayer.play();

    TextureView

    TextureView、Surfaceview、SurfaceTexture、GLSurfaceView

    画中画

    https://github.com/googlesamples/android-PictureInPicture

    https://developer.android.google.cn/training/tv/playback/picture-in-picture.html?hl=zh-cn#handling_ui

    展开全文
  • 一、前言 随着多媒体硬件环境和软件环境的不断完善,目前,大部分...然而,由于多媒体软件涉及的媒体复杂多样、开发周期短并且需要多种专业人员参与,因此,为了能进行实用高效的开发,必须选用简单易用、开发效率高

    一、前言
      随着多媒体硬件环境和软件环境的不断完善,目前,大部分计算机软件开发中都涉及多媒体软件技术的应用。
      进行多媒体应用程序设计,从原理上说,可以采用从C++到多媒体专用开发系统(如TOOLBOOK、AUTHORWARE、DIRECTOR)等多种层次的工具。然而,由于多媒体软件涉及的媒体复杂多样、开发周期短并且需要多种专业人员参与,因此,为了能进行实用高效的开发,必须选用简单易用、开发效率高的软件。
      Visual Basic是Microsoft公司开发的Windows编程工具软件。由于它具有先进的设计思想、快速易掌握的使用方法及控制媒体对象手段灵活多样等特点,受到了多媒体软件开发人员的关注和青睐,也因此成为多媒体应用程序开发的理想工具。

    二、Visual Basic的多媒体控件MCI.OCX

      MCI(媒体控制接口)是Microsoft公司为实现Windows系统下设备无关性而提供的媒体控制接口标准。用户可以方便地使用MCI控制标准的多媒体设备。

      MCI包含在Windows多媒体扩展的MMSYSTEM模块中,用来协调事件间以及MCI设备驱动程序间的通讯,提供了与设备无关的接口属性。通常应用程序是通过指定一个MCI设备类型来区分MCI设备,设备类型指明了当前实际使用设备的物理类型,不同的设备类型使用不同的控件属性来进行描述(见附表1)。

      从使用的控制方式上来说,MCI设备分为复合和简单两类。一个简单MCI设备并不需要设备元素。例如,CD音频和音碟机就是在一个已经安装好了的硬盘上工作的,它们不需要应用程序为其操作的媒体内容提供任何信息。但对于复合的MCI设备,就需要应用程序提供设备元素,即一个包含全部路径名的源数据文件或目的文件。

      Visual Basic语言的Custom Control(用户控制部件)概念体现了当今软件设计的发展潮流--面向对象技术,编程者可以在Visual Basic的工具箱(Toolbox)中嵌入各式各样五花八门的用户控件,每个用户控制部件都有一定的属性和操作方法,编程者通过属性的设置和方法的控制完成特定的功能。为了方便地控制多媒体,在专业版Visual Basic工具箱中提供了一个用于多媒体目的的用户控件--MCI.OCX。

      多媒体MCI控件MCI.OCX专用于对多媒体控制接口MCI设备的多媒体数据文件实施记录和回放,从目的效果上来说,该控件通过一组按钮来发出种种设备控制命令以实现对诸如:音频面板、MIDI音序器、CD-ROM驱动器、音频CD播放机、录像带播放、录音带录放等设备的控制。在Visual Basic程序设计时,当在表中加入多媒体MCI控件时(在工具箱内双击MCI控件),则出现下列按钮群:向前(Prev)、向后(Next)、播放(Play)、暂停(Pause)、返回(Back)、单步(Step)、停止(Stop)、记录(Record)和出带(Eject)。

      应用程序对MCI的这组按钮操作非常灵活方便,如当我们打开一个MCI设备后,就可以根据该设备类型的属性随时从控件中选择合适的状态按钮来表示即刻设备的物理状态。所有MCI控件可以有下列几种方式来编程:⑴控件及其各按钮的可见性和使能性;⑵可变或完全对控件进行重新定义;⑶在一个窗口表格中可以同时控制多个设备。

    三、多媒体控制部件MCI.OCX的调用
      在Visual Basic3.0专业版中,多媒体控件MCI.OCX(在Visual Basic 3.0和4.0中,多媒体控件的扩展名为.VBX)是作为可选用部件提供的。为了使用它,首先要执行FileAdd File菜单命令,把Windowssystem目录下的MCI.OCX加入到工具箱(Toolbox)中,这时会在工具箱中出现相应的MCI.OCX图标。如果使用的是Visual Basic4.0版(或5.0版),选择oolsCustom Controls菜单或直接键入Ctrl+T,即可出现对话框,在Available Controls列表框中选中Microsoft Multimedia Controls条目旁边的检查框,同样会在工具箱中出现MCI.OCX图标。
      双击工具箱中的多媒体控件MCI.OCX图标,调用MCI.OCX控件之后,表单FORM中将出现一排灰色的媒体控制按钮(九个)。

    四、Visual Basic多媒体应用程序设计步骤
      多媒体控件MCI.OCX包含有一组高级的与设备无关的控制命令。在使用该多媒体控件时,首先用OPEN命令打开MCI设备(多媒体设备)并建立一个与之对应的文件,以便来进行录或放等操作(但是对诸如CDAudio、VCR和录像带不能使用相应文件)。一旦设备打开成功,就可以向它发出各种操作命令(见附表的按钮命令)来完成指定的工作任务。最后记住,要用Close命令来关闭设备和数据文件。
      使用MCI.OCX来进行多媒体应用程序开发是很方便的,因为大多数属性都是容易理解的,其中Command属性尤为重要,它是在运行过程中向多媒体设备发命令。格式为:
      Form.Mmcontrol.Command=cmdstring$
      其中,cmdstring$变量是如下可执行命令名:Open、Close、Play、Pause、Stop、Back、Step、Prev、Next、Seek、Record、Eject、Sound和Save。一旦给其命令设置,它就立刻执行,所发生的错误存在Error属性中。
      下面以播放DEMO.WAV(波形文件)文件为例,说明Visual Basic多媒体应用程序设计步骤。
      首先,创建一个包含有多媒体控件(MCI.OCX)的表格(Form),于是屏幕上显示出形状类似录音机的控制键,不过这时多媒体控制部件是不能马上拿来用的(各键呈灰色),须通过程序代码来改变键的状态。
      其次,在Form_Load过程中,插入相应程序代码。如下
      Sub Form_Load()
      ‘在发出 OPEN 命令前要设置多媒体设备的属性
      Form1.MMControl1.Notify=False
      Form1.MMControl1.Wait=True
      Form1.MMControl1.Shareable=False
      Form1.MMControl1.DeviceType="WaveAudio"
      Form1.MMControl1.FileName="c:windowss
      Mmdatademo.wav"
      Form1.MMControl1.Command="Open"
      End Sub

      最后,运行上述程序,控制键呈黑色,这时就可以使用Play、Record等键操作数据文件DEMO.WAV了。例如用鼠标点按Play键就能听到.WAV音效(计算机应装有发音设备)。
      通过上面陈述,不难发现,Visual Basic利用多媒体控件MCI.OCX设贫嗝教逵τ贸?序很容易掌握。

    五、Visual Basic多媒体应用程序设计实例
      1、播放CD音乐
      在很多多媒体软件系统中,都提供了激光唱盘的播放软件,利用多媒体控件MCI.OCX,我们可以轻松地编制出符合自己使用要求的简易激光唱盘播放机。
      表1给出了简易CD播放器的主要控制部件定义,其后是对应于各个触发事件的源程序代码。
    完整的源程序清单如下:
      `CD播放机实用程序
      `运行程序前请在CD-ROM驱动器中装入一张激光唱碟’“LOAD”按钮触发事件
      Private Sub Command1_Click()
      `装入CD唱片
      On Error GoTo MCI_ERROR
      MMControl1.Command = "Open"
      On Error GoTo 0
      `设置时间格式
      MMControl1.TimeFormat = vbMCIFormatTmsf
      `关闭LOAD按钮,显示图片
      Command1.Enabled = False
      Picture1.Picture = Picture3.Picture
      ` 设置初始轨道数
      Label1.Caption = "1"
      Exit Sub
      MCI_ERROR:
      DisplayErrorMessageBox
      Resume MCI_EXIT
      MCI_EXIT:
      Unload CD
      End Sub

      Private Sub Form_Load()
      MMControl1.Wait = True
      MMControl1.UpdateInterval = 0
      ` 设置设备类型
      MMControl1.DeviceType = "CDAudio"
      `设置缺省轨道数为0
      Label1.Caption = "0"
     nd Sub

      Private Sub Form_Unload(Cancel As Integer)
      MCITest.Show
      End Sub

      ’“出带”按钮触发事件
      Private Sub MMControl1_EjectClick(Cancel As Integer)
      Command1.Enabled = True
      Picture1.Picture = Picture2.Picture
      MMControl1.UpdateInterval = 0
      On Error GoTo MCI_ERROR2
      MMControl1.Command = "Eject"
      MMControl1.Command = "Close"
      On Error GoTo 0
      Label1.Caption = "0"
      Label3.BackColor = &H404040
      Exit Sub
      MCI_ERROR2:
      DisplayErrorMessageBox
      Resume Next
      End Sub

      ’“向前”按钮触发事件
      Private Sub MMControl1_NextCompleted(ErrorCode As Long)
      Label1.Caption = Str$(MMControl1.Track)
      End Sub

      ’“暂停”按钮触发事件
      Private Sub MMControl1_PauseClick(Cancel As Integer)
      MMControl1.UpdateInterval = 0
      Label3.BackColor = &H404040
      End Sub

      ’“播放”按钮触发事件
      Private Sub MMControl1_PlayClick(Cancel As Integer)
      MMControl1.UpdateInterval = 1000
      Label1.Caption = Str$(MMControl1.Track)
      End Sub

      ’“向后”按钮触发事件
      Private Sub MMControl1_PrevCompleted(ErrorCode As Long)
      Label1.Caption = Str$(MMControl1.Track)
      End Sub
      
      Private Sub MMControl1_StatusUpdate()
      Label1.Caption = Str$(MMControl1.Position And &HFF)
      If MMControl1.Mode = vbMCIModePlay Then
      Label3.BackColor = &H80FF&
      Else
      Label3.BackColor = &H404040
      End If
      End Sub
     
      ’“停止”按钮触发事件
      Private Sub MMControl1_StopClick(Cancel As Integer)
      MMControl1.UpdateInterval = 0
      Label3.BackColor = &H404040
      MMControl1.To = MMControl1.Start
      MMControl1.Command = "Seek"
      MMControl1.Track = 1
      Label1.Caption = "1"
      End Sub

      2、播放AVI(音频视频接口)文件
      电影(包括声音和图像)是广大计算机工作者最为关心的媒体信息之一,电影处理技术也是多媒体关键技术之一。而在多媒体系统中,AVI(Audio Video Interface,音频视频接口)文件是存储电影(包括声音和图像)的标准格式,这些AVI文件一般是通过捕获实时视频信号得来的,也可以通过扫描仪获取图像或者使用动画制作软件得到。于是,屏幕窗口上的音频视频操作,就变成了对AVI文件(文件后缀为AVI)的处理。在实际工作中,播放AVI文件(即影片)的方法有许多种,而其中以利用Visual Basic的多媒体控件方法最为简单、方便。下面以一个具体实例来说明如何播放AVI文件:假设用户当前目录下有名字为DEMO.AVI的视频音频文件,则利用Visul Basic播放该影片需要经过如下步骤:
      (1)在Visual Basic的窗体中加入一个MMControl多媒体控件、一个PictureBox图片框控件和两个ComandButton命令按钮部件;
      (2)设置各个控件的属性,其中窗体命名为Form1,MMControl多媒体控件命名为MMControl1、PictureBox图片框控件命名为Picture1、两个ComandButton命令按钮控件分别命名为Play和Close;
      (3)编写各触发事件源程序代码并且运行。源程序代码为:
      Private Sub Play_Click()
      MMControl1.Filename = "DEMO.AVI"
      MMControl1.DeviceType= = "AVIVIDEO"
      MMControl1.hWndDisplay = Picture1.hWnd
      MMControl1.Command = "OPEN"
      MMControl1.To = 1
      MMControl1.Command = "SEEK"
      MMControl1.Command = "PLAY"
      End Sub
      Private Sub Close_Click()
      MMControl1.Command = "STOP"
      MMControl1.Command = "CLOSE"
      End Sub
      值得注意的是:在播放AVI文件之前,首先应该把AVI(音频视频)驱动程序安装在Windows下。AVI的驱动程序名为MCIAVI.DRV,必须将它拷贝到WINDOWSSYSTEM目录下,同时在SYSTEM.INI文件的[MCI]部分加上:
      AVIVIDEO=MCIAVI.DRV
      这样,运行Windows时,Windows会自动地将AVI的驱动程序安装好。
      以上仅描述了利用多媒体控制部件播放音频文件(.WAV)、CD唱片和音频视频文件(.AVI)的操作过程。实际上利用多媒体控制部件同样可以播放动画文件(.FLI、.FLC)、MIDI文件等其他媒体信息。

    六、结束语
      通过前面论述,不难看出:利用Visual Basic提供的多媒体控制部件MCI.OCX,广大计算机用户可以方便、快捷、高效率地开发出各种多媒体应用程序。但需要强调的是:开发设计Visual Basic多媒体应用程序,除了可以利用多媒体控制部件以外,还可以采用其他手段,例如通过调用API函数等等(鉴于篇幅,这里未做讨论)。可见, Visual Basic确实是专业与非专业多媒体软件开发人员共同拥有的理想开发工具。

    附表1 MCI设备类型定义
    设备类型   设备描述
    CDAudio    激光唱盘播放设备
    DAT      数字化磁带音频播放机
    DigitalVideo 动态数字视频图像设备
    Animation  动画播放设备
    Other    未给出标准定义的MCI设备
    Overlay    模拟视频图像叠加设备
    Sequence    MIDI音序发生器
    VCR     可以使用程序控制的磁盘录像机
    VideoDisc   可以使用程序控制的激光视盘机
    WaveAudio  播放数字化波形音频的设备???

    附表2 多媒体控制部件特有事件列表
    事件       说明
    Done        完成MCI命令动作(Notify为真)
    ButtonClick    单击按钮
    ButtonCompleted 按钮执行命令完成
    ButtonGetFocus  按钮获得输入焦点
    ButtonLostFocus 按钮失去输入焦点
    StatusUpdate   更新媒体控制对象的状态信息

     

    展开全文
  • 多媒体技术基本概念汇总

    千次阅读 2015-07-28 00:05:20
    多媒体技术这门课中我们将会学到如何使用音频,视频,图片等资源来进行处理。下面的资料是我在大学阶段整理的多媒体技术的基本概念,希望对大家有所帮助。 多媒体技术期末知识点汇总 多媒体技术的主要特性有:(1)...

           多媒体技术这门课中我们将会学到如何使用音频,视频,图片等资源来进行处理。下面的资料是我在大学阶段整理的多媒体技术的基本概念,希望对大家有所帮助。

    多媒体技术期末知识点汇总

    多媒体技术的主要特性有:(1)(2)(3)      //该题可以为选择题、填空题、简答题
    多样性
    集成性
    交互性
    可扩充性

    多媒体计算机中的媒体信息是指:(1)(2)(3)(4)
    //该题可以为选择题、填空题、简答题
    数字、文字
    声音、图形
    动画、视频
    图像
    多媒体计算机的发展趋势是:(4)        //必考题!是简答题!
    进一步完善计算机支持的协同工作环境CSCW
    智能多媒体技术
    把多媒体信息实时处理和压缩编码算法运用到CPU芯片中
    以上信息全对
    根据多媒体特性判断以下属于多媒体范畴的有:(1)(2)    //该题为选择题
    交互式游戏
    有声图书
    彩色画报     //这个不是多媒体
    立体声音乐、彩色电视   //也不是多媒体
    多媒体技术未来发展的方向是:(1)(2)(3)(4)      //选择题
    高分辨率,提高显示质量
    高速度化,缩短处理时间
    简单化,便于操作
    智能化,提高信息识别能力
    多媒体计算机可分为两大类:        //填空题、简答题
    家电制造厂商研制的电视计算机
    计算机制造厂商研制的计算机电视
    多媒体计算机的定义简单的说是综合处理声音、文字、图形图像信息,使多种媒体信息具有 集成性 和 交互性 。
    声音数字化的步骤可分为3步进行:采样、量化、编码。     //这个必考!注意顺序!
    根据采样定理,一般频率为10k HZ的声音,如果要求采样后不失真重放,那么采样频率必须大于 20k HZ。      //两倍关系。
    以下采样频率中,大多数声卡所支持的是:(2)
    (1)20k HZ  (2)22.05k HZ   (3)100k HZ    (4)50k HZ

    将模拟声音信号转变为数字音频信号的数字化过程是:(2)
    采样编码量化
    采样量化编码
    编码采样量化
    量化编码采样

    使用16位二进制表示声音要比使用8位二进制表示声音的效果:(2)
    噪声小,保真度低,音质差
    噪声小,保真度高,音质好
    噪声大,保真度高,音质好
    噪声大,保真度低,音质差

    MP3文件是目前较为流行的音频文件,对WAV音频文件进行压缩的标准是:(4)
    MPEG-7
    MPEG-4
    MPEG-2
    MPEG-1


    在RGB色彩空间中,R=G=B=0的颜色是黑色,R=G=B=128的颜色是灰色。R=G=B=255的颜色是白色。      //黑色的时候R=G=B=0理解为一点颜色都不加,所以为黑色。

    在Photoshop中,当图像是索引颜色模式时,所有的滤镜都不可使用。

    在Photoshop中,魔棒工具可以得到基于颜色的选取。

    按照动画的生成方法,电脑动画可以分为 帧动画和 矢量动画。

    MPEG是运动图像的数字图像压缩编码方法,是Moving Picture Experts Group(运动图像专家组)的缩写。

    什么是媒体?什么是多媒体?
    答:媒体是Media的译名,媒体也称媒质或媒介,是表示和传播信息的载体。例如图形图像、动画、语言、文字都是媒体。

    多媒体指将文字、声音、图形、图像、视频等多种媒体集成进计算机,是多种媒体的综合,使信息能被多种感官接收。

    多媒体计算机的发展趋势如何?         //这道题有疑问!我不知道如何回答,请注意!
    (1)进一步完善计算机支持的协同工作环境CSCW
    (2)智能多媒体技术
       (3)把多媒体信息实时处理和压缩编码算法运用到CPU芯片中
    21.多媒体计算机的关键技术有哪些?     //必考题!简答题或填空题!
    答:
    视频/音频信号获取技术;
    多媒体数据压缩编码和解码技术;


    分辨率和色深在显示卡中分别指什么?
    答:分辨率指的是显示卡在显示器上水平方向显示的像素数与垂直方向显示的像素数的乘积,一般用“横向点*纵向点”表示,如640*480.

    色深也可称为色位深度或颜色数,是指显示卡在当前分辨率下能够在屏幕上显示的色彩数量,如32位真彩色。


    什么是MP3?其压缩标准是什么?
    答:MP3是一种音频压缩格式,是MPEG-1标准中的音频部分,对应于MPEG Audio Layer3.具有很高的压缩比,可达10:1~12:1高压缩比。

    压缩标准是:MPEG Audio Layer3


    请描述图形与图像的区别。
    答:图形也称矢量图,是用计算机指令来描述图像的点、线、图等图形的位置、大小、颜色和形状。用于描述轮廓不是很复杂,色彩不是很丰富的对象。

    图像是由扫描仪、摄像机等输入设备捕捉实际画面产生的。由像素点阵构成的位图,描述色彩丰富,细节复杂的场景。

    蒙版的作用是什么?
    答:为获得带有特殊形状的照片,用一块挡板挡在镜头的前面,挡板上开有特殊的形状的孔,这样拍摄的照片就会显示某些形状。

    什么是效果滤镜?其作用是什么?
    答:滤镜是一组可完成特定视觉效果的程序。

    作用:只要适当的设置滤镜参数就可以获得特定的效果。如可设置浮雕效果、扭曲效果、光滑效果。


    全动画和半动画的区别是什么?
    答:全动画完全按照每秒24幅制作动画。
    半动画采用少于每秒24幅画面来绘制动画。


    什么是视频,它有什么特点?
    答:视频是多幅静止图像与连续的音频信息在时间轴上同步运动的混合媒体。

    特点(简单回答):
    视频文件多采用AVI格式
    实时性强
    数据量大
    对计算机处理能力要求高

    特点(复杂回答):
    数字视频与模拟视频相比有以下特点:
    数字视频可以不失真地进行无数次复制,而魔衣视频信号每转录一次,就会有一次误差累计,产生信号失真。
    模拟视频长时间存放后视频质量会降低,而数字视频便于长时间存储。
    可以对数字视频信号进行非线性编辑,并可增加特技效果等。
    数字视频数据量。在存储与传输的过程中必须进行压缩编码。
    此外,数字视频一般还具有以下特点:
    视频文件多采用AVI格式,AVI是Windows下指定的视频文件格式,也是PC系统中使用最为广泛的视频文件格式,同QUICKTIME和MPEG并成为计算机的三大主流视频技术。简单地说,AVI以隔行扫描的视频和音频不断交错的方式工作。
    实时性强。
    数据量大
    对计算机的处理能力要求很高。

    动态图像的压缩原理是什么?
    答:
    运动图像序列中有许多冗余的数据,使用数学方法来减少这些冗余信息,可以减少数据量。
    人的眼睛对图像细节和颜色的辨认有一个极限,把超过极限的部分去掉,就能压缩数据。


    制作PowerPoint演示文稿的背景应遵循什么原则?    //必考题!
    答:
    色彩协调,不过分鲜艳。
    低亮度。
    若背景是图片,则图片必须加工和处理,视觉效果应符合前两条。


    Flash中如何使一个小球按自由轨迹运动?     //必考题!最好自己实践!答案有问题!
    答:
    网络版:
    1 打开flash新建一文件;
    2 用圆形工具画一小球;
    3 在小球所在的图层添加引导层;
    4 选择引导层,用钢笔画线条;
    5 点击第一帧,把帧延长到最后一帧;
    6 在最后一帧插入关键帧;
    7 点击第一帧,把小球放到轨迹的初始位置;
    8 点击最后一帧,把小球放到轨迹的终止位置;
    9 使用补间动画;


    书本版:
    新建文件,先制作直线移动动画;
    把最后一帧作为当前帧,添加引导图层;
    使用铅笔工具,选择平滑效果;
    画自由路径;
    选择小球所在图层;
    单击第1帧,把小球圆心放到起始位置;
    单击最后1帧,把小球圆心放到终止位置;
    预览效果;

    Photoshop的工程文件是 PSD
                   输出文件是 JPEG  BMP

    Flash的工程文件是  FLA
              输出文件是  SWF     AVI     GIF

    注意一点:bmp图也能做动态图。
    视频(电视)有两种制式:
    PAL视频制式:我国采用的制式。25帧/秒播放。是西德制定的标准。
    NTSC视频制式:30帧/秒播放。美国制定的标准。

    Photoshop中的魔棒怎么使用?
    选取魔棒工具,在所需要的颜色区域点击,相同颜色的色块就能被选中,魔棒是可以设置容差值的,数值为0-255之间。根据容差大小来选取颜色的相似程度。如抠图就能使用魔棒工具。

    36.如何从大自然采集声音,采集视频,变成数字化的声音、视频?   ——这就是采样定理!采样定理的步骤。
    37.    .AVI  视频格式
          .BMP  图片格式
          .AVS   音频格式

    38.声卡和显卡的功能。
    声卡的功能:声卡是电脑的一种输入输出设备,它的工作是提供音频信号的输入输出功能并可以对其进行处理。基本功能是把来自话筒、磁带、光盘的原始声音信号加以转换,输出到耳机、扬声器、扩音机、录音机等声响设备。

    显卡的功能:是主机与显示器之间连接的“桥梁”,作用是控制电脑的图形输出,负责将CPU送来的的影像数据处理成显示器认识的格式,再送到显示器形成图像。

    39.什么是补间动画?
    补间动画是只要建立起始和结束的帧,中间部分由软件自动生成,省去了中间动画制作的复杂过程。这是Flash常用的动画效果。
    补间动画分为动画补间和形状补间。
    动画补间是物体从一个状态到另一个状态。
    形状补间是由一个物体变化到另一个物体。

    40.创建补间动画应注意什么?
    动画补间:必须是元件实例,且必须是同一个元件的实例。
    形状补间:注意基本形状和变形形状的对象只能是用绘图工具绘制出的矢量图。

    41.采样定理:模拟信号数字化过程
    模拟信号采样量化编码存储传输解码平滑回放

    42.注意:采样定理是必考题。


    github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

    展开全文
  • 此历程来自机器人控制工程中的一部分,“开线程调用多媒体定时器”在工程中是很常用的一部分,但对于新手来说却很难理解。下面小白用最简单的方式,清晰的记录下程序顺序运行的每一环节。 主要完成两件事:声明一个...
  • 多媒体复习资料

    千次阅读 2020-01-20 09:39:11
    多媒体技术复习要点 1.根据CCITT定义,多媒体有哪几种类型? 1). 感觉媒体:直接作用于人的感官 ,使人直接产生感觉。 2). 表示媒体:是为了加工、处理和传输感觉媒体而人为构造出来的一种媒体 ,即各种编码。 3). ...
  • Android Multimedia框架总结(五)多媒体基础概念

    千次阅读 多人点赞 2016-09-04 13:40:07
    上篇中介绍了MediaPlayer从prepare到playback的其他过程,但是很多的一些音视频的基础概念可能还不是很清楚,今天将介绍下对于多媒体开发时,常常有一些基本概念。看下今天的Agenda: 对杂而乱的媒体概念进行归类
  • android多媒体框架学习

    千次阅读 2014-02-07 14:50:25
    Multimedia Framework overview(多媒体框架概述)--base on jellybean(一) jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等...
  • Android多媒体MediaStore运用

    千次阅读 2016-07-08 10:27:12
    在Android系统中,多媒体库是通过MediaScanner去扫描磁盘文件,对元信息的处理,并通过MediaProvider保存到MediaStore中。下图为MediaScannerr 框架:  图1-1 MediaScanner框架流程  Android系统在SD...
  • 由于《深入理解Android...第10章 深入理解MediaScanner本章主要内容· 介绍多媒体系统中媒体文件扫描的工作原理。本章涉及的源代码文件名及位置下面是本章分析的源码文件名及其位置。· MediaProvider.javapackages/p
  • 多媒体信息技术》复习思考题

    万次阅读 2017-07-06 09:17:48
    多媒体信息技术》复习思考题 一、思考题  1. 什么是多媒体?什么是多媒体技术? 多媒体有哪些关键技术? 答: ①多媒体是融合两种或者两种以上媒体的一种人-机交互式的信息交流和传播媒体。 对信息技术而言...
  • 多媒体中控系统的发展及现状

    千次阅读 2013-08-29 11:45:00
    几乎在所有的场合,我们都能经常听到多媒体什么设备或者多媒体系统这些词,其实多媒体这几个字是非常宽泛的词语,从字面上可以理解为多种媒介的结合。现代社会,常指声、光、影像的融合。 据此,我们可以把这一概念...
  • 万字长文漫谈视频理解

    千次阅读 多人点赞 2020-04-16 09:37:52
    作为多媒体中重要的信息载体,视频的地位可以说是数一数二的,然而目前对于AI算法在视频上的应用还不够成熟,理解视频内容仍然是一个重要的问题亟待解决攻克。本文对视频理解进行一些讨论,虽然只是笔者对互联网的...
  • 深入理解Android-JNI的理解

    千次阅读 2018-07-27 00:04:04
    理解JNI需要理解以下问题: JNI的认识 JNI库的加载、相关native函数分析和总结【借助于MediaScanner】 JNI函数注册 JNI里面类型转换 JNIEnv的认识 JNIEnv操作jobject JNI的异常处理 JNI的认识 JNI是Java ...
  • 海思多媒体处理平台(MPP)分为:视频输入(VI),视频处理(VPSS),视频编码(VENC),视频解码(VDEC),视频输出(VO)、视频侦测分析(VDA),音频输入(AI),音频输出(AO),音频编码(AENC),音频解码(ADEC),区域管理(REGION)等模块....
  • 带你走进多媒体世界:视频文件是怎么播放出来的

    千次阅读 多人点赞 2021-05-19 16:53:22
    维基百科的解释是:多媒体(Multimedia),在电脑应用系统中,组合两种或两种以上媒体的一种人机交互式资讯交流和传播媒体。使用的媒体包括文字、图片、照片、声音(包含音乐、语音旁白、特殊音效)、动画和影片,...
  • 多媒体开发指南

    千次阅读 2005-12-07 20:40:00
    一个简单的ASF具有两种流:视频和音频。更加复杂的ASF文件可以包含两路音频和多路视频。音频可以有同样的压缩设置,但是内容不同,例如不同语言的讲解;视频可以有同样的内容,但是具有不同的压缩比例。格式是在设置...
  • 视频叠加区域,其中区域支持位图的加载、背景色更新等功能,简单理解就是可以设置透明度,也就是下面的Alpha值 (2)Cover遮挡 视频遮挡区域,其中区域支持纯色块遮挡,与Overlay叠加不同的是它不能加载图片,不能...
  • [深入理解Android卷一全文-第六章]深入理解Binder

    万次阅读 多人点赞 2015-08-02 16:00:28
    由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容。第6章 深入理解Binder本章主要内容· 以Media...
  • [深入理解Android卷一 全文-第二章]深入理解JNI

    万次阅读 多人点赞 2015-08-02 09:39:48
    由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容。(出版社排版好的PDF版正在向出版社申请,到时候...
  • Windows多媒体开发框架介绍

    千次阅读 2019-01-27 15:55:21
    Windows 多媒体开发框架介绍欢迎来到 Windows 的多媒体开发世界2D 图形 API1. [GDI](https://docs.microsoft.com/en-us/windows/desktop/gdi/windows-gdi)2. [GDI+]...
  • Android多媒体架构分析

    千次阅读 2011-04-26 19:51:00
    Android多媒体架构分析 Revision History Date Issue Description Author wylhistory 目录 1. Abstract 2. Introduction 3. Android 多媒体架构 3.1 代码位置 3.2 MediaPlayer 3.3 ...
  • HTML5文件多媒体播放

    千次阅读 2018-09-28 15:17:18
    一)HTML5页面中的多媒体 ...这两个元素的使用方法也是非常简单的,只要把播放音频的url指定的该元素的src就可以了。如下: &lt;video src="http://xxxx.mp3"&gt;你的浏览不支持video属性&l...
  • 《深入理解Android 卷III》即将发布,作者是张大伟。此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分。在一个特别讲究颜值的时代,本书分析了Android 4.2中...
  • VC多媒体编程

    万次阅读 2008-06-27 14:36:00
    -- VC多媒体编程本文来自http://study.feloo.com/ -- 作者:admin -- 发布时间:2006-8-11 16:05:00 -- Visual C++中基于多文档视窗模型的重叠图象拼接技术摘要 图象拼接是在全景视频系统、地理信息系统等应用...
  • 多媒体框架的几点看法

    千次阅读 2016-10-07 11:16:21
    转载地址:http://blog.csdn.net/huibailingyu/article/details/7565861对多媒体框架的几点看法 WiKi上定义: A multimedia framework is a software framework that handles media on a computer and through a ...
  • 数字多媒体技术解密

    千次阅读 2014-03-03 16:30:56
    如果算上模拟时代的话,多媒体传输并非多么新鲜的事情。早在上世纪三十年代,人们便可以在家观赏奥运赛事:来自柏林现场的活动画面连同声音通过电缆或者无线电波被传送到世界各地1),虽然是黑白图像,但就质量来说并...
  • 由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第7章 深入理解ContentProvider本章主要内容:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,941
精华内容 15,976
关键字:

多媒体简单理解