您的位置:

Android Miracast技术详解

一、什么是Miracast

Miracast是Wi-Fi联盟提出的一项技术标准,主要用于实现不同设备之间的视频、音频和图像的无线传输。

使用Miracast可以将一个支持Miracast功能的设备中的音视频内容无线地传输到另一个支持Miracast功能的设备中,比如,将手机中的影片在电视上播放,实现无线同屏。

二、Miracast的原理

Miracast使用Wi-Fi Direct技术建立P2P网络,发送端的设备通过H.264压缩技术将音视频数据压缩成一定格式后封装成RTSP规范的数据包,通过Wi-Fi Direct网络传输到接收端设备,接收端设备对其进行解码和播放。

Miracast的传输延时较低,最高可达100毫秒左右,传输距离基本限制于设备之间的Wi-Fi距离和信道质量。

三、Miracast的应用

1、手机到电视的无线投屏

通过在电视上安装支持Miracast功能的接收器,比如小米盒子、Chromecast等,可以将手机中的影片、游戏、图像、音频内容通过Miracast技术无线投射到电视上,实现无线同屏的效果。

public class MiracastActivity extends Activity {
    private WifiP2pManager mManager;
    private WifiP2pManager.Channel mChannel;
    private BroadcastReceiver mReceiver;
    private IntentFilter mIntentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        mChannel = mManager.initialize(this, getMainLooper(), null);

        mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);

        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(mReceiver, mIntentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }
}

2、游戏直播的应用

将游戏机中的内容通过Miracast技术无线传输到电视或者显示器上,可以达到比传输到手机屏幕上更好的游戏视觉效果,同时也可以进行游戏直播和自己的截屏、录屏等操作。

private void setUpMiracast() {
    final Channel channel = getChannel();
    if (channel != null) {
        final Activity activity = getActivity();
        final WifiP2pManager manager = (WifiP2pManager) (activity
                .getSystemService(Context.WIFI_P2P_SERVICE));
        manager.requestGroupInfo(channel, new WifiP2pManager.GroupInfoListener() {
            @Override
            public void onGroupInfoAvailable(WifiP2pGroup group) {
                if (group == null) {
                    manager.createGroup(channel, new WifiP2pManager.ActionListener() {
                        @Override
                        public void onSuccess() {
                            showToast("miracast is enable");
                        }

                        @Override
                        public void onFailure(int reason) {
                            showToast("miracast is failed");
                        }
                    });
                } else {
                    showToast("miracast is already enable");
                }
            }
        });
    }
}

3、无线投影机的应用

企业中对于演示和会议的需求,可以通过Miracast技术将PPT等文档无线传输到投影仪设备上,实现无线投影的效果,该方式具有方便、快捷的特点。

public class MainActivity extends Activity {
    private Button button;
    private WifiP2pManager wifiP2pManager;
    private WifiP2pManager.Channel channel;
    private WifiP2pManager.ActionListener connectListener;
    private WifiP2pManager.ActionListener disconnectListener;
    private WifiP2pManager.GroupInfoListener groupInfoListener;
    private boolean isConnected = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.connect);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isConnected) {
                    wifiP2pManager.removeGroup(channel, disconnectListener);
                    isConnected = false;
                    button.setText("Connect");
                } else {
                    wifiP2pManager.createGroup(channel, new WifiP2pManager.ActionListener() {
                        @Override
                        public void onSuccess() {
                            wifiP2pManager.requestGroupInfo(channel, groupInfoListener);
                            isConnected = true;
                            button.setText("Disconnect");
                        }

                        @Override
                        public void onFailure(int reason) {
                            Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        });

        wifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        channel = wifiP2pManager.initialize(this, getMainLooper(), null);

        connectListener = new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Toast.makeText(MainActivity.this, "Connected", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(int reason) {
                Toast.makeText(MainActivity.this, "Connection failed", Toast.LENGTH_SHORT).show();
            }
        };

        disconnectListener = new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Toast.makeText(MainActivity.this, "Disconnected", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(int reason) {
                Toast.makeText(MainActivity.this, "Disconnect failed", Toast.LENGTH_SHORT).show();
            }
        };

        groupInfoListener = new WifiP2pManager.GroupInfoListener() {
            @Override
            public void onGroupInfoAvailable(WifiP2pGroup group) {
                if (group != null && group.isGroupOwner()) {
                    WifiP2pDevice device = group.getOwner();
                    if (device != null) {
                        WifiP2pConfig config = new WifiP2pConfig();
                        config.deviceAddress = device.deviceAddress;
                        wifiP2pManager.connect(channel, config, connectListener);
                    }
                }
            }
        };
    }
}

四、Miracast的局限性

由于Miracast本身是基于Wi-Fi Direct技术的,因此Miracast的使用需要在支持Wi-Fi Direct的设备中使用,同时Miracast并不支持同时传输多路音视频流。

另外,由于Miracast使用Wi-Fi Direct技术建立P2P网络,该网络的连接要求设备必须处于同一Wi-Fi网络中,因此在实际使用中存在一定的限制。

五、结语

Miracast技术的出现,使得无线视频、音频的传输变得更加便捷和高效,为用户提供了更加多样化的选择,同时也推动了无线传输技术的不断发展和改进。