苹果微信视频录制软件的时候,有什么软件可以现场录制下来

仿微信小视频录制控件 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 8时,
本文为用&MediaRecorder&录制小视频的控件,可以设置视频录制的时间、空间大小、初始时是否打开摄像头等。&此控件为组合控件,继承自&LinearLayout&,为防止出错,需实现&android.media.MediaRecorder.OnErrorListener&接口。最近在运营一个微信公众号《反脆弱性成长》,欢迎关注
代码片段(7)
1.&[图片] 小视频录制界面.png&&&&
MovieRecorderView.java&~&9KB&&&&
import java.io.F
import java.io.IOE
import java.util.T
import java.util.TimerT
import android.content.C
import android.content.res.TypedA
import android.hardware.C
import android.hardware.Camera.P
import android.media.MediaR
import android.media.MediaRecorder.AudioE
import android.media.MediaRecorder.AudioS
import android.media.MediaRecorder.OnErrorL
import android.media.MediaRecorder.OutputF
import android.media.MediaRecorder.VideoE
import android.media.MediaRecorder.VideoS
import android.util.AttributeS
import android.view.LayoutI
import android.view.SurfaceH
import android.view.SurfaceHolder.C
import android.view.SurfaceV
import android.widget.LinearL
import android.widget.ProgressB
import com.contron.dgyj.R;
import com.mon.G
import com.contron.dgyj.im.ImG
import com.lidroid.xutils.util.LogU
* 视频播放控件
* @author liuyinjun
public class MovieRecorderView extends LinearLayout implements OnErrorListener {
private SurfaceView mSurfaceV
private SurfaceHolder mSurfaceH
private ProgressBar mProgressB
private MediaRecorder mMediaR
private Camera mC
private Timer mT// 计时器
private OnRecordFinishListener mOnRecordFinishL// 录制完成回调接口
private int mW// 视频分辨率宽度
private int mH// 视频分辨率高度
private boolean isOpenC// 是否一开始就打开摄像头
private int mRecordMaxT// 一次拍摄最长时间
private int mTimeC// 时间计数
private File mVecordFile =// 文件
public MovieRecorderView(Context context) {
this(context, null);
public MovieRecorderView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public MovieRecorderView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MovieRecorderView, defStyle, 0);
mWidth = a.getInteger(R.styleable.MovieRecorderView_width, 320);// 默认320
mHeight = a.getInteger(R.styleable.MovieRecorderView_height, 240);// 默认240
isOpenCamera = a.getBoolean(R.styleable.MovieRecorderView_is_open_camera, true);// 默认打开
mRecordMaxTime = a.getInteger(R.styleable.MovieRecorderView_record_max_time, 10);// 默认为10
LayoutInflater.from(context).inflate(R.layout.movie_recorder_view, this);
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mProgressBar.setMax(mRecordMaxTime);// 设置进度条最大量
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(new CustomCallBack());
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
a.recycle();
* @author liuyinjun
private class CustomCallBack implements Callback {
public void surfaceCreated(SurfaceHolder holder) {
if (!isOpenCamera)
initCamera();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
public void surfaceDestroyed(SurfaceHolder holder) {
if (!isOpenCamera)
freeCameraResource();
* 初始化摄像头
* @author liuyinjun
* @throws IOException
private void initCamera() throws IOException {
if (mCamera != null) {
freeCameraResource();
mCamera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
freeCameraResource();
if (mCamera == null)
setCameraParams();
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
mCamera.unlock();
* 设置摄像头为竖屏
* @author liuyinjun
private void setCameraParams() {
if (mCamera != null) {
Parameters params = mCamera.getParameters();
params.set("orientation", "portrait");
mCamera.setParameters(params);
* 释放摄像头资源
* @author liuyinjun
private void freeCameraResource() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.lock();
mCamera.release();
private void createRecordDir() {
File sampleDir = new File(Environment.getExternalStorageDirectory() + File.separator + "im/video/");
if (!sampleDir.exists()) {
sampleDir.mkdirs();
File vecordDir = sampleD
// 创建文件
mVecordFile = File.createTempFile("recording", ".mp4", vecordDir);//mp4格式
LogUtils.i(mVecordFile.getAbsolutePath());
} catch (IOException e) {
* @author liuyinjun
* @throws IOException
private void initRecord() throws IOException {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.reset();
if (mCamera != null)
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setOnErrorListener(this);
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 视频源
mMediaRecorder.setAudioSource(AudioSource.MIC);// 音频源
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音频格式
mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:
// mMediaRecorder.setVideoFrameRate(16);// 这个我把它去掉了,感觉没什么用
mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 512);// 设置帧频率,然后就清晰了
mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制
mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 视频录制格式
// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
* 开始录制视频
* @author liuyinjun
* @param fileName
视频储存位置
* @param onRecordFinishListener
达到指定时间之后回调接口
public void record(final OnRecordFinishListener onRecordFinishListener) {
this.mOnRecordFinishListener = onRecordFinishL
createRecordDir();
if (!isOpenCamera)// 如果未打开摄像头,则打开
initCamera();
initRecord();
mTimeCount = 0;// 时间计数器重新赋值
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
public void run() {
// TODO Auto-generated method stub
mTimeCount++;
mProgressBar.setProgress(mTimeCount);// 设置进度条
if (mTimeCount == mRecordMaxTime) {// 达到指定时间,停止拍摄
if (mOnRecordFinishListener != null)
mOnRecordFinishListener.onRecordFinish();
}, 0, 1000);
} catch (IOException e) {
e.printStackTrace();
* 停止拍摄
* @author liuyinjun
public void stop() {
stopRecord();
releaseRecord();
freeCameraResource();
* 停止录制
* @author liuyinjun
public void stopRecord() {
mProgressBar.setProgress(0);
if (mTimer != null)
mTimer.cancel();
if (mMediaRecorder != null) {
// 设置后不会崩
mMediaRecorder.setOnErrorListener(null);
mMediaRecorder.setPreviewDisplay(null);
mMediaRecorder.stop();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
* 释放资源
* @author liuyinjun
private void releaseRecord() {
if (mMediaRecorder != null) {
mMediaRecorder.setOnErrorListener(null);
mMediaRecorder.release();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
mMediaRecorder =
public int getTimeCount() {
return mTimeC
* @return the mVecordFile
public File getmVecordFile() {
return mVecordF
* 录制完成回调接口
* @author liuyinjun
public interface OnRecordFinishListener {
public void onRecordFinish();
public void onError(MediaRecorder mr, int what, int extra) {
if (mr != null)
mr.reset();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
movie_recorder_view.xml&~&747B&&&&
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_dark"
android:orientation="vertical"&
&SurfaceView
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
&ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="2dp"
&/LinearLayout&
attrs.xml&~&509B&&&&
&?xml version="1.0" encoding="utf-8"?&
&resources&
&declare-styleable name="MovieRecorderView"&
&!-- 开始是否打开摄像头 --&
&attr name="is_open_camera" format="boolean" /&
&!-- 一次拍摄最长时间 --&
&attr name="record_max_time" format="integer"/&
&!-- 视频分辨率宽度 --&
&attr name="width" format="integer"/&
&!-- 视频分辨率高度 --&
&attr name="height" format="integer"/&
&/declare-styleable&
&/resources&
MainActivity.java&~&3KB&&&&
package com.example.
import android.app.A
import android.os.B
import android.os.H
import android.os.M
import android.view.MotionE
import android.view.V
import android.view.View.OnTouchL
import android.widget.B
import android.widget.T
import com.example.myvideo.MovieRecorderView.OnRecordFinishL
public class MainActivity extends Activity {
private MovieRecorderView mRecorderV
private Button mShootB
private boolean isFinish =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecorderView = (MovieRecorderView) findViewById(R.id.movieRecorderView);
mShootBtn = (Button) findViewById(R.id.shoot_button);
mShootBtn.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mRecorderView.record(new OnRecordFinishListener() {
public void onRecordFinish() {
handler.sendEmptyMessage(1);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (mRecorderView.getTimeCount() & 1)
handler.sendEmptyMessage(1);
if (mRecorderView.getVecordFile() != null)
mRecorderView.getVecordFile().delete();
mRecorderView.stop();
Toast.makeText(MainActivity.this, "视频录制时间太短", Toast.LENGTH_SHORT).show();
public void onResume() {
super.onResume();
isFinish =
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
isFinish =
mRecorderView.stop();
public void onPause() {
super.onPause();
public void onDestroy() {
super.onDestroy();
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
finishActivity();
private void finishActivity() {
if (isFinish) {
mRecorderView.stop();
VideoPlayerActivity.startActivity(this, mRecorderView.getVecordFile().toString());
* 录制完成回调
* @author liuyinjun
public interface OnShootCompletionListener {
public void OnShootSuccess(String path, int second);
public void OnShootFailure();
activity_main.xml&~&925B&&&&
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:orientation="vertical"&
&com.example.myvideo.MovieRecorderView
android:id="@+id/movieRecorderView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="3dp" /&
android:id="@+id/shoot_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_movie_add_shoot"
android:text="按住拍"
android:textColor="#ECEBF1"/&
&/LinearLayout&
7.&[图片] bg_movie_add_shoot.png&&&&
开源中国-程序员在线工具:
相关的代码(1524)
这么牛逼的代码 竟然没有人评论。楼主谢谢分享
2楼:人生如歌 发表于
引用来自“初学Android者”的评论这么牛逼的代码 竟然没有人评论。楼主谢谢分享一楼客气了
3楼:lear321 发表于
lz,很好用,就是拍完后的视频播放时不清晰,怎么解决?
4楼:人生如歌 发表于
引用来自“lear321”的评论lz,很好用,就是拍完后的视频播放时不清晰,怎么解决?你好,可以在代码的210行把帧频率设大一点
5楼:孙泽伟 发表于
R.styleable 新手。求上传这个文件
6楼:孙泽伟 发表于
楼主。加个QQ &
7楼:人生如歌 发表于
引用来自“孙泽伟”的评论R.styleable 新手。求上传这个文件你好,这个是自定义属性,已经上传 attrs.xml 文件
8楼:刘兆伟 发表于
引用来自“lear321”的评论lz,很好用,就是拍完后的视频播放时不清晰,怎么解决?引用来自“人生如歌”的评论你好,可以在代码的210行把帧频率设大一点调大了怎么还是不清楚,清晰度不明显,再调大就闪退了
9楼:人生如歌 发表于
引用来自“lear321”的评论lz,很好用,就是拍完后的视频播放时不清晰,怎么解决?引用来自“人生如歌”的评论你好,可以在代码的210行把帧频率设大一点引用来自“刘兆伟”的评论调大了怎么还是不清楚,清晰度不明显,再调大就闪退了现在的这个帧频率:1 * 1024 * 512,调大要设置成 2 的倍数,如 1* 1024 * 1024 等,再者看看手机支持这种帧频率不。因为我还没碰到这种问题,所以你最好看看报什么错误,好对症下药。
10楼:yanlu_123 发表于
你好 &我是新手 &有点不知道这个怎么用,可以麻烦指导一下吗
11楼:人生如歌 发表于
引用来自“yanlu_123”的评论你好 &我是新手 &有点不知道这个怎么用,可以麻烦指导一下吗你好,我已经上传了 MainActivity 与资源文件。
12楼:yanlu_123 发表于
谢谢。非常感谢。
13楼:kissy小强 发表于
大神,请问VideoPlayerActivity LogUtils
这个类怎么弄?
14楼:人生如歌 发表于
引用来自“kissy小强”的评论大神,请问VideoPlayerActivity LogUtils
这个类怎么弄?不好意思,这里面用到了一个xutil框架,你看看引入的包“ import com.lidroid.xutils.util.LogU ”就知道了,以后碰到这种不认识的类就看看引入的是哪个包,马上就知道是否自定义的类啦,其实这个 LogUtils 就是 android 的原生 Log 一样的打印日志。
15楼:itzyjr 发表于
VideoPlayerActivity在哪?
16楼:kissy小强 发表于
引用来自“kissy小强”的评论大神,请问VideoPlayerActivity LogUtils
这个类怎么弄?引用来自“人生如歌”的评论不好意思,这里面用到了一个xutil框架,你看看引入的包“ import com.lidroid.xutils.util.LogU ”就知道了,以后碰到这种不认识的类就看看引入的是哪个包,马上就知道是否自定义的类啦,其实这个 LogUtils 就是 android 的原生 Log 一样的打印日志。Verry Thank you!!受教了。
17楼:stormdzh 发表于
可以给我发个源码不啊 ,
18楼:itzyjr 发表于
发现这个demo里面有个最大的问题,就是视频预览被拉伸,并且这个拉伸的问题是最难解决的。
19楼:晓篷子 发表于
有点问题 ,能发下源码么。
20楼:androidxxx 发表于
能发下源码吗
开源从代码分享开始
人生如歌的其它代码教大家如何转换微信聊天记录的音频 视频 和图片_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
教大家如何转换微信聊天记录的音频 视频 和图片
上传于||文档简介
&&微​信​是​当​下​非​常​流​行​的​聊​天​工​具​,​但​由​于​其​消​息​记​录​都​在​手​机​里​,​查​询​和​备​份​记​录​甚​是​麻​烦​,​如​果​能​在​电​脑​上​直​接​查​看​及​备​份​,​那​就​方​便​多​了​。​
​
​
​
​ ​教​大​家​如​何​转​换​音​频​ ​视​频​ ​和​图​片
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢有没有一个软件可以录制视频并且分享到微信 或者QQ空间的?_ipadmini2吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:296,067贴子:
有没有一个软件可以录制视频并且分享到微信 或者QQ空间的?收藏
&苏宁易购&平板电脑,正品保障,全国联保!7天无理由退换货!100个城市半日送达!&苏宁易购&品牌网购商城,平板电脑,品牌专属网络销售,支持货到付款,省钱又放心!
十秒的美拍
我都是手机录完了传到优酷然后分享。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或自拍视频如何上微信?什么格式可以? - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
视频如何上微信?什么格式可以?
聊友,点+,点视频,现场录制或者在相册找都行,但太大的不行,点击发送,就好啦
您的举报已经提交成功,我们将尽快处理,谢谢!
大多是flv .
ASF格式:英文全称为Advanced&Streaming&format,福建计算机培训班老师告诉你它是微软为了和现在的Real&...
你这是什么格式转换为什么格式啊!一般有些软件并不能随意转格式的,因为一般的视频转格式都是有限制的,我建议你用格式工厂,这个软件一般转化的格式还是比较多的。
大家还关注

我要回帖

更多关于 苹果微信视频录制软件 的文章

 

随机推荐