qq_34316891 2017-04-05 11:30 采纳率: 100%
浏览 2979
已采纳

Android传输基于socket传输视频文件到pc

我写了一个录制视频的app然后把录制的视频传送到pc端,但是传输到pc端的视频文件变大,而且无法播放,传输方式是DataOutputStream,具体代码如下;

package com.example.lenovo.viedoapp;

import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import com.google.android.gms.common.api.GoogleApiClient;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

import static com.example.lenovo.viedoapp.R.id.surfaceView;

public class viedoApp extends Activity implements View.OnClickListener, SurfaceHolder.Callback {
Button but_start;
Button but_stop;
Button but_send;
SurfaceView sfv;
SurfaceHolder sfh;
Camera camera;
MediaRecorder mediaRecorder;
File videoFile;
File aduioFile;
Send send;
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_viedo_app);
    but_start = (Button) findViewById(R.id.but_start);
    but_start.setOnClickListener(this);
    but_stop = (Button) findViewById(R.id.but_stop);
    but_stop.setOnClickListener(this);
    but_send=(Button)findViewById(R.id.but_send);
    but_send.setOnClickListener(this);
    sfv = (SurfaceView) findViewById(surfaceView);
    sfh = sfv.getHolder();
    sfh.addCallback(this);
}

public void onClick(View v) {
    if (v.getId() == but_start.getId()) {
        camera.stopPreview();
        camera.release();
        camera = null;
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setPreviewDisplay(sfh.getSurface());
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setVideoSize(320, 240);
        mediaRecorder.setVideoFrameRate(15);
        mediaRecorder.setOrientationHint(90);
        videoFile = new File(getExternalCacheDir(), "video.mp4");
        mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
        try {
            mediaRecorder.prepare();
            mediaRecorder.start();
            //send = new Send(videoFile);
            //new Thread(send).start();

        } catch (IOException e) {

            e.printStackTrace();
        }
    } else if (v.getId() == but_stop.getId()) {
        //send.flag = false;
        mediaRecorder.stop();
        mediaRecorder.release();
        mediaRecorder = null;
        camera = Camera.open();
        try {
            camera.setPreviewDisplay(sfh);
            camera.setDisplayOrientation(90);
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else if(v.getId()==but_send.getId()){
        send = new Send(videoFile);
        new Thread(send).start();

       // Toast.makeText(viedoApp.this, "完成", Toast.LENGTH_SHORT).show();
    }
}

public void surfaceCreated(SurfaceHolder holder) {

    camera = Camera.open();

    try {
        camera.setPreviewDisplay(holder);
        camera.setDisplayOrientation(90);
        camera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
    sfv = null;
    sfh = null;
    mediaRecorder = null;

}

}

class Send implements Runnable {
    Socket socket = null;
    OutputStream os = null;
    File file = null;
    FileInputStream fis = null;
    byte[] bytes;
    boolean flag = true;
    DataOutputStream dos=null;
    Send(File file) {
        this.file = file;
    }

    public void connect() {
        try {
            socket = new Socket("192.168.1.108", 9991);
            os = socket.getOutputStream();
           dos = new DataOutputStream(os);
           fis=   new FileInputStream(file);
            String a = file.getAbsolutePath();
           // Log.d("Send", a);

        } catch (IOException e) {
        }
        bytes = new byte[1024];
        long a=0;
        String b=null;
        try {
            while ( fis.read(bytes, 0, bytes.length)>0) {
                dos.write(bytes,0,bytes.length);
                dos.flush();
                a=(a+bytes.length);
            }
            b=a+"";
            Log.v("Send",b);
           // Log.v("Send",a.toString());
            System.out.print(b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(dos!=null){
                try {
                    dos.flush();
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            }
    }

    public void run() {
        connect();
    }

}

求求懂得大神给我解答一下,急需

  • 写回答

2条回答 默认 最新

  • ljheee 2017-04-05 11:40
    关注

    哪里 有问题呢???

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题