序文
ほぼ2ヶ月がブログを書いていない、最近変更されたジョブは、常に調査研究のオーディオとビデオの側面の前に何かをしたかった、最終的にはそう最近、このシリーズを書いただろう、達成するための機会を持っています。私はちょうど私たちが一緒に補正を議論する問題が何であるか、いくつかの時間のために模索します。
あなたが困難なスタートの後は避けられないいくつかの共通のAPIを知っていない場合は、最初の章では、識字記事の概念です。
テキスト
特別なFFmpegの火災のために、私はいつも少しオーディオ・ビデオやネイティブAndroidのAPIの関係は、実際には、このような理解が間違っている、FFmpegの利点は、Android APIのパフォーマンスギャップと問題の異なるバージョンを解決することで、異なるモデルにしようとしていると考えシステムのバージョンアップデートより便利を更新するために、サードパーティのライブラリよりも確かに優れたパフォーマンスにも同様の効果を達成。
ネイティブのAPIは、熟練したマスターを持っているのであれば、その後のFFmpegの上の小さな問題があります。今日はいくつかの共通APIの概念を理解しています。
MediaPlayerの
トップオーディオおよびビデオ再生APIは、オーディオおよびビデオファイル、特に共通APIを再生するために使用することができます。
// 创建MediaPlayer
val mediaPlayer = MediaPlayer()
// 设置要播放的文件路径
mediaPlayer.setDataSource(path)
// 准备
mediaPlayer.prepare()
// 播放
mediaPlayer.start()
いくつかの一時停止、停止のアプローチではなく、ここで紹介するがありますが、私たちが使用していると信じています。
MediaRecoder
オーディオと上層のAPIのビデオ録画、いくつかの簡単な構成によって、あなたはオーディオを録音することができますし、ビデオを直接指定したファイルパスに保存されました。
// 创建MediaRecorder
val mediaRecorder = MediaRecorder()
// 录制声音的来源,具体参考AudioSource
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 录制视频的来源
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE)
// 输出的文件编码格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
// 保存的文件路径
mediaRecorder.setOutputFile(videoRecorderFile)
// 设置录音编码器
// 注意设置的录制音频编码格式与视频的编码格式是否匹配
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
// 音频录制的其他设置
mediaRecorder.setAudioEncodingBitRate(60)
mediaRecorder.setAudioSamplingRate(14400)
// 视频录制的其他设置
mediaRecorder.setVideoSize(getScreenWidth(), getScreenHeight())
mediaRecorder.setVideoEncodingBitRate(2 * getScreenWidth().times(getScreenHeight()))
mediaRecorder.setVideoFrameRate(60)
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264)
mediaRecorder.prepare()
mediaRecorder.start()
// 停止录制
mediaRecorder!!.stop()
mediaRecorder!!.release()
これらは、基本的な構成であるが、それは一般的に、カメラから得られた記録されたコンテンツと一緒に使用される映像記録面がある場合、また、対応する方法のMediaRecorderの設定があります。
// 设置摄像头
mediaRecorder.setCamera(camera!!)
// 设置录制的角度,如果与摄像头不符,会出现视频角度不对的问题
mediaRecorder.setOrientationHint(90);
// 设置录音和录制视频的来源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA)
// 设置录制的质量
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))
....
多くのオンラインデモがありますが、あなたはその後、私たちは自分自身に書き込みデモを書きます、検索するために行くことができます。
audiorecordの
録音した音声API、出力形式のオーディオデータストリームがエンコードされていない、それは、元のPCMデータであり、直接記録を保存再生用のプレーヤーから直接使用することはできません。
// 创建AudioRecord
AudioRecord(
// 录制音频的来源,参数与MediaRecoder相同
AudioSource,
// 采样率,
sampleRateInH,
// 声音的频道
CHANNEL,
// 编码位数
ENCODING,
// 录制一帧的最小Buffer大小
AudioRecord.getMinBufferSize(
sampleRateInH,
CHANNEL,
ENCODING
)
)
図から分かるように、AudioRecorderはあなたには、いくつかの特別なオーディオ処理を持っている必要があれば、より慎重になるMediaRecoderを比較して、声が変わるような、独自のコーディングを保存し、AudioRecorderに使用する必要があります。
その後、我々は引数のコンストラクタメソッドを見てみましょう。
AudioSource:録音音源、MediaRecoderとは同じです。
・
SampleRateInH:サンプリングレート、人気トークサンプリング周波数は、単位はヘルツ秒コレクションごとにコンピュータ信号サンプルの数です。高い音は間違いなく、より明確で、一般的に使用されるサイズがあります:
十分に話す人のための電話で使用される8000Hzのサンプリングレート、
11025Hzが電話品質と呼ばれて得るために音を、基本的には、発信者の声を区別することを可能にする
22050Hzのサンプリングラジオ放送は、レートは、放送品質
32000HzミニDVデジタルビデオカメラ、DAT(LPmode)のサンプリング・レートを使用
また、一般的にオーディオMPEG-1(VCD、SVCD、に使用される44100Hz、オーディオCD、 MP3) に使用されるサンプリングレート
47250Hz NipponColumbia(デノン)の開発世界初ですサンプリングレート使用される市販のPCMレコーダー
デジタルオーディオ48000HzミニDV、デジタルテレビ、DVD、DAT、映画やサンプリングレートで使用されるプロオーディオを
。
チャンネル:ステレオビデオ、左チャンネル、右チャンネルです
。
エンコーディング:このコードが参照します数字を保存し、一般的に16ビットを使用します。
。
AudioRecord.getMinBufferSize:それは、読み出し操作である場合は、各フレームの最小サイズは、使用する必要があります。
MediaCodec
オーディオとビデオエンコーダおよびデコーダが、これは彼の使用を一致させるために、その上の他のAPI MediaFormatを使用している、APIの最も重要なシリーズである必要があります。
// 这里仅仅是一个简单的例子,MediaCodec的使用要更复杂一些
// 创建一个avc格式的视频编码器
mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC)
// 详细配置MediaFormat
val mediaFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height)
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000)
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15)
mediaFormat.setInteger(
MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface
)
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5)
// 使用配置好的MediaFormat
mediaCodec!!.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
// 开始编码
mediaCodec!!.start()
実用的なアプリケーションでは、MediaCodecより複雑なゆっくりと分析した後、私たちの場合には、ここで理解することは、簡単な使用しています。
MediaExtractor
オーディオとビデオの抽出のためのそのようなオーディオファイルとして保存されたオーディオを抽出する動画ファイルとして。
// 创建一个分离器,还没有指定要分离的部分
val mediaExtractor = MediaExtractor()
// 文件路径
mediaExtractor.setDataSource(file.absolutePath)
// trackCount表示有多少可以分离的轨道,常用的音轨和视轨
val trackNum = mediaExtractor.trackCount
for (i in 0 until trackNum) {
// 对应轨道的格式
val mediaFormat = mediaExtractor.getTrackFormat(i)
// 音频:“audio/”,视频:“video/”
val format = mediaFormat.getString("mime")
if (format.startsWith(prefix)) {
// 选择需要的轨道,接下来就可以提取这个轨道的内容了
videoMediaExtractor.selectTrack(videoIndex)
}
}
// 读取内容
val frameSize = mediaExtractor.readSampleData(mReadBuffer, 0)
...
// 释放资源
mediaExtractor.release()
MediaMuxer
一般的にちょうどMediaExtractorと組み合わせて使用するなど、オーディオとビデオのコンバイナ、映像と音声合成、合成映像、
mediaMuxer = MediaMuxer(outPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
val mReadBuffer = ByteBuffer.allocate(MAX_BUFF_SIZE)
// 选择音轨
val audioMediaExtractor = MediaExtractor()
audioMediaExtractor.setDataSource(path)
val audioIndex = findTrackIndex(audioMediaExtractor, "audio/")
audioMediaExtractor.selectTrack(audioIndex)
// 读取帧数据
val frameSize = mediaExtractor.readSampleData(mReadBuffer, 0)
mReadBuffer.rewind()
// 将数据写入到合成文件中
mediaMuxer!!.writeSampleData(outTrackIndex, mReadBuffer, bufferInfo)
// 释放
mediaMuxer!!.release()
概要
今日は、共通APIのAndroidのネイティブを理解し、APIは、私たちの開発のニーズを満たすのに十分である、そして我々は、次のタスクを完了する必要があります。
- MediaRecoderレコードオーディオとビデオ
- オーディオとビデオを再生するにはMediaPlayerの
- オーディオとビデオを再生MediaCodec
- AudioRecoder PCMオーディオの録音と再生
- MediaCodec記録ビデオ
- 抽出映像と音声合成
- ブレークポイントの記録と映像合成
(順不同上記のタスク、になるかもしれ順)