android 音视频录制

介绍一个自己刚出炉的安卓音视频播放录制开源项目 **回到主题,这篇文章主要是介绍一个自己刚出炉的音视频播放录制开源项目**:[UnitedPlayer](https://github.com/yishuinanfeng/UnitedPlayer) 为什么叫做UnitedPlayer呢?因为我是一个17年的曼联球迷,曼联英文名为Manchester United,为了简单,我就叫做UnitedPlayer。 简单介绍下,**这是一个支持录制和播放音频视频的应用,录制的视频将在播放列表中显示,点击列表项即可播放,并提供不同仿抖音滤镜特效。** 阅读详情
<!--音频录制权限-->     
 <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>   
<!--视频录制权限-->   
     <uses-permission android:name="android.permission.CAMERA"/>            
     <uses-permission android:name="android.permission.RECORD_AUDIO"/>            
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    

视频录制
<pre name="code" class="java">package cn.media;   
   
import java.io.File;   
import java.io.IOException;   
   
import android.app.Activity;   
import android.media.MediaRecorder;   
import android.os.Bundle;   
import android.os.Environment;   
import android.view.SurfaceHolder;   
import android.view.SurfaceView;   
import android.view.View;   
import android.view.View.OnClickListener;   
import android.widget.Button;   
   
//视频录制:</pre><pre name="code" class="java">public class MediaConnection extends Activity {   
    private File myRecAudioFile;   
    private SurfaceView mSurfaceView;   
    private SurfaceHolder mSurfaceHolder;   
    private Button buttonStart;   
    private Button buttonStop;   
    private File dir;   
    private MediaRecorder recorder;   
   
    @Override   
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.video);   
        mSurfaceView = (SurfaceView) findViewById(R.id.videoView);   
        mSurfaceHolder = mSurfaceView.getHolder();   
   
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
        buttonStart = (Button) findViewById(R.id.start);   
        buttonStop = (Button) findViewById(R.id.stop);   
        File defaultDir = Environment.getExternalStorageDirectory();   
        String path = defaultDir.getAbsolutePath() + File.separator + "V"   
                + File.separator;   
        // 创建文件夹存放视频   
        dir = new File(path);   
        if (!dir.exists()) {   
            dir.mkdir();   
        }   
        recorder = new MediaRecorder();   
        buttonStart.setOnClickListener(new OnClickListener() {   
            @Override   
            public void onClick(View v) {   
                recorder();   
            }   
        });   
   
        buttonStop.setOnClickListener(new OnClickListener() {   
            @Override   
            public void onClick(View v) {   
                recorder.stop();   
                recorder.reset();   
                recorder.release();   
                recorder = null;   
            }   
        });   
    }   
   
    public void recorder() {   
        try {   
            myRecAudioFile = File.createTempFile("video", ".3gp", dir);// 创建临时文件   
            recorder.setPreviewDisplay(mSurfaceHolder.getSurface());// 预览   
   
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 视频源   
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);   
            // 录音源为麦克风   
   
            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);   
            // 输出格式为3gp   
            recorder.setVideoSize(800, 480);// 视频尺寸   
            recorder.setVideoFrameRate(15);// 视频帧频率   
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);// 视频编码   
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);   
            // 音频编码   
            recorder.setMaxDuration(10000);// 最大期限   
            recorder.setOutputFile(myRecAudioFile.getAbsolutePath());   
            // 保存路径   
            recorder.prepare();   
            recorder.start();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
    }   
}   
</pre>    

音频录制:

package cn.media;   
   
import java.io.File;   
import java.io.IOException;   
   
import android.app.Activity;   
import android.content.ContentResolver;   
import android.content.ContentValues;   
import android.content.Intent;   
import android.media.MediaRecorder;   
import android.net.Uri;   
import android.os.Environment;   
import android.provider.MediaStore;   
import android.util.Log;   
/**  
 * 音频录制  
 * @author Administrator  
 *  
 */   
public class MyMediaRecoder extends Activity {   
   
    MediaRecorder mrec;   
    File audiofile=null;   
    private static final String TAG="SoundRecordingDemo";   
    protected void startRecording() throws IOException   
    {   
//      设置音频源   
        mrec.setAudioSource(MediaRecorder.AudioSource.MIC);   
//      设置文件输出格式   
        mrec.setOutputFormat(MediaRecorder.AudioEncoder.AMR_NB);   
        if(audiofile==null){   
            File sampleDir=Environment.getExternalStorageDirectory();   
            try{   
                audiofile=File.createTempFile("ibm", ".3gp",sampleDir);   
            }   
            catch(IOException e){   
                Log.e(TAG,"sdcard access error");   
                return;   
            }   
        }   
//      文件输出路径   
        mrec.setOutputFile(audiofile.getAbsolutePath());   
           
        mrec.prepare();   
        mrec.start();   
    }   
    protected void stopRecording(){   
        mrec.stop();   
        mrec.release();   
        processAudiofile(audiofile);   
    }   
    protected void processAudiofile(File audiofile){   
        ContentValues values=new ContentValues(3);   
        long current=System.currentTimeMillis();   
        values.put(MediaStore.Audio.Media.TITLE,"audio"+audiofile.getName());   
        values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName());    
        values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));    
        values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");    
        values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());    
        ContentResolver contentResolver=getContentResolver();   
        Uri base=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;   
        Uri newUri=contentResolver.insert(base,values);   
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,newUri));   
    }   
}   

调用系统录音机:

Intent intent=new Intent(android.content.Intent.ACTION_VIEW);   
      File sdcardPath=Environment.getExternalStorageDirectory();   
      Uri audioFileUri=Uri.fromFile(sdcardPath);   
      intent.setDataAndType(audioFileUri,"audio/mp3");   
      startActivity(intent);  
权限:

android MediaRecorder录制音视频实现直播的基础 工作这么久,一直都很忙,好不容易闲下来就不习惯了。突然觉得应该做点有意义的事情,这几天研究了一下视屏直播方面的知识,使用camara,surfaceview,MediaRecorder录制音视频,surfaceview提供camara的预览。好了废话不多说了首先了解api吧。 一。首先初始化camara private int camaraBack=1;//1后置摄像头  0前置摄像头 pr 阅读详情

相关推荐

Android 音视频录制概述

相比于IOS健全的多媒体库,Android的多媒体库就显得非常的发育不全了,视频录制在安卓手机上是一个比较有挑战性的问题,当然我这里说的并不是那种用MediaRecorder做视频录制,那种说实话太low,很固化,灵活性为0。但是现在应用市场音视频的app比比皆是,视频录制在这类音视频应用中又是一种必须,虽然,安卓提供的音视频库是那么的“不堪”,但是,录制视频还是可行的。抛开刚刚说的MediaRec

DaltSoftware的博客 2267

Android录制视频,硬编API实现录制的几种方式

本文大致上讲了一些 Android 本身提供的一些硬编码方式,本质都是 MediaCodec 和一些基于它封装的一些工具。包括 MediaRecorder 与 VideoCapture 都是基于它实现的。本文的代码有一点多,我们可以通过代码简单的了解 I420、NV21、Surface 几种数据源的不同编码方式。MediaCodec 不同的配置代表什么会有什么样的影响。我们也能了解几种编码方式的不同用法,异步回调与同步处理有什么区别,封装合成器如何使用?

Eqiqi的博客 4127

Android 音视频录制程序

Android 音视频录制程序 视频h.263 音频 AMR_NB

[技术分享]Android平台实时音视频录像模块设计之道

Android录像模块接口概述调用描述接口接口描述录像设置是否录像r设置是否启用本地录像创建录像目录创建录像文件目录设置录像目录设置录像文件目录音频录像音频录制开关视频录像视频录制开关设置录像文件大小设置每个录像文件的大小,比如100M,超过这个大小后,会自动生成下一个录像文件开始录像开始录像暂停/恢复录像Pause recorder(暂停/恢复录像)停止录像停止录像。

大牛直播SDK 831

Android音视频录制与回放

Android实现音视频实时录制和回放,音频使用两个独立的线程进行采集与播放,视频是通过提三方库实现的

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2105

关于Android音视频,实现录屏并输出MP4文件

一个视频从录制到生成MP4文件的过程和需要用到的工具类及作用

LingoA的博客 2058

汽车诊断服务(UDS——0x11服务解析)

ECU复位服务(0x11)详解:该服务支持硬件/钥匙开关/软件三种复位类型(0x01-0x03),复位前需发送肯定响应。请求格式为11+子功能,响应含51+子功能。典型应用需配合安全访问流程,测试时需监控CAN总线通信及DTC状态。复位后ECU将返回默认会话,期间不处理任何诊断请求。服务在编程会话且安全解锁后执行,硬复位会初始化存储数据。

从事汽车行业 979

Android APP 音视频(02)MediaProjection录屏与MediaCodec编码

这里主要是使用MediaProjection获取屏幕数据,将数据通过mediacodec编码输出到存储卡上。这里主要介绍 MediaProjection的基本原理和流程、 MediaCodec编码的简单说明,便于对代码有所理解。

wangdsh的博客 4688

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

OpenFoam实用技巧——starccm网格高效转换openfoam格式全解析

本文详细解析了如何利用OpenFOAM官方工具`ccm26toFoam`,将STAR-CCM+生成的高质量网格高效、稳定地转换为OpenFOAM格式。内容涵盖从STAR-CCM+正确导出网格、执行转换命令、解读转换日志,到转换后关键的边界条件修复与网格质量检查等全流程,旨在帮助用户规避常见错误,实现无缝工作流衔接。

weixin_28309571的博客 457

Android 音视频录制

Android音频,视频录制,涉及到AudioRecorder,MediaRecorder,其中,AudioRecorder只能录制声音,MediaRecorder可以录制声音和视频。还有许多音视频编码格式,文件格式等,详见https://developer.android.com/guide/topics/media/media-formats.html。整理的音视频录制,及播放,Android...

sdbzmyh0的博客 1233

2026华为OD机试(JAVA&Go)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Java实现。

MISAYAONE的博客 34万+

Android音视频之MediaRecorder音视频录制

前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制。学习的主角是MediaRecorder类。 MediaRecorder类介绍: MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息。 MediaRecorder主要函数: setAudioChanne...

423

交换机初始化配置详解

MGMT或称MGT(Management Port,管理端口)是一个可以连接计算机的三层主机端口,如下图所示。只需使用一条双绞线跳线,就可以将计算机的以太网端口与交换机的MGMT端口连接在一起,实现对交换机的配置与管理。也就是说,可以使用MGMT端口代替Console端口实现对交换机或交换机堆叠的网络管理。MGMT端口既可用于交换机的初始化,也可以在交换机初始化完成后,以Telnet、Web浏览器或Cisco CNA方式进行管理。当将计算机连接到独立的交换机时,连接方式如下图所示。

悦分享 1993

利用大规模生物活性挖掘,计算识别针对癌基因驱动蛋白 EGFR、BRAF 与 CDK4 的高亲和力抑制剂

背景:精准癌症治疗需要小分子抑制剂与致瘤蛋白靶点之间的精确匹配。方法:我们使用 Python 及 ChEMBL 数据库 API 开发了一套计算流程,系统性地筛选针对 EGFR、BRAF 与 CDK4 的高亲和力配体。对 IC50 < 1000 nM 的生物活性进行过滤,并检索候选化合物的分子结构(SMILES)以供后续优化。结果:本研究共识别出 [插入总数] 种独特化合物。其中,对 BRAF 激酶而言,我们挑选了一批 IC50 低至 6.0 nM 的高效实验性化合物。

u012133341的博客 96

安卓:使用MediaRecorder录制音视频

首先在清单文件中添加权限(当然动态的权限也可以,看个人情况吧): //读写SD卡 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERN...

风尘的博客 796

深入解析:使用Python进行T矩阵散射计算的完整指南

在物理学和工程学中,散射是一个至关重要的概念。当波(无论是光波、声波还是其他类型的波)遇到一个障碍物时,它会在多个方向上散开。为了理解和预测这种行为,我们需要进行数学建模和计算。其中,T矩阵方法是一种非常有效的工具。在开始计算之前,我们需要定义一些基础函数。"""计算T矩阵的一个元素。参数:- wave_vector: 波矢- scatterer_position: 散射体的位置- scatterer_properties: 散射体的性质(如大小、形状等)返回:- T矩阵的一个元素。

qq_38334677的博客 1054

OpenGl录制音视频:Android平台音视频录制的全新解决方案

OpenGl录制音视频:Android平台音视频录制的全新解决方案 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在移动应用开发领域,音视频录制功能是许多应用不可或缺的组成部分。OpenGl录制音视频项目正是一款面向Android平台的开源解决方案,它利用OpenGl技术,为开发者提供了一种高效且稳定的音视频同步录制方式。无论是短视频制作、直播还是教育应用,这款工具都...

gitblog_06702的博客 267

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android 基于MediaCodec+MediaMuxer实现音视频录制合成

AudioVideoCodec 一款视频录像机,支持AudioRecord录音、MediaCodec输出AAC、MediaMuxer合成音频视频并输出mp4,支持自动对焦、屏幕亮度调节、录制视频时长监听、手势缩放调整焦距等 项目地址 音视频录制合成(github.com/MannaYang/A…) 单独音频录制播放(github.com/MannaYang/A…) 功能简介 目前包含基本的音频...

weixin_30587025的博客 2022

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android Recording Library:音视频录制的全能助手

Android Recording Library:音视频录制的全能助手 在移动应用开发的世界里,音视频录制功能已成为许多应用不可或缺的一部分。无论是社交应用、教育平台还是企业工具,高质量的音视频录制能力都能显著提升用户体验。今天,我们要介绍的“Android Recording Library”就是一个专为Android开发者设计的开源项目,它提供了便捷的音视频录制和播放工具,让你的应用轻松拥有...

gitblog_00002的博客 854

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android openGl录制音视频

步骤->将camera预览至GlSurfaceView上,然后通过EGLSurface+MediaCodec+AudioRecord+MediaMuxer后台录制成Mp4 主要代码: package com.my.video import android.graphics.SurfaceTexture import android.opengl.GLES20 import android.opengl.GLSurfaceView import javax.microedition.khrono

坚持,努力 1474
上一篇: HTTP协议详解(真的很经典)
下一篇: Oracle协议适配器错误解决办法
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值