精华内容
下载资源
问答
  • Android视频提取音频
  • Android开发中从视频提取音频主要有三种方式结合FFmpeg,MP4Parser,MediaExtractor。 多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等,FFmpeg支持的音视频...

    文章目录

    前言

    Android开发中从视频中提取音频主要有三种方式结合FFmpeg,MP4Parser,MediaExtractor。
    多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等,FFmpeg支持的音视频格式非常全面,github上也有很多不错相关开源框架。我在这里用的是RxFFmpeg

    使用方法

    1. 在根目录下的build.gradle里添加maven仓库
    allprojects {
    		repositories {
    			...
    			maven { url 'https://www.jitpack.io' }
    		}
    	}
    
    1. 添加依赖,最新版本
    dependencies {
        implementation 'com.github.microshow:RxFFmpeg:2.1.0'
    }
    
    1. 这里处理了截取视频中音频片段,有两个参数一个是startTime 截取的开始时间,另外一个是time 就是你要截取的总时长。这里还需一个要注意的地方就是给文件命名不可以出现重复,我就直接取当前时间戳了,再在后边拼接上你需要的音频格式(.wav/.mp3等)。
    override fun extractAudio(startTime: String, time: String, path: String,name:String,deType:String) {
    
            var type = SharedPreferencesUtils.getString(
                MyApplication.INSTANCE,
                Constants.AudioType.TYPE_KEY,
                Constants.AudioType.MP3
            )
            if(deType!="") type = deType
            audioName = name
            fileName = TimeUtil.getCurrentTimeStamp()+"audio"+type //当前时间戳加音频格式
            if (startTime == "") {
                commands = "ffmpeg -i ".plus(path).plus(" -vn ")
                    .plus(Constants.LOCAL_PATH)
                    .plus(fileName
                    )
            } else {
                commands =
                    "ffmpeg -i ".plus(path).plus(" -vn ").plus("-ss ").plus(startTime).plus(" -t ")
                        .plus(time + " ").plus(Constants.LOCAL_PATH).plus(fileName)
            }
    
            Logger.d(commands)
    
            var commandsArray = commands.split(" ")
            Logger.d(commandsArray)
    
            runFFmpegRxJava(commandsArray)
    
        }
        
    private fun runFFmpegRxJava(commandsArray: List<String>) {
    
            RxFFmpegInvoke.getInstance().runCommandRxJava(commandsArray.toTypedArray())
                .subscribe(object : RxFFmpegSubscriber() {
                    override fun onFinish() {
                        Logger.d("onFinish")
                        view?.extractSuc(fileName,audioName)
                    }
    
                    override fun onCancel() {
                        view?.extractFail("您已经取消转换!")
                        Logger.d("onCancel")
                    }
    
                    override fun onProgress(progress: Int, progressTime: Long) {
                        //Logger.d("onCancel")
                    }
    
                    override fun onError(message: String?) {
                        view?.extractFail(message.toString())
                        Logger.d("onError:" + message)
                    }
                })
        }
    
    展开全文
  • Android中从视频提取音频

    千次阅读 2016-03-13 18:24:35
    最近在做一款产品,需要从视频提取音频。查了查资料发现了有FFMPEG,MP4Parser,Android自带的解码器。首先FFMPEG比较复杂据说也慢(来源于互联网,我也不知道)然后就是Android自带的Media Extractor类,不过该类...

         最近在做一款产品,需要从视频中提取音频。查了查资料发现了有FFMPEG,MP4Parser,Android自带的解码器。首先FFMPEG比较复杂据说也慢(来源于互联网,我也不知道)然后就是Android自带的Media Extractor类,不过该类用于4.3以上,适配性不好。最后选择了MP4Parser类。

    首先去下载个MP4Parser的包导入到Android工程里面,接下来就可以写代码了。好了不多说了,上代码。

      try {
    
                Movie  movie = MovieCreator.build(fileName);
                for (Track t : movie.getTracks())
                {
                    if (t.getHandler().equals("soun"))
                    {
                        audioTracks.add(t);
                    }
    
                }
                Movie result = new Movie();
                if (audioTracks.size() > 0)
                {
                    result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
                }
                Container out = new DefaultMp4Builder().build(result);
    
                try
                {
                    FileChannel fc = new RandomAccessFile("/sdcard/output212.aac", "rw").getChannel();
                    out.writeContainer(fc);
                    fc.close();
                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


    展开全文
  • Android音频学习之MediaExtractor,提取音频视频轨道数据(从视频中分离音频视频数据)-附件资源
  • 1 MediaMuxer 说明 前面利用MediaExtractor提取的aac和.h264文件不经过处理没办法播放,这次利用MediaExtractor和MediaMuxer...MediaMuxer从api18开始提供,可以封装编码后的视频流和音频流到视频文件中。目前Media...

    1 MediaMuxer 说明

    前面利用MediaExtractor提取的aac和.h264文件不经过处理没办法播放,这次利用MediaExtractor和MediaMuxer配合提取合并生成可以播放的文件,ps:aac文件和.h264需要首先利用MediaMuxer生成MP4文件,才能进行合并。

    MediaMuxer从api18开始提供,可以封装编码后的视频流和音频流到视频文件中。目前MediaMuxer支持的文件输出格式包括MP4,webm和3gp.
    构造函数:
    MediaMuxer(String path, int format)
    MediaMuxer(FileDescriptor fd, int format)
    参数说明:
    两个构造函数都需要一个文件路径,和一个format。
    **path,fd:**用于存放合成的文件的路径,不能为null。
    **format:**输出的文件的格式,OutputFormat中的常量标识。
    输出格式:
    OutputFormat中包含四种:
    MUXER_OUTPUT_3GPP:对应3gp文件,
    MUXER_OUTPUT_HEIF:定影HEIF文件,
    MUXER_OUTPUT_MPEG_4:对应mp4文件,
    MUXER_OUTPUT_WEBM:对应webm文件。

    不同版本的api对文件格式的支持:
    在这里插入图片描述
    看上面的表的支持程度知道,一般为了支持更低的版本,合称单音频,单视频的mp4文件在api18时就支持。如果是多个音频和视频的track要怎么处理呢,只能先两个两个的合并,最后剩下两个再合并。

    主要函数说明:
    addTrack(MediaFormat format):利用MediaFormat添加音频或视频轨道。
    release():释放MediaMuxer的资源。
    setLocation(float latitude,float longitude):设置并存储地理位置信息到生成文件中。
    setOrientationHint(int degrees):设置输出视频回放的方向提示。
    start() :开始muxer,等待数据的输入。
    Stop():停止muxer,调用这个函数后将生成合成的文件。
    writeSampleData(int trackIndex, ByteBuffer byteBuf, MediaCodec.BufferInfo bufferInfo):
    往muxer中写入编码的数据。
    参数说明:
    trackIndex:sample(样本)的track index,可以利用MediaExtractor获取。
    byteBuf:写入的数据,不可为null;
    bufferInfo:当前sample(样本)相关的buffer的信息,不可为null。

    MediaCodec.BufferInfo:
    主要包括四个数据:
    flags:输入buffer相关的buffer flags。
    offset:buffer开始的偏移量,通常设为0。
    presentationTimeUs:buffer的时间戳。
    size:buffer的数据大小。

    2 MediaMuxer使用说明

    MediaMuxer的使用模板,来自Developer:

    MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4);
     // More often, the MediaFormat will be retrieved from MediaCodec.getOutputFormat()
     // or MediaExtractor.getTrackFormat().
     MediaFormat audioFormat = new MediaFormat(...);
     MediaFormat videoFormat = new MediaFormat(...);
     int audioTrackIndex = muxer.addTrack(audioFormat);
     int videoTrackIndex = muxer.addTrack(videoFormat);
     ByteBuffer inputBuffer = ByteBuffer.allocate(bufferSize);
     boolean finished = false;
     BufferInfo bufferInfo = new BufferInfo();
    
     muxer.start();
     while(!finished) {
       // getInputBuffer() will fill the inputBuffer with one frame of encoded
       // sample from either MediaCodec or MediaExtractor, set isAudioSample to
       // true when the sample is audio data, set up all the fields of bufferInfo,
       // and return true if there are no more samples.
       finished = getInputBuffer(inputBuffer, isAudioSample, bufferInfo);
       if (!finished) {
         int currentTrackIndex = isAudioSample ? audioTrackIndex : videoTrackIndex;
         muxer.writeSampleData(currentTrackIndex, inputBuffer, bufferInfo);
       }
     };
     muxer.stop();
     muxer.release();
    

    使用过程介绍:

    • (1)生成MediaMuxer对象
      通过new MediaMuxer(String path, int format)指定视频文件输出路径和文件格式:
      MediaMuxer mMediaMuxer = new MediaMuxer(mOutputVideoPath,
      MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

    • (2)addTrack
      addTrack(MediaFormat format),添加媒体通道,传入MediaFormat对象,通常从MediaExtractor或者MediaCodec中获取,也可以自己创建,后面会有文章说明。
      addTrack会返回trackindex,这个index后面会用到。

    • (3) 调用start函数
      MediaMuxer.start();

    • (4) 写入数据
      调用MediaMuxer.writeSampleData()向mp4文件中写入数据了。每次只能添加一帧视频数据或者单个Sample的音频数据,需要BufferInfo对象作为参数。
      BufferInfo info = new BufferInfo();
      info.offset = 0;
      info.size = sampleSize;
      info.flags = MediaCodec.BUFFER_FLAG_SYNC_FRAME;
      info.presentationTimeUs = mVideoExtractor.getSampleTime();
      mMediaMuxer.writeSampleData(videoTrackIndex, buffer, info);
      info.size 必须填入数据的大小
      info.flags 需要给出是否为同步帧/关键帧
      info.presentationTimeUs 必须给出正确的时间戳,注意单位是 us,第二次getSampleTime()和首次getSampleTime()的时间差。

    • (5)释放关闭资源
      结束写入后关闭以及释放资源:
      MediaMuxer.stop();
      MediaMuxer.release();

    3 利用MediaMuxer生成文件

    3.1从MP4文件中提取视频和音频文件,提取之后的视频可以播放但是没有声音,提取之后的声音可以播放但是没有视频画面。

    private void muxerdata() {
        String srcPath = Environment.getExternalStorageDirectory()
                .getPath() + "/video/video.mp4";
    
        String dirP = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2";
        String fPath1 = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2/demo1.mp4";
        String fPath2 = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2/demo2.mp4";
        File file = new File(dirP);
        if (!file.exists()){
            file.mkdir();
        }
    
        File file1 = new File(fPath1);
        File file2 = new File(fPath2);
        try {
            if (file1.exists()){
                file1.delete();
    
            }
            file1.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        try {
            if (file2.exists()){
                file2.delete();
            }
            file2.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        MediaMuxer mMediaMuxer;
        int mVideoTrackIndex = 0;
        int mAudioTrackIndex = 0;
        long frameRate;
    
        try {
            mediaExtractor = new MediaExtractor();//此类可分离视频文件的音轨和视频轨道
            mediaExtractor.setDataSource(srcPath);//媒体文件的位置
            System.out.println("==========getTrackCount()===================" + mediaExtractor.getTrackCount());
            for (int i = 0; i < mediaExtractor.getTrackCount(); i++) {
                MediaFormat format = mediaExtractor.getTrackFormat(i);
                String mime = format.getString(MediaFormat.KEY_MIME);
                if (mime.startsWith("audio")) {//获取音频轨道
                    ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);
                    {   mediaExtractor.selectTrack(i);//选择此音频轨道
                    mediaExtractor.readSampleData(buffer, 0);
                    long first_sampletime = mediaExtractor.getSampleTime();
                    mediaExtractor.advance();
                    long second_sampletime = mediaExtractor.getSampleTime();
                    frameRate = Math.abs(second_sampletime - first_sampletime);//时间戳
                    mediaExtractor.unselectTrack(i);
                   }
                    mediaExtractor.selectTrack(i);
                    System.out.println("==============frameRate111=============="+frameRate+"");
                    mMediaMuxer = new MediaMuxer(fPath2, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
                    mAudioTrackIndex = mMediaMuxer.addTrack(format);
                    mMediaMuxer.start();
    
                    MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
                    info.presentationTimeUs = 0;
    
                    int sampleSize = 0;
                    while ((sampleSize = mediaExtractor.readSampleData(buffer, 0)) > 0) {
                        info.offset = 0;
                        info.size = sampleSize;
                        info.flags = mediaExtractor.getSampleFlags();
                        info.presentationTimeUs += frameRate;
                        mMediaMuxer.writeSampleData(mAudioTrackIndex, buffer, info);
                        mediaExtractor.advance();
                    }
    
                    mMediaMuxer.stop();
                    mMediaMuxer.release();
    
                }
    
                if (mime.startsWith("video")){
                    mediaExtractor.selectTrack(i);//选择此视频轨道
                    frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE);
                    System.out.println("==============frameRate222=============="+ 1000 * 1000 / frameRate+"");
                    mMediaMuxer = new MediaMuxer(fPath1, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
                    mVideoTrackIndex = mMediaMuxer.addTrack(format);
                    mMediaMuxer.start();
    
                    MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
                    info.presentationTimeUs = 0;
                    ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);
                    int sampleSize = 0;
                    while ((sampleSize = mediaExtractor.readSampleData(buffer, 0)) > 0) {
                        info.offset = 0;
                        info.size = sampleSize;
                        info.flags = mediaExtractor.getSampleFlags();
                        info.presentationTimeUs += 1000 * 1000 / frameRate;
                        mMediaMuxer.writeSampleData(mVideoTrackIndex, buffer, info);
                        mediaExtractor.advance();
                    }
    
                    mMediaMuxer.stop();
                    mMediaMuxer.release();
    
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            mediaExtractor.release();
            mediaExtractor = null;
        }
    
    }
    

    用到的MP4文件和提取后生成的mp4文件:
    https://pan.baidu.com/s/1xyeJEpC_Zff6hgIoZBKt-w

    3.2把提取出来的视频和音频合并:

    private void muxermergedata() {
        String desPath = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2/video.mp4";
    
        String dirP = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2";
        String fPath1 = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2/demo1.mp4";
        String fPath2 = Environment.getExternalStorageDirectory()
                .getPath() + "/demo2/demo2.mp4";
        File file = new File(dirP);
        if (!file.exists()){
            file.mkdir();
        }
    
        File file1 = new File(fPath1);
        File file2 = new File(fPath2);
        File filedes = new File(desPath);
    
        try {
            if (filedes.exists()){
                filedes.delete();
            }
            filedes.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        MediaMuxer mMediaMuxer = null;
    
        try {
            mMediaMuxer = new  MediaMuxer(desPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
        } catch (IOException e) {
            e.printStackTrace();
        }
        int mVideoTrackIndex = 0;
        int mAudioTrackIndex = 0;
        long frameRate1 = 0;
        long frameRate2 = 0;
    
        MediaFormat format1;
        MediaFormat format2;
        try {
            mediaExtractor = new MediaExtractor();//此类可分离视频文件的音轨和视频轨道
            mediaExtractor.setDataSource(fPath1);//媒体文件的位置
            System.out.println("==========getTrackCount()===================" + mediaExtractor.getTrackCount());
            for (int i = 0; i < mediaExtractor.getTrackCount(); i++) {
                format1 = mediaExtractor.getTrackFormat(i);
                String mime = format1.getString(MediaFormat.KEY_MIME);
    
                if (mime.startsWith("video")){
                    mediaExtractor.selectTrack(i);//选择此视频轨道
                    frameRate1 = format1.getInteger(MediaFormat.KEY_FRAME_RATE);
                    System.out.println("==============frameRate222=============="+ 1000 * 1000 / frameRate1+"");
                    mVideoTrackIndex = mMediaMuxer.addTrack(format1);
    
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        try {
            mediaExtractor2 = new MediaExtractor();//此类可分离视频文件的音轨和视频轨道
            mediaExtractor2.setDataSource(fPath2);//媒体文件的位置
            System.out.println("==========getTrackCount()===================" + mediaExtractor2.getTrackCount());
            for (int i = 0; i < mediaExtractor2.getTrackCount(); i++) {
                format2 = mediaExtractor2.getTrackFormat(i);
                String mime = format2.getString(MediaFormat.KEY_MIME);
                if (mime.startsWith("audio")) {//获取音频轨道
                    ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);
                    {
                        mediaExtractor2.selectTrack(i);//选择此音频轨道
                        mediaExtractor2.readSampleData(buffer, 0);
                        long first_sampletime = mediaExtractor2.getSampleTime();
                        mediaExtractor2.advance();
                        long second_sampletime = mediaExtractor2.getSampleTime();
                        frameRate2 = Math.abs(second_sampletime - first_sampletime);//时间戳
                        mediaExtractor2.unselectTrack(i);
                    }
                    mediaExtractor2.selectTrack(i);
                    System.out.println("==============frameRate111==============" + frameRate2 + "");
                    mAudioTrackIndex = mMediaMuxer.addTrack(format2);
    
                }
    
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    
        mMediaMuxer.start();
        MediaCodec.BufferInfo info1 = new MediaCodec.BufferInfo();
        info1.presentationTimeUs = 0;
        ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);
        int sampleSize1 = 0;
        while ((sampleSize1 = mediaExtractor.readSampleData(buffer, 0)) > 0) {
            info1.offset = 0;
            info1.size = sampleSize1;
            info1.flags = mediaExtractor.getSampleFlags();
            info1.presentationTimeUs += 1000 * 1000 / frameRate1;
            mMediaMuxer.writeSampleData(mVideoTrackIndex, buffer, info1);
            mediaExtractor.advance();
        }
    
    
        MediaCodec.BufferInfo info2 = new MediaCodec.BufferInfo();
        info2.presentationTimeUs = 0;
    
        int sampleSize2 = 0;
        while ((sampleSize2 = mediaExtractor2.readSampleData(buffer, 0)) > 0) {
            info2.offset = 0;
            info2.size = sampleSize2;
            info2.flags = mediaExtractor2.getSampleFlags();
            info2.presentationTimeUs += frameRate2;
            mMediaMuxer.writeSampleData(mAudioTrackIndex, buffer, info2);
            mediaExtractor2.advance();
        }
    
        try {
            mediaExtractor.release();
            mediaExtractor = null;
            mediaExtractor2.release();
            mediaExtractor2 = null;
            mMediaMuxer.stop();
            mMediaMuxer.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    
    

    如何利用MediaCodec对视频原始数据进行编解码,敬请期待后面的文章。

    展开全文
  • 1.前段时间想开发一个app,用来提取mp4中的音频然后进行裁剪 MediaExtractor extractor = new MediaExtractor();//新建提取器 extractor.setDataSource(…); int numTracks = extractor.getTrackCount(); for (int i...

    1.前段时间想开发一个app,用来提取mp4中的音频然后进行裁剪

    • MediaExtractor extractor = new MediaExtractor();//新建提取器
    • extractor.setDataSource(…);
    • int numTracks = extractor.getTrackCount();
    • for (int i = 0; i < numTracks; ++i) {
    • MediaFormat format = extractor.getTrackFormat(i);
    • String mime = format.getString(MediaFormat.KEY_MIME);
    • if (weAreInterestedInThisTrack) {
    • extractor.selectTrack(i);
      
    • }
    • }
    • ByteBuffer inputBuffer = ByteBuffer.allocate(…)
    • while (extractor.readSampleData(inputBuffer, …) >= 0) {
    • int trackIndex = extractor.getSampleTrackIndex();
    • long presentationTimeUs = extractor.getSampleTime();
    • extractor.advance();
    • }
    • extractor.release();
    • extractor = null;
      以上为官方提供的代码,可以达到提取音频的效果,不过需要自己添加音频头部,不然不能播放

    2,合成视频
    MediaMuxer muxer = new MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
    通过MedaiMuxer 合并音频和视频

    sendHandleMessage(0,SHOW_PROGRCESS);
    videoExtractor.selectTrack(videoExtractorIndex);
    MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo();
    ByteBuffer videoByteBuffer = ByteBuffer.allocate(frameMaxInputSize);
    while (true) {
    int readSampleSize = videoExtractor.readSampleData(videoByteBuffer, 0);
    if (readSampleSize < 0) {
    videoExtractor.unselectTrack(videoExtractorIndex);
    sendHandleMessage(videoExtractor.getSampleTime()/1000,CLOSE_PROGRCESS);
    break;
    }
    sendHandleMessage(videoExtractor.getSampleTime()/1000,UPDATE_PROGRCESS);
    //设置样本编码信息
    videoInfo.size = readSampleSize;
    videoInfo.offset = 0;
    videoInfo.flags = videoExtractor.getSampleFlags();
    videoInfo.presentationTimeUs += 1000 * 1000 / frameRate;

                muxer.writeSampleData(videoIndex, videoByteBuffer, videoInfo); //将样本写入
                videoExtractor.advance(); //推进到下一个样本,类似快进
            }
    

    本次开发APP下载地址:
    https://pan.baidu.com/s/1UtrGzpTni0i-E66-vDtcgw xf1a

    展开全文
  • 一个音视频文件是由音频视频组成的,我们可以通过MediaExtractor、MediaMuxer把音频视频给单独抽取出来,抽取出来的音频视频能单独播放; 1 MediaExtractor 说明 MediaExtractor从api16开始添加,可用于...
  • Android开发 多媒体提取器MediaExtractor详解_将一个视频文件分离视频音频 前言  此篇博客讲解MediaExtractor将一个视频文件分离视频音频,如果你对MediaExtractor还没有一个笼统的概念建议先了解我...
  • FFmpeg命令(二)、 从视频提取音频

    千次阅读 2019-04-09 16:07:53
    ffmpeg命令 从视频提取音频提取为mp3提取为wav 提取为mp3 ffmpeg -i huoying.mp4 -f mp3 -ar 16000 huoying.mp3 //huoying.mp4 视频文件 //-f mp3 mp3编码 //-ar 16000 音频采样率 //huoying.mp3输出的音频文件 ...
  • Android 图片视频音频数据库模式

    千次阅读 2015-04-14 13:49:31
    摘要: Android MediaProvider 使用 SQLite 数据库存储图片、视频音频等多媒体文件的信息,供视频播放器、音乐播放器、图库使用。本文详细分析了 Android MediaProvider 多媒体数据库(以 SDK 2.3.3 为例)的模式...
  • 1.该文章系列是视频配音,涉及到把背景音频视频提取出来、背景音频根据台词时间戳进行截断、截断的背景和录音混合、混合音频进行拼接合并、合并后的音频转码为m4a格式、将m4a格式音频视频合并生成mp4视频文件 ...
  • Android中播放音频视频

    千次阅读 2012-07-11 21:14:46
    这些类可提供用于执行音频视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频视频操作。 本文简介 媒体包提供了可管理各种媒体类型的类。这些类可提供...
  • Android 音频FFT提取分析

    万次阅读 2017-05-02 15:16:02
    通过Record_Audio获取MediaPlayer播放器的声音,利用自带的FFT功能进行音频分析
  • 此解决方法允许您从网络播放M4A文件(以及其他容器(如MP4和3GP)中的AAC文件)。它只需从缓存下载文件并播放。private File mediaFile;private void playAudio(String mediaUrl) {try {URLConnection cn = new URL...
  • 这些类可提供用于执行音频视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频视频操作。 本文简介 媒体包提供了可管理各种媒体类型的类。这些类可提供...
  • Android关于本地多媒体(图片、视频音频)Media的选择总结
  • 音频提取格式转换app是一款专业优质的音频剪辑软件,而且音频提取格式转换app可以轻松简单的帮助您进行...快速从视频提取音频保存为MP3等格式,专业便捷的音频提取转换器,批量转换视频和音频。音频提取格式转换a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,499
精华内容 2,999
关键字:

android视频提取音频