- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想制作一个录制视频的应用程序,它看起来像藤蔓,按住录制,释放它停止,按住录制并保持到最后。
我用过MediaRecorder,但它一次只记录一次,如果我再次开始记录,应用程序就会崩溃。
请告诉我有什么办法可以做到这一点?
我编辑了我的代码:
public class VideoRecordingActivity extends AppCompatActivity implements View.OnTouchListener, View.OnLongClickListener {
private Context myContext;
private boolean hasCamera;
private boolean onRecording;
private Camera mCamera;
private CameraPreview mPreview;
private MediaRecorder mediaRecorder;
private boolean cameraFront = false;
private int cameraId;
private int videoNumer;
private boolean isActionDown = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_introduction_recording);
initUI();
initialize();
}
private LinearLayout lnCameraPreview;
private ImageButton btn_recording;
private void initUI() {
lnCameraPreview = (LinearLayout) findViewById(R.id.ln_body_recording);
btn_recording = (ImageButton) findViewById(R.id.btn_recording);
}
public void initialize() {
myContext = this;
mPreview = new CameraPreview(this, cameraId, mCamera);
lnCameraPreview.addView(mPreview);
btn_recording.setOnLongClickListener(this);
btn_recording.setOnTouchListener(this);
videoNumer = 0;
}
public boolean onLongClick(View v) {
isActionDown = true;
try {
boolean isPrepared = false;
if (isActionDown)
isPrepared = prepareMediaRecorder();
if (isPrepared && isActionDown) {
// work on UiThread for better performance
runOnUiThread(new Runnable() {
public void run() {
mediaRecorder.start();
onRecording = true;
}
});
}
} catch (Exception e) {
e.printStackTrace();
Log.e("onLongPress Error ", e.toString());
}
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
isActionDown = false;
try {
if (onRecording) {
if (mediaRecorder != null) {
mediaRecorder.stop();
}
onRecording = false;
videoNumer++;
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
return false;
}
public void onResume() {
super.onResume();
if (!hasCamera(myContext)) {
Toast.makeText(myContext, "Sorry, your phone does not have a camera!", Toast.LENGTH_LONG).show();
return;
}
initCamera();
}
@Override
protected void onPause() {
super.onPause();
// when on Pause, release camera in order to be used from other
// applications
releaseCamera();
}
private final int cMaxRecordDurationInMs = 30000;
private final long cMaxFileSizeInBytes = 5000000;
private final int cFrameRate = 20;
private File prRecordedFile;
@SuppressLint("SdCardPath")
private boolean prepareMediaRecorder() {
mediaRecorder = new MediaRecorder();
try {
mCamera.unlock();
} catch (Exception ex) {
return false;
}
// adjust the camera the way you need
mediaRecorder.setCamera(mCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
//
CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setProfile(cpHigh);
mediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mediaRecorder.setOutputFile("/sdcard/" + videoNumer + "videocapture_example.mp4");
//set max size
mediaRecorder.setMaxDuration(600000); // Set max duration 60 sec.
mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M
try {
mediaRecorder.prepare();
} catch (Exception e) {
releaseMediaRecorder();
e.printStackTrace();
}
return true;
}
private void releaseMediaRecorder() {
if (mediaRecorder != null) {
mediaRecorder.reset(); // clear recorder configuration
mediaRecorder.release(); // release the recorder object
mediaRecorder = null;
if (mCamera != null) {
mCamera.lock(); // lock camera for later use
}
}
}
/**
* Camera
*/
private void initCamera() {
if (mCamera == null) {
// if the front facing camera does not exist
if (findFrontFacingCamera() < 0) {
Toast.makeText(this, "No front facing camera found.", Toast.LENGTH_LONG).show();
}
mCamera = Camera.open(findBackFacingCamera());
mPreview.refreshCamera(mCamera);
}
onRecording = false;
}
private boolean hasCamera(Context context) {
// check if the device has camera
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
hasCamera = true;
} else {
hasCamera = false;
}
return hasCamera;
}
private int findFrontFacingCamera() {
int cameraId = -1;
// Search for the front facing camera
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i < numberOfCameras; i++) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
cameraId = i;
cameraFront = true;
break;
}
}
this.cameraId = cameraId;
return cameraId;
}
private int findBackFacingCamera() {
int cameraId = -1;
// Search for the back facing camera
// get the number of cameras
int numberOfCameras = Camera.getNumberOfCameras();
// for every camera check
for (int i = 0; i < numberOfCameras; i++) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
cameraId = i;
cameraFront = false;
break;
}
}
this.cameraId = cameraId;
return cameraId;
}
public void switchCamera() {
// if the camera preview is the front
if (cameraFront) {
int cameraId = findBackFacingCamera();
if (cameraId >= 0) {
// open the backFacingCamera
mCamera = Camera.open(cameraId);
// refresh the preview
mPreview.refreshCamera(mCamera);
}
} else {
int cameraId = findFrontFacingCamera();
if (cameraId >= 0) {
// open the backFacingCamera
mCamera = Camera.open(cameraId);
// refresh the preview
mPreview.refreshCamera(mCamera);
}
}
}
private void releaseCamera() {
// stop and release camera
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
最佳答案
您可以通过在录制按钮上设置 OnLongClickListener() 和 OnTouchListener() 来实现此功能。像这样:
recordBtn.setOnLongClickListener(recordBtnLCListener);
recordBtn.setOnTouchListener(recordBtnTouchListener);
@Override
public boolean onLongClick(View v) {
ivCancel.setVisibility(View.GONE);
ivDone.setVisibility(View.GONE);
isActionDown = true;
try {
if (isActionDown) {
initRecorder();
if (isActionDown)
prepareRecorder();
}
if (isPrepared && isActionDown) {
mMediaRecorder.start();
isRecording = true;
}
} catch (Exception e) {
e.printStackTrace();
Log.e("onLongPress Error ", e.toString());
}
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
isActionDown = false;
try {
if (isRecording) {
if (mMediaRecorder != null) {
mMediaRecorder.stop();
}
isRecording = false;
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
return false;
}
public void mergeVideos() {
try {
List<Movie> inMovies = new ArrayList<>();
for (int i = 0; i < videosPathList.size(); i++) {
String filePath = videosPathList.get(i);
try {
Movie movie = MovieCreator.build(filePath);
if (movie != null)
inMovies.add(movie);
} catch (Exception e) {
e.printStackTrace();
}
}
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
for (Movie m : inMovies) {
for (Track t : m.getTracks()) {
try {
if (t.getHandler().equals("soun")) {
audioTracks.add(t);
}
if (t.getHandler().equals("vide")) {
videoTracks.add(t);
}
} catch (Exception e) {
}
}
}
Movie result = new Movie();
if (audioTracks.size() > 0) {
result.addTrack(new AppendTrack(audioTracks
.toArray(new Track[audioTracks.size()])));
}
if (videoTracks.size() > 0) {
result.addTrack(new AppendTrack(videoTracks
.toArray(new Track[videoTracks.size()])));
}
BasicContainer out = (BasicContainer) new DefaultMp4Builder().build(result);
File f = null;
String finalVideoPath;
try {
f = setUpVideoFile(Environment
.getExternalStorageDirectory()+"/MyApp/videos/");
finalVideoPath = f.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
f = null;
finalVideoPath = null;
}
WritableByteChannel fc = new RandomAccessFile(finalVideoPath, "rw").getChannel();
out.writeContainer(fc);
fc.close();
deleteFilesDir(); //In this method you have to delete all parts of video stored in temporary folder.
} catch (Exception e) {
e.printStackTrace();
progressDialog.dismiss();
finish();
}
}
File setUpVideoFile(String directory) throws IOException {
File videoFile = null;
if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {
File storageDir = new File(directory);
if (storageDir != null) {
if (!storageDir.mkdirs()) {
if (!storageDir.exists()) {
Log.d("CameraSample", "failed to create directory");
return null;
}
}
}
videoFile = File.createTempFile("video_"
+ System.currentTimeMillis() + "_",
.mp4, storageDir);
}
return videoFile;
}
compile 'com.googlecode.mp4parser:isoparser:1.0.5.4'
关于android - 点击并按住以录制视频,如 Vine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32858075/
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
当你从我的应用程序中点击一个 vine url 时,我正在尝试打开 vine 应用程序。做 NSURL *url = [NSURL URLWithString:@"vine://http://vine
我从 Web-Service API 获取视频链接,现在我想要的是这些视频应该像 vine 应用程序一样显示在 UITableview 中,并且它们必须在 UITableview 中自动播放本身就像
我正在使用他们提供的标准嵌入代码嵌入 Vine,该代码会加载带有视频的 iframe。由于它是一个跨域 iframe,我无法通过 Javascript 访问它并播放/暂停视频。 我有一个 Vines
我要embed Vine videos on my site .默认情况下音频被禁用(有充分的理由), 我希望在页面加载时变坏并取消视频静音, 该视频似乎使用了 videojs,有没有办法通过他们的
我正在开发一个视频应用程序。我想像在 vine 应用程序中一样录制视频。表示在点击时录制并在移除点击时停止录制。 请告诉我如何在触摸上添加框架。 最佳答案 我整理了一些可能对你有用的东西。 https
我正在开发一个应用程序,我必须在 Vine 上上传媒体 Vine 。我尝试了以下API并成功登录。 NSString *abcd=[NSString stringWithFormat:@"https:
我想制作一个录制视频的应用程序,它看起来像藤蔓,按住录制,释放它停止,按住录制并保持到最后。 我用过MediaRecorder,但它一次只记录一次,如果我再次开始记录,应用程序就会崩溃。 请告诉我有什
我正在寻求一些关于如何实现 vine 和 Instagram 在 Android 上使用的视频录制功能的指示或指导。 也就是说,当用户点击并按住时,视频开始录制。当用户松开时,视频录制暂停,但当用户再
在我的应用程序中,我想在 vine 上分享一个视频。我搜索了很多但没有得到在 vine 上分享视频的正确结果。 提前致谢。 最佳答案 查看https://github.com/VineAPI/Vine
我爱vinepeek并希望做得更好。 我有 Vine 链接,例如http://vine.co/v/bJqWrOHjMmU,但是这是指向页面的链接,而不是视频 URL。 我知道它是新的,但是 Vine
我找到了这个:https://github.com/VineAPI/VineAPI/blob/master/endpoints.md 我遵循一些在 vine 应用程序上分享视频的过程。1.登录: ht
我想使用 UIImagePickerController 来录制多个视频剪辑,然后将它们拼接成一个视频,类似于 Vine 应用程序的做法。任何人都可以指出我如何将视频片段组合成一个视频的正确方向吗?
你能告诉我 iPhone 上的 Vine 或 Instgram 的视频播放功能吗?他们是在服务器上播放视频文件还是将视频文件下载到设备然后播放?谢谢!! 最佳答案 我尝试使用 hopper 反编译 v
我是 xmpp 的新手,所有这一切都意味着。我是 RoR 开发人员,我需要为项目使用 xmpp 服务器。最重要的是,我需要做一些大量的自定义,以便我的 Rails 应用程序可以创建用户、与他们交 fr
这个问题在这里已经有了答案: How to upload video to Vine programmatically on iOS? (1 个回答) 关闭 8 年前。
我刚刚下载了适用于 Android 的 Vine 应用程序,我注意到“使用 Twitter 登录”功能已与 Android Twitter 应用程序集成。 我的意思是,如果您已经使用 Twitter
我在网上能找到的都是关于从 Vine 检索信息的(通过未记录的 API)。如何以编程方式将应用程序中的视频上传到 Vine? 我刚在应用商店发现这个应用可以做到这一点: https://itunes.
我正在寻找适用于 iOS 的 vine 风格的视频播放控件。这意味着,一旦包含在 tableviewcell 中的视频出现,它就会自动播放,而不会在 iPhone 上弹出烦人的单独模式。是否已经存在类
我正在做一个小项目。 我可以嵌入并显示指定的 vine.co 视频 我正在通过 Ajax 拉入链接以在页面上显示它们,但现在的问题是它们都是自动播放的,这会导致主要的浏览器延迟。 有谁知道如何在禁用
我是一名优秀的程序员,十分优秀!