2 xushuaic xushuaic 于 2013.01.28 19:24 提问

电话录音导出的文件为什么不能播放?

写了一个电话录音的程序,但是在向SD卡中刻录声音的时候,并不是期望的3gp格式,无法进行播放,不知道是什么原因?

代码如下

配置文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.xushuai.phonelistener"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />

    <application android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        <service android:name=".PhoneService"></service>

        <receiver android:name=".BootBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- 电话状态监听权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--向SD卡写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!-- 刻录权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>

刻录的业务类:

import java.io.File;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    //在创建服务时,进行一些初始化
    @Override
    public void onCreate() {
        super.onCreate();
        //获取电话管理服务
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);//通过监听对象对呼叫状态进行监听

    }
    private final class PhoneListener extends PhoneStateListener{

        private String incomingNumber;
        private File file;
        private MediaRecorder mediaRecorder;

        //当呼叫状态改变时,调用该方法
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            try {
                switch (state) {
            case TelephonyManager.CALL_STATE_RINGING://来电
                this.incomingNumber = incomingNumber; 
                break;

            case TelephonyManager.CALL_STATE_OFFHOOK://接通电话
                file = new File(Environment.getExternalStorageDirectory(),incomingNumber+System.currentTimeMillis());
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//指定声音来源:话筒,这里只能录打电话的声音,而不能录入传入的声音
                //mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频输出格式
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//THREE_GPP);//设置音频输出格式
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码格式
                mediaRecorder.setOutputFile(file.getAbsolutePath());
                mediaRecorder.prepare();
                mediaRecorder.start();//开始录音

            case TelephonyManager.CALL_STATE_IDLE://挂断电话后回归到空闲状态
                if(mediaRecorder!=null)
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;
                break;
            }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

通过广播接收者进行应用的注册,这里的广播接收者监听的是手机启动的广播

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent service = new Intent(context,PhoneService.class);
        context.startService(service);//Intent激活组件(Service)
    }

}

2个回答

baimy1985
baimy1985   2013.01.29 10:00
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

你这里设置的录音格式是 amr啊,录出来的当然不是3gpp格式的了,改成 3gpp就好了

xushuaic
xushuaic 这个问题我也注意到了,在文件名后面加上了“3gp”格式,输出的文件是3gp格式没错,但是用迅雷看看,百度影音,搜狐都播放不了,郁闷啊,不过还是谢谢你的解答
4 年多之前 回复
baimy1985
baimy1985 之前我的回答太草率了,对不起呀。看了一下源码在AudioEncoder里的确没有3gp,只在OutputFormat里有THREE_3GP,如果在写文件的时候把后缀名写3gpp可不可以呢,毕竟3gpp只是一个容器类型,amr才是真正的编码方式,
4 年多之前 回复
xushuaic
xushuaic amr是音频编码格式,也就是你说的录音格式,在录音格式里也没有3gp这个格式啊,只有在输出格式里有3gp,MP4等格式
4 年多之前 回复
liu198661
liu198661   2014.01.15 16:54

答案就是还没录完你就开始导出。

Csdn user default icon
上传中...
上传图片
插入图片