Android Audio Learning MediaExtractor, kumuha ng data ng track ng audio video
Android Audio Learning Mediaextractor
Ang isang audio at video file ay binubuo ng audio at video. Maaari naming makuha ang audio o video nang magkahiwalay sa pamamagitan ng MediaExtractor at MediaMuxer. Ang nakuhang audio at video ay maaaring i-play nang magkahiwalay.
Ang data ng audio at track ng video ay nakuha mula sa mp4 file upang makakuha ng data ng audio na aac at data ng video na .h264.
Sample ng code: para sa test code, ipakita lamang ang proseso ng paggamit, upang magamit ang pangangailangan na mag-optimize
/ / Why is the extracted file is aac later will explain private String pcmPath = Environment.getExternalStorageDirectory() .getPath() + '/demo/test.aac' //Why is it explained later in .h264? private String mp4Path = Environment.getExternalStorageDirectory() .getPath() + '/demo/test.h264' private String dirPath = Environment.getExternalStorageDirectory() .getPath() + '/demo' private MediaExtractor mediaExtractor private void initMediaDecode() { String srcPath = Environment.getExternalStorageDirectory() .getPath() + '/video/video.mp4' File file = new File(dirPath) if (!file.exists()){ file.mkdir() } File file1 = new File(pcmPath) File file2 = new File(mp4Path) 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() } try { mediaExtractor = new MediaExtractor()// such tracks and video tracks of detachable video files mediaExtractor.setDataSource(srcPath)/ / The location of the media file System.out.println('==========getTrackCount()===================' + mediaExtractor.getTrackCount()) for (int i = 0 i < mediaExtractor.getTrackCount() i++) {// traverse the media track. Here we are passing the audio file, so there is only one track. MediaFormat format = mediaExtractor.getTrackFormat(i) String mime = format.getString(MediaFormat.KEY_MIME) if (mime.startsWith('audio')) {/ / Get the audio track mediaExtractor.selectTrack(i)/ / Select this audio track System.out.println('====audio=====KEY_MIME========='+format.getString(MediaFormat.KEY_MIME)) System.out.println('====audio=====KEY_CHANNEL_COUNT======='+format.getInteger(MediaFormat.KEY_CHANNEL_COUNT)+'') System.out.println('====audio=====KEY_SAMPLE_RATE==========='+format.getInteger(MediaFormat.KEY_SAMPLE_RATE)+'') System.out.println('====audio=====KEY_DURATION==========='+format.getLong(MediaFormat.KEY_DURATION)+'') System.out.println('====audio=====getSampleFlags==========='+mediaExtractor.getSampleFlags()+'') System.out.println('====audio=====getSampleTime==========='+mediaExtractor.getSampleTime()+'') // System.out.println('====audio=====getSampleSize==========='+mediaExtractor.getSampleSize()+'')api28 System.out.println('====audio=====getSampleTrackIndex==========='+ mediaExtractor.getSampleTrackIndex()+'') try { ByteBuffer inputBuffer = ByteBuffer.allocate(100 * 1024) FileOutputStream fe=new FileOutputStream(file1,true) while ( true) { int readSampleCount = mediaExtractor.readSampleData(inputBuffer, 0) if (readSampleCount < 0) { break } byte[] buffer = new byte[readSampleCount] inputBuffer.get(buffer) fe.write(buffer) inputBuffer.clear() mediaExtractor.advance() } fe.flush() fe.close() } catch (IOException e) { e.printStackTrace() }finally { } } if (mime.startsWith('video')){ mediaExtractor.selectTrack(i)/ / Select this video track System.out.println('====video=====KEY_MIME==========='+format.getString(MediaFormat.KEY_MIME)) System.out.println('====video=====KEY_DURATION==========='+format.getLong(MediaFormat.KEY_DURATION)+'') System.out.println('====video=====KEY_WIDTH==========='+format.getInteger(MediaFormat.KEY_WIDTH)+'') System.out.println('====video=====KEY_HEIGHT==========='+format.getInteger(MediaFormat.KEY_HEIGHT)+'') System.out.println('====video=====getSampleFlags==========='+mediaExtractor.getSampleFlags()+'') System.out.println('====video=====getSampleTime==========='+mediaExtractor.getSampleTime()+'') // System.out.println('====video=====getSampleSize==========='+mediaExtractor.getSampleSize()+'')api28 System.out.println('====video=====getSampleTrackIndex==========='+ mediaExtractor.getSampleTrackIndex()+'') try { ByteBuffer inputBuffer = ByteBuffer.allocate(100 * 1024) FileOutputStream fe=new FileOutputStream(file2,true) while ( true) { int readSampleCount = mediaExtractor.readSampleData(inputBuffer, 0) if (readSampleCount < 0) { break } byte[] buffer = new byte[readSampleCount] inputBuffer.get(buffer) fe.write(buffer) inputBuffer.clear() mediaExtractor.advance() } fe.flush() fe.close() } catch (IOException e) { e.printStackTrace() }finally { } } } } catch (IOException e) { e.printStackTrace() }finally { mediaExtractor.release() mediaExtractor = null } }
resulta:
Nakuha ang impormasyon sa track ng video:
getTrackCount () = 2
video = KEY_MIME = video / avc
video = KEY_DURATION = 52208333
video = KEY_
video = KEY_
video = getSampleFlags = 1
video = getSampleTime = 83333
video = getSampleTrackIndex === 0
Nakuha ang impormasyon ng audio track:
audio = KEY_MIME = audio / mp4a-latm
audio = KEY_CHANNEL_COUNT = 2
audio = KEY_SAMPLE_RATE = 48000
audio = KEY_DURATION = 51946666
audio = getSampleFlags = 1
audio = getSampleTime = 0
audio = getSampleTrackIndex =________________ 1
Dahil ang nakuha na mime ng track ng video ay video / avc, alam na ang format ng pag-encode ng video ay .h264, ang nakuha na mime ng audio track ay audio / mp4a-latm, at ang kaukulang format ng pag-encode ng audio ay aac.
Kahit na nakakuha ako ng data ng video at audio, paano ko ito mai-encode at na-decode ito sa isang karaniwang format?
Ang video.mp4 file na ginamit sa code ay libre upang makita sa source code. https://pan.baidu.com/s/1ANs0DacuTMZgnTfjKoWjtg