JMF捕获音频

简介:
1. 捕获媒体数据的步骤:

(1) 查询CaptureDeviceManager,来定位你需要使用的媒体采集设备。

(2) 得到此设备的CaptureDeviceInfo实例。

(3) 从此CaptureDeviceInfo实例获得一个MediaLocator,并通过它来创建一个DataSource。

(4)用此DataSource创建一个Player或Processor。

(5) 启动此Player或Processor开始捕获媒体数据。

2.CaptureDeviceManager、CaptureDeviceInfo、MediaLocator

在JMF中,CaptureDeviceManager也是一个manager类,它提供给了一个列表,这个列表显示当前系统可以被使用的设备名称。同时CaptureDeviceManager可以通过查询的方法对设备进行定位并返回设备的配置信息对象CaptureDeviceInfo,它也可以通过注册的方法向列表加入一个新的设备信息,以便为JMF使用。

设备可通过CaptureDeviceManager的getDevice()方法直接获得设备控制权,设备的控制权一旦得到,就可以以此设备作为一个MediaLocator,可以通过CaptureDeviceInfo的getLocator()方法得到。

3.JMF识别的音频采集设备

200792401.jpg

4.一个实例实现音频捕获

实例有两个文件组成。CaptureDemo.java实现

①查询、获得音频采集设备。

②捕获音频。

③将音频保存到本地文件foo.wav。

StateHelper实现处理器(processor)的状态控制管理。以下为流程图:

200792401.jpg
import java.util.Vector;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.DataSink;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoDataSinkException;
import javax.media.NoProcessorException;
import javax.media.Processor;
import javax.media.control.StreamWriterControl;
import javax.media.format.AudioFormat;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;

public class CaptureDemo 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        CaptureDeviceInfo di = null;
        Processor p = null;
        StateHelper sh = null;
        Vector devList = CaptureDeviceManager.getDeviceList(new AudioFormat("linear",44100,16,2));
        if(devList.size()>0)
        {
            di = (CaptureDeviceInfo)devList.firstElement();
            System.out.println(di.getName());
            System.out.println(di.toString());
        }
        else
            System.exit(-1);
        try
        {
            
            p = Manager.createProcessor(di.getLocator());             
            sh = new StateHelper(p);
        }
        catch(java.io.IOException ex)
        {
            System.exit(-1);
        }
        catch (NoProcessorException e) 
        {
            // TODO Auto-generated catch block
            System.exit(-1);
        }

        if(!sh.configure(10000))
        {
            System.exit(-1);
        }
        p.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.WAVE));
        
        if(!sh.realize(10000))
        {
            System.exit(-1);
        }
        
        DataSource source = p.getDataOutput();
        MediaLocator dest = new MediaLocator("file:///c:/foo.wav");
        DataSink fileWriter = null;
        try
        {
            fileWriter = Manager.createDataSink(source, dest);
            fileWriter.open();
        }
        catch (NoDataSinkException e) 
        {
            // TODO Auto-generated catch block
            System.exit(-1);
        }
        catch(java.io.IOException ex)
        {
            System.exit(-1);
        }
        catch(SecurityException ex)
        {
            System.exit(-1);
        }
        
        StreamWriterControl swc = (StreamWriterControl) p.getControl("javax.media.control.StreamWriterControl");
        if(swc!=null)
        {
            swc.setStreamSizeLimit(500000000);
        }
        try
        {
            fileWriter.start();
        }
        catch(java.io.IOException ex)
        {
            System.exit(-1);
        }
        
        sh.playToEndOfMedia(5000*1000);
        sh.close();
        fileWriter.close();
    }

}


import javax.media.ConfigureCompleteEvent;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerErrorEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Player;
import javax.media.Processor;
import javax.media.RealizeCompleteEvent;


public class StateHelper implements ControllerListener
{
    Player player = null;
    boolean configured = false;
    boolean realized = false;
    boolean prefetched = false;
    boolean endOfMedia = false;
    boolean failed = false;
    boolean closed = false;
    
    public StateHelper(Player p)
    {
        this.player = p;
        p.addControllerListener(this);
    }

    public boolean configure(int timeOutMillis)
    {
        long startTime = System.currentTimeMillis();
        synchronized(this)
        {
            if(this.player instanceof Processor)
            {
                ((Processor)player).configure();
            }
            else
                return false;
            while(!this.configured&&!this.failed)
            {
                try
                {
                    this.wait(timeOutMillis);
                }
                catch(InterruptedException ex)
                {
                    
                }
                if(System.currentTimeMillis()-startTime > timeOutMillis)
                    break;
            }
        }
        return this.configured;
    }
    public boolean realize(int timeOutMillis)
    {
        long startTime = System.currentTimeMillis();
        synchronized(this)
        {
            this.player.realize();
            while(!this.realized&&!this.failed)
            {
                try
                {
                    this.wait(timeOutMillis);
                }
                catch(InterruptedException ex)
                {
                    
                }
                if(System.currentTimeMillis()-startTime > timeOutMillis)
                    break;
            }
        }
        return this.realized;
    }
    
    public boolean prefetch(int timeOutMillis)
    {
        long startTime = System.currentTimeMillis();
        synchronized(this)
        {
            this.player.prefetch();
            while(!this.prefetched&&!this.failed)
            {
                try
                {
                    this.wait(timeOutMillis);
                }
                catch(InterruptedException ex)
                {
                    
                }
                if(System.currentTimeMillis()-startTime > timeOutMillis)
                    break;
            }
        }
        return this.prefetched&&!this.failed;
    }
    
    public boolean playToEndOfMedia(int timeOutMillis)
    {
        long startTime = System.currentTimeMillis();
        this.endOfMedia = false;
        synchronized(this)
        {
            this.player.start();
            while(!this.endOfMedia&&!this.failed)
            {
                try
                {
                    this.wait(timeOutMillis);
                }
                catch(InterruptedException ex)
                {
                    
                }
                if(System.currentTimeMillis()-startTime > timeOutMillis)
                    break;
            }
        }
        return this.endOfMedia&&!this.failed;
    }
    
    public void close()
    {
        synchronized(this)
        {
            this.player.close();
            while(!this.closed)
            {
                try
                {
                    this.wait(100);
                }
                catch(InterruptedException ex)
                {
                    
                }
            }
        }
        this.player.removeControllerListener(this);
    }
    
    public synchronized void controllerUpdate(ControllerEvent ce) 
    {
        // TODO Auto-generated method stub
        if(ce instanceof RealizeCompleteEvent)
        {
            this.realized = true;
        }
        else if(ce instanceof ConfigureCompleteEvent)
        {
            this.configured = true;
        }
        else if(ce instanceof EndOfMediaEvent)
        {
            this.endOfMedia = true;
        }
        else if(ce instanceof ControllerErrorEvent)
        {
            this.failed = true;
        }
        else if(ce instanceof ControllerClosedEvent)
        {
            this.closed = true;
        }
        else 
        {
            return;
        }
        this.notifyAll();
    }

}



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/09/24/904551.html,如需转载请自行联系原作者

目录
相关文章
|
25天前
|
编解码 JavaScript 前端开发
使用 MediaSource 规范实现自适应流播放
【10月更文挑战第26天】通过以上步骤,就可以使用MediaSource规范实现自适应流播放,根据网络状况动态地调整播放的码率,为用户提供更流畅的观看体验。需要注意的是,实际应用中还需要处理更多的细节和错误情况,以确保播放的稳定性和可靠性。
|
编解码 Android开发 C语言
【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )
【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )
757 0
|
编解码 网络安全 Windows
eyeBeam音频出现问题要如何处理
eyeBeam音频出现问题要如何处理
|
测试技术 API Android开发
【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )(二)
【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )(二)
294 0
【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )(二)
|
测试技术 API Android开发
【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )(一)
【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )(一)
334 0
【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )(一)
|
设计模式 Android开发 数据格式
【Android 高性能音频】AAudio 音频流 构建器 ( AAudio.h | 流构造器 | 音频设备配置 | 音频采样配置 | 构建器销毁 )
【Android 高性能音频】AAudio 音频流 构建器 ( AAudio.h | 流构造器 | 音频设备配置 | 音频采样配置 | 构建器销毁 )
164 0
|
存储 自然语言处理 监控
音频开发中常见的四个错误
以下内容主要为音频开发人员所编写,但同样也能为其他领域并与此相关的开发者带来帮助。在下文当中我将介绍针对开发人员的诊断工具,并分享常见的四个错误以及如何检测问题是否存在并做得更好。
352 0
音频开发中常见的四个错误