美文网首页
调用讯飞音频文件识别api踩得坑

调用讯飞音频文件识别api踩得坑

作者: 名字_都被占了 | 来源:发表于2019-01-29 20:40 被阅读0次

1:讯飞支持的音频文件格式只有pcm和wav(这种格式直接忽略,用ffmpeg库转换其他音频格式成wav格式之后,全部都是噪音),并且音频文件的参数也有要求:采样率为8khz或16khz,采样精度为16bits,声道为单声道

2:先将MP4中的音频用原生的MediaExtractor和MediaMuxer提取出来,代码如下:

    private void muxerAudio() {
        mediaExtractor = new MediaExtractor();
        int audioIndex = -1;
        try {
            mediaExtractor.setDataSource("/storage/emulated/0/1.mp4");
            int trackCount = mediaExtractor.getTrackCount();
            for (int i = 0; i < trackCount; i++) {
                MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);
                if (trackFormat.getString(MediaFormat.KEY_MIME).startsWith("audio/")) {
                    audioIndex = i;
                }
            }
            mediaExtractor.selectTrack(audioIndex);
            MediaFormat trackFormat = mediaExtractor.getTrackFormat(audioIndex);
            mediaMuxer = new MediaMuxer("/storage/emulated/0/output_audio.wav", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
            int writeAudioIndex = mediaMuxer.addTrack(trackFormat);
            mediaMuxer.start();
            ByteBuffer byteBuffer = ByteBuffer.allocate(500 * 1024);
            MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
            long stampTime = 0;
            //获取帧之间的间隔时间
            {
                mediaExtractor.readSampleData(byteBuffer, 0);
                if (mediaExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {
                    mediaExtractor.advance();
                }
                mediaExtractor.readSampleData(byteBuffer, 0);
                long secondTime = mediaExtractor.getSampleTime();
                mediaExtractor.advance();
                mediaExtractor.readSampleData(byteBuffer, 0);
                long thirdTime = mediaExtractor.getSampleTime();
                stampTime = Math.abs(thirdTime - secondTime);
            }
            mediaExtractor.unselectTrack(audioIndex);
            mediaExtractor.selectTrack(audioIndex);
            while (true) {
                int readSampleSize = mediaExtractor.readSampleData(byteBuffer, 0);
                if (readSampleSize < 0) {
                    break;
                }
                mediaExtractor.advance();
                bufferInfo.size = readSampleSize;
                //bufferInfo.flags = mediaExtractor.getSampleFlags();
                bufferInfo.flags = MediaCodec.BUFFER_FLAG_END_OF_STREAM;
                bufferInfo.offset = 0;
                bufferInfo.presentationTimeUs += stampTime;
                mediaMuxer.writeSampleData(writeAudioIndex, byteBuffer, bufferInfo);
            }
            mediaMuxer.stop();
            mediaMuxer.release();
            mediaExtractor.release();
            Log.e("fuck", "finish");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

然后用AndroidAudioConverter将MP3转换为wav格式的音频,然后用RxFFmpeg将wav转为pcm格式,然后就可以用讯飞识别了。

相关文章

网友评论

      本文标题:调用讯飞音频文件识别api踩得坑

      本文链接:https://www.haomeiwen.com/subject/mikfsqtx.html