Android使用BitmapFactory decodeStream解码来自socket的mpeg h264视频

时间:2014-07-05 06:21:08

标签: android sockets

我正在尝试将h.264视频从我的电脑传输到安卓。

我写了一个简单的服务器,接受了android的连接,从这里读取测试文件 http://support.apple.com/kb/HT1425 sample_iPod.m4v并在循环中执行一系列等待一段时间的发送,这样我就不会躲过网络

这里是服务器线程

int CLmfdtServerThread::Run()
{
    TRACE("CLPitServerThread::Run START\n") ;
    int sz = 2236480;
    char* testbits = new char[sz];
    FILE* fp = fopen("d:/misc/sample_iPod.m4v", "rb");
    int n = fread(testbits, 1, sz, fp);
    fclose(fp);

    SOCKET serverSocket=NULL;


        for( ; ; Sleep(1000) ) {            // try to connect to android ever 1 secs

            // open a server socket to listen for connections from androids
            strcpy(g_androidLmfdMsg, "Not connected"); g_theDialog->Invalidate();

            SOCKET clientSocket = socketSetupAndWaitAccept(serverSocket, 21121, g_androidLmfdMsg);
            if(!clientSocket)
                continue;   

            for( int i=0 ; i<sz; i+=10000 ) {
                TRACE("CLPitServerThread::Run try send lmfd\n");
                int bytesSent = send(clientSocket, (char*)testbits, 10000, 0);
                if (bytesSent == SOCKET_ERROR || bytesSent!=10000) {
                    int erno = WSAGetLastError(); closesocket(clientSocket); WSACleanup(); 
                    break;
                }
                TRACE("CLPitServerThread::Run sent lmfd %d bytes\n", bytesSent);
                Sleep(20);
            }
    }

在android上我创建一个异步任务

    @Override
    protected String doInBackground(String... params) {

        mMfdImg = (ImageView) MainActivity.getStaticRef().findViewById(R.id.imageViewMfd);


        while(true) {

            try {

                if(mServerIP==null) {
                    Thread.sleep(1000);
                    continue;
                }

                @SuppressWarnings("resource")
                Socket socket = new Socket(mServerIP, LPIT_PORT);   // LMFD port is 21121    

                DataInputStream dis = new DataInputStream(socket.getInputStream());                 

                for ( mLoops=0 ; ; mLoops++ ) { //                       
                    mMfdBmp = BitmapFactory.decodeStream(dis);
                    publishProgress();              // force redraw
                    Thread.sleep(5);                // 
                }


            } catch (IOException e) {
                e.printStackTrace();            
            } catch (InterruptedException e) {
                e.printStackTrace();
            }        
        }
    }
@Override
    protected void onProgressUpdate(Void... values) {
        //Log.d("ReadAndDisplay", "onProgressUpdate");

        mMfdImg.setImageBitmap(mMfdBmp);        // draw new img to screen
        mMfdImg.invalidate();

但它不起作用,decodeStream立即返回NULL 它应根据此http://developer.android.com/guide/appendix/media-formats.html#core

解码h.264

我现在有一个类似的系统从服务器发送jpeg,然后我在套接字上执行readFully并使用BitmapFactory.decodeByteArray并且工作正常,但我想从jpegs模式到mpegs以节省带宽< / p>

任何人的想法?感谢

更新

简化我将文件复制到sdcard(另一个测试文件,确定仅限h.264基线视频)并验证它在videoplayer上播放的内容

然后我写了这个

final String fname = Environment.getExternalStorageDirectory().getPath()+"/Download/out.mp4";
                    try {

                        File file = new File(fname);
                        byte[] ip = new byte[(int) file.length()];
                        FileInputStream fis = new FileInputStream(file);
                        fis.read(ip);
                        fis.close();

                        mMfdBmp = BitmapFactory.decodeByteArray (ip, 0, ip.length);
                        publishProgress();              // force redraw

                    } catch

我验证了ip中的内容是真正的mp4数据。仍然没有运气,我也试过decodeFile,结果相同。

我使用完全相同的代码,但加载.jpp并且工作正常

我想这http://developer.android.com/guide/appendix/media-formats.html#core就是说谎 H.264 AVC• (Android 3.0+)•基线配置文件(BP)•3GPP(.3gp) •MPEG-4(.mp4)

0 个答案:

没有答案