[源码]用MediaExtractor从视频中提取音频
aide吧
全部回复
仅看楼主
level 10
7eu7d7 楼主
链接在2L
教程从楼下开始
2016年10月05日 10点10分 1
level 10
7eu7d7 楼主
2016年10月05日 10点10分 2
level 10
7eu7d7 楼主
界面比较简单,一个Textview和3个Button
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="wrap_content"
android:id="@+id/mainTextView1"/>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal">
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="本地视频"
android:onClick="on1"/>
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="网络视频"
android:onClick="on3"/>
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="开始转换"
android:onClick="on2"/>
</LinearLayout>
</LinearLayout>
2016年10月05日 10点10分 3
level 10
7eu7d7 楼主
之后定义全局变量和创建MediaExtractor与MediaMuxer对象,这2个类负责从视频里提取音频
int type=0;
String path="";//视频路径
MediaExtractor mediaExtractor;
MediaMuxer mediaMuxer;
final String SDCARD_PATH = Environment.getExternalStorageDirectory().getPath();//SD卡根目录
TextView tx;
2016年10月05日 10点10分 4
level 10
7eu7d7 楼主
最后就是代码的核心了
private void muxerAudio(String file_in,String file_out) {
if(type==2)handler.obtainMessage(2,"网络连接中").sendToTarget();
mediaExtractor = new MediaExtractor();
MediaPlayer md=new MediaPlayer();//创建一个MediaPlayer用来获取视频时长
try
{
md.setDataSource(file_in.toString());
md.prepare();
}
catch (SecurityException e){}
catch (IllegalArgumentException e){}
catch (IllegalStateException e){}
catch (IOException e){}
int audioIndex = -1;//音频通道
int count=0;//已转换的时长
int size=md.getDuration();//获取视频时长
try {
mediaExtractor.setDataSource(file_in.toString());//设置视频路径,可以是网络链接
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(file_out.toString(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
int writeAudioIndex = mediaMuxer.addTrack(trackFormat);
mediaMuxer.start();
ByteBuffer byteBuffer = ByteBuffer.allocate(trackFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE));
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();
mediaExtrac
2016年10月05日 10点10分 6
level 10
7eu7d7 楼主
代码的其他部分可以链接中的源码查看
2016年10月05日 10点10分 7
level 12
[惊讶]
2016年10月05日 11点10分 8
[乖]
2016年10月05日 11点10分
level 13
顶顶
2016年10月05日 13点10分 10
level 8
666
2016年10月06日 03点10分 11
[乖]
2016年10月06日 04点10分
level 11
没法用
2016年10月06日 04点10分 12
level 11
错误
2016年10月06日 04点10分 13
这个类要安卓4.3以上才能用
2016年10月06日 04点10分
@7eu7d7 我4.4.4
2016年10月06日 04点10分
@swiftlmm 那应该可以用
2016年10月06日 05点10分
@swiftlmm 你出的什么bug
2016年10月06日 05点10分
level 1
噫天呐噜学长看起来好炫酷的样子!
2016年10月07日 08点10分 14
[滑稽]
2016年10月07日 10点10分
回复 7eu7d7 :_(:_」∠)_
2016年10月12日 16点10分
level 1
大家谁知道用什么软件可以打开SLAK文件
2019年01月23日 11点01分 15
1