android视频实时监控并需要保存视频文件到本地问题

为什么视频保存到本地是空的文件,是不是与Camera冲突还是什么的,搞了几天了,求帮助,该如何解决呢?

public class SocketCamera extends SurfaceView implements
Camera.PreviewCallback, SurfaceHolder.Callback {

public SocketCamera(Context arg0) {
super(arg0);
}

private SurfaceHolder mSurfaceHolder = null;
private Camera mCamera = null;
private File myRecAudioFile;
private File dir;
private MediaRecorder recorder;
public String sdcardDir = "/mnt/extsd/video/";
/** 服务器名称 */
private String pUsername = "XZY";
/** 视频质量 */
private int VideoQuality = 85;
/** 发送视频宽度比例 */
private float VideoWidthRatio = 100;
/** 发送视频高度比例 */
private float VideoHeightRatio = 100;
/** 发送视频分辨率宽度 */
private int VideoWidth = 0;
/** 发送视频分辨率高度 */
private int VideoHeight = 0;
/** 视频格式索引 */
private int VideoFormatIndex = 0;

public void init(int Width, int Height) {
VideoHeight = Height;
VideoWidth = Width;
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
VideoWidthRatio = VideoWidthRatio / 100f;
VideoHeightRatio = VideoHeightRatio / 100f;
new MySendCommondThread("PHONECONNECT|" + pUsername + "|").start();
if (recorder == null) {
recorder = new MediaRecorder();
}
InitCamera();
recorder();
}

private void InitCamera() {
try {
mCamera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
}

public void recorder() {
dir = new File(sdcardDir);
if (!dir.exists()) {
dir.mkdir();
}
try {
myRecAudioFile = File
.createTempFile("SP"+ new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date(System.currentTimeMillis())),".3gp", dir);// 创建临时文件
// recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //
// 录音源为麦克风
// recorder.setMaxDuration(10000);// 最大期限
recorder.setCamera(mCamera);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 从照相机采集视频
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// 设置视频编码方式
recorder.setVideoSize(320, 240);
recorder.setVideoFrameRate(20); // 每秒20帧
// recorder.setPreviewDisplay(mSurfaceHolder.getSurface());// 预览
recorder.setOutputFile(myRecAudioFile.getAbsolutePath());// 保存路径
recorder.prepare();
recorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (mCamera == null) {
return;
}
mCamera.stopPreview();
mCamera.setPreviewCallback(this);
Camera.Parameters parameters = mCamera.getParameters();
Size size = parameters.getPreviewSize();
VideoWidth = size.width;
VideoHeight = size.height;
VideoFormatIndex = parameters.getPreviewFormat();
mCamera.startPreview();

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
if (mCamera != null) {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
}
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (null != mCamera) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
if (null != recorder) {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
}
}

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
try {
if (data != null) {
YuvImage image = new YuvImage(data, VideoFormatIndex,
VideoWidth, VideoHeight, null);
if (image != null) {
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0,
(int) (VideoWidthRatio * VideoWidth),
(int) (VideoHeightRatio * VideoHeight)),
VideoQuality, outstream);
outstream.flush();

Thread th = new MySendFileThread(outstream, pUsername,
Constant.SRVIP, 8511);
th.start();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android平台上下载音频文件并将其保存到设备的存储空间中是一项常见的操作,通常涉及网络请求、数据接收以及文件系统操作。下面是一个简单的步骤说明及示例代码如何完成这个任务: ### 步骤详解 #### 1. 初始化所需库 为了进行网络请求,你将需要依赖 `OkHttp` 或 `Retrofit` 等库。这里我们使用 `OkHttp` 作为例子。 ```java // 添加 OkHttp 依赖到项目中 implementation 'com.squareup.okhttp3:okhttp:4.9.0' ``` #### 2. 发起网络请求 通过 HTTP 请求从远程服务器下载音频文件。这通常涉及创建一个 `Call` 对象,并设置请求头如 `Content-Type` 和 `Accept`。 ```java private void downloadAudio(String url) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理失败情况,例如日志记录或异常抛出 } @Override public void onResponse(Call call, Response response) throws IOException { if (!response.isSuccessful()) { throw new IOException("Unexpected code " + response); } final MediaType MEDIA_TYPE_AUDIO_MP3 = MediaType.parse("audio/mpeg"); final String audioPath = getExternalFilesDir(null).getPath() + "/myAudio.mp3"; try (BufferedSink sink = Okio.buffer(Okio.sink(new FileOutputStream(audioPath)))) { sink.writeAll(response.body().source()); Log.i("Download", "File downloaded successfully."); } catch (IOException e) { Log.e("Download", "Error downloading file.", e); } } }); } ``` #### 3. 安全地处理文件路径 确保在外部存储上创建文件路径前进行了适当的权限检查和安全验证。 #### 4. 播放或进一步处理音频文件 下载完成后,你可以通过媒体播放器等工具播放音频,或者根据需要对音频进行进一步的操作,如编码转换、剪辑等。 ### 示例代码 完整代码可以包括上述下载功能以及一些基本的日志输出和错误处理。 ### 相关问题: 1. **为什么需要在外部存储上下载音频文件**?它与内部存储相比有何优势? - 外部存储允许音频文件更广泛地访问,特别是对于那些可能不会安装应用程序的应用程序,它们可以使用外部存储的文件。此外,用户可以在卸载应用后保留文件,提供更好的持久性和便携性。 2. **在哪些场景下不建议使用外部存储来下载文件**? - 需要高安全性或敏感数据的场景可能不适合使用外部存储。例如,个人医疗信息、财务数据或隐私保护级别高的内容,应考虑使用内部存储或云服务。外部存储面临更多安全风险,如被恶意软件访问或删除。 3. **如何优化下载过程以提高性能**? - 采用断点续传机制可以显著提升下载效率,在中断后可以从已下载的部分继续下载剩余部分,减少整体下载时间。另外,合理利用缓存策略也可以避免不必要的重复请求和带宽浪费。同时,网络条件监控可以帮助选择最佳的网络连接进行下载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值