抖音现在很火,你是不是也很期待做一个类似的App?短视频内容产出优质短视频内容短视频的制作依赖于短视频的采集和特效剪辑,需要使用基本的美颜、混音、滤镜、变速、图片和视频开发抖音App时的混音、字幕等功能。在这些功能的基础上,进行预处理,结合OpenGL、AI、AR技术,生成许多有趣的动态贴纸,让短视频的内容更具创意。视频录制的一般实现过程是先通过Camera和AudioRecord采集最原始的摄像头画面和声音,然后对采集到的数据进行滤波、降噪等预处理。处理完成后,MediaCodec进行硬件编码,***使用MediaMuxer生成最终的MP4文件。短视频视频的处理和播放视频的处理和播放主要是视频清晰度和观看流畅度的体验。对此,可以利用“窄带高清”技术,在节省码率的同时,提供更清晰的观看体验。经测试,在同等视频质量下,最多可节省20-40%的带宽。除了带宽,短视频内容的存储和CDN优化也尤为重要。通常我们需要上传到云存储服务器的内容是短视频内容和封面内容。CDN优化为短视频平台带来的是在短视频***加载和循环播放上的进一步体验。比如解决首播慢的问题,阿里云播放器支持QUIC协议,基于CDN调度,可以让短视频***播放秒开成功率达到98%。此外,还可以在循环播放的同时进行缓存,让用户在重复观看某个短视频时无需消耗流量。录制视频的方式在安卓系统中。如果需要Android设备获取MP4等视频文件,主流的方式有3种:MediaRecorderMediaCodec+MediaMuxerFFmpegMediaRecorder:是Android系统直接提供的录制类,用于录制音视频的类,简单方便。不需要关注中间的录制过程。录音完成后,可以直接播放音频文件。录制的音频文件是压缩的,需要设置编码器。录制好的音频文件可以通过系统自带的播放器播放。优点:大部分是集成的,直接调用相关接口即可,代码量小,简单稳定;缺点:不能实时处理音频;输出音频格式不多。MediaCodec+MediaMuxer:MediaCodec和MediaMuxer的组合也可以实现录音功能。MediaCodec是Android提供的编解码器类,MediaMuxer是复用类(生成视频文件)。从易用性来看,它肯定不如MediaRecorder,但是它可以让我们进行更灵活的操作,比如给录制的视频添加水印等效果。优点:和MediaRecorder一样低功耗,速度更快,更灵活;缺点:支持的格式有限,兼容性问题。FFmpeg:FFmpeg(Fastforwordmpeg,audioandvideoconverter)是一个开源免费的跨平台音视频流解决方案,它提供了录制/音视频编解码、转换、音视频流化的完整解决方案。主要功能是对多媒体数据进行分解、解封装、解码和转码。优点:格式支持非常强,非常灵活,功能强大,兼容性好;缺点:一些C语言的音视频编解码程序,使用起来不是很方便。虽然从数据上看FFmpeg是最好的,但是我们要先排除这个,因为它的易用性是最差的。其次,MediaRecorder也需要排除,所以这里推荐MediaCodec+MediaMuxer。编码器参数码率:数据传输时单位时间内传输的数据位数,KBPS:千比特每秒。比特率与质量成正比,也与文件大小成正比。如果码率超过一定值,对图像质量影响不大。帧率:每秒显示多少帧,FPS。关键帧间隔:在H.264编码中,编码后输出的压缩图像数据有很多种,可以简单分为关键帧和非关键帧。关键帧可以独立解码为图像的压缩产品。非关键帧包含了与其他帧的“差异”信息,也可以称为“参考帧”。它的解码需要参考关键帧来解码图像。非关键帧具有更高的压缩率。MediaCodec+MediaMuxer使用了MediaMuxer和MediaCodec这两个类,它们的参考资料:http://developer.android.com/reference/android/media/MediaMuxer.htmlhttp://developer.android.com/reference/android里面有使用到的框架在/media/MediaCodec.html中。这种结合可以实现很多功能,比如编辑音视频文件(结合MediaExtractor)、用OpenGL绘制Surface并生成MP4文件、录屏、类似CameraApp的录音功能(虽然MediaRecorder更适合这个)等.其中一个生成视频,另一个生成音频。在这里,它们结合在一起同时生成音频和视频。基本框架和流程如下:一、录制线程,主要参考HWEncoderExperiments。通过AudioRecord类接收麦克风的采样数据,然后丢给Encoder准备编码:AudioRecorderaudio_recorder;audio_recorder=newAudioRecord(MediaRecorder.AudioSource.MIC,SAMPLE_RATE,CHANNEL_CONFIG,AUDIO_FORMAT,buffer_size);//...audio_recorder.startRecording();while(is_recording){byte[]this_buffer=newbyte[frame_buffer_size];read_result=audio_recorder.read(this_buffer,0,frame_buffer_size);//读取音频原始数据//...presentationTimeStamp=System.nanoTime()/1000;audioEncoder.offerAudioEncoder(this_buffer.clone(),presentationTimeStamp);//feedtoaudioencoder}这里也可以设置AudioRecord的回调(通过setRecordPositionUpdateListener())触发读取音频数据。offerAudioEncoder()主要是将Audio采样数据发送到AudioMediaCodec的InputBuffer进行编码:ByteBuffer[]inputBuffers=mAudioEncoder.getInputBuffers();inputBufferIndex=mAudioEncoder.dequeueInputBuffer(-1);if(inputBufferIndex>=0){ByteBufferinputinputBuffers[inputBufferIndex];inputBuffer.clear();inputBuffer.put(this_buffer);...mAudioEncoder.queueInputBuffer(inputBufferIndex,0,this_buffer.length,presentationTimeStamp,0);}下面,参考Grafika-SoftInputSurfaceActivity,添加音频处理。主循环大致分为四部分:try{//Part1prepareEncoder(outputFile);...//Part2for(inti=0;i
