【问题标题】:how to convert byte[] into .mp4 audio file in servlet(webservice)如何在 servlet(webservice)中将 byte[] 转换为 .mp4 音频文件
【发布时间】:2012-01-25 20:46:38
【问题描述】:

我已经录制了语音并在 android 中格式化为 .mp3 音频文件,并通过使用 base 64 编码将其作为名称值对发送。现在在我的服务器端,即在我的 servlet 中,我正在获取值并将其解码为字节 [ ] 使用基数 64

我的客户端代码(安卓):

package com.android.audio;

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Base64;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.commons.io.FileUtils;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;



public class AudioRecordActivity extends Activity
{
    private static final String LOG_TAG = "AudioRecordTest";
    private static String mFileName = null;
    private String url = "QRFileSaveServlet";
    String result;
    byte[] value;
    String s;
    byte[] filebyte;;
     String readString;
    private RecordButton mRecordButton = null;
    private MediaRecorder mRecorder = null;
   private SubmitButton mSubmitButton = null;
    private PlayButton   mPlayButton = null;
    private MediaPlayer   mPlayer = null;
    String fileresult = "";;
    private void onRecord(boolean start) {
        if (start) {
            startRecording();
        } else {
            stopRecording();
        }
    }

    private void onPlay(boolean start) {
        if (start) {
            startPlaying();
        } else {
            stopPlaying();
        }
    }

    private void startPlaying() {
        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }

    private void stopPlaying() {
        mPlayer.release();
        mPlayer = null;
    }

    private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }
    /* public boolean saveas(int ressound){  
             byte[] buffer=null;  
             InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
             int size=0;  

             try {  
              size = fIn.available();  
              buffer = new byte[size];  
              fIn.read(buffer);  
             fIn.close();  
            } catch (IOException e) {  
             // TODO Auto-generated catch block  
            return false;  
            }  

            String path="/sdcard/media/audio/ringtones/";  
            String filename="examplefile"+".ogg";  

            boolean exists = (new File(path)).exists();  
            if (!exists){new File(path).mkdirs();}  

            FileOutputStream save;  
            try {  
             save = new FileOutputStream(path+filename);  
             save.write(buffer);  
             save.flush();  
             save.close();  
            } catch (FileNotFoundException e) {  
             // TODO Auto-generated catch block  
             return false;  
            } catch (IOException e) {  
             // TODO Auto-generated catch block  
             return false;  
            }      

            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename)));  

            File k = new File(path, filename);  

            ContentValues values = new ContentValues();  
            values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());  
            values.put(MediaStore.MediaColumns.TITLE, "exampletitle");  
            values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
            values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");  
            values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
            values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);  
            values.put(MediaStore.Audio.Media.IS_ALARM, true);  
            values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

            //Insert it into the database  
            this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);  


            return true;  
           }  */
    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
      //  mRecorder.reset();
        mRecorder = null;
    }

    class RecordButton extends Button {
        boolean mStartRecording = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onRecord(mStartRecording);
                if (mStartRecording) {
                    setText("Stop recording");
                } else {
                    setText("Start recording");
                }
                mStartRecording = !mStartRecording;
            }
        };

        public RecordButton(Context ctx) {
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        }
    }

    class PlayButton extends Button {
        boolean mStartPlaying = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onPlay(mStartPlaying);
                if (mStartPlaying) {
                    setText("Stop playing");
                } else {
                    setText("Start playing");
                }
                mStartPlaying = !mStartPlaying;
            }
        };

        public PlayButton(Context ctx) {
            super(ctx);
            setText("Start playing");
            setOnClickListener(clicker);
        }

    }
   class SubmitButton extends Button {

        OnClickListener clicker = new OnClickListener() {

            public void onClick(View v) {



                       File f = new File(Environment.getExternalStorageDirectory()+"/audiorecordtest.mp3");
//                     
                //byte[] file = fileresult.getBytes();

                try {
                    filebyte = FileUtils.readFileToByteArray(f);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                System.out.println("$$$$$$$$$$$" + filebyte);
                s = Base64.encodeToString(filebyte, MODE_APPEND);
                System.out.println("**************" + s);

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("Audiofile", s));
                result = AudioServer.executePost(url, nameValuePairs);

            }

        };
        public SubmitButton(Context ctx) {
            super(ctx);
            setText("Save");
            setOnClickListener(clicker);
        }
            }

    public AudioRecordActivity() {
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.mp3";
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        LinearLayout ll = new LinearLayout(this);
        mRecordButton = new RecordButton(this);
        ll.addView(mRecordButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        mPlayButton = new PlayButton(this);
        ll.addView(mPlayButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
    mSubmitButton = new SubmitButton(this);
        ll.addView(mSubmitButton, new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, 0));

        setContentView(ll);
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mRecorder != null) {
            mRecorder.release();
            mRecorder = null;
        }

        if (mPlayer != null) {
            mPlayer.release();
            mPlayer = null;
        }
    }
}

我的服务器端代码(在 servlet 中):

package com.gsr.qrbarcode;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import com.android.gsr.utils.AudioSampleReader;
import com.android.gsr.utils.AudioSampleWriter;
import com.android.gsr.utils.Base64;

import javax.servlet.ServletException;
//import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

import org.apache.commons.io.FileUtils;


/**
 * Servlet implementation class QRFileSaveServlet
 */
//@WebServlet("/QRFileSaveServlet")
public class QRFileSaveServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public QRFileSaveServlet() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub


        String qrfile= request.getParameter("Audiofile");

        byte[] audiofile=Base64.decode(qrfile);
         String newStr = new String(audiofile);


            // Display the contents of the byte array.
           System.out.println("The new String equals \"" +newStr + "\"");
            String filePath = this.getServletContext().getRealPath("/")+"";
            System.out.println("Path of the file " + filePath);
            String fileupload="AudioFileStorage";
            PrintWriter out = response.getWriter();


            File f;

                f= new File(filePath);

                //int status = 0;
                if(f.exists()) {
                    filePath += fileupload;

                    f = new File(filePath);
                    if(!f.exists()){
                        f.mkdir();
                    }



                    f = new File(filePath,"test");
                    if(!f.exists()) {
                        FileOutputStream fos = new FileOutputStream(f);

                        fos.write(audiofile);
                        fos.flush();
                        fos.close();
                    } else {
                        out.println("failure");
        }

                }   



}

}

ham 在我的 servlet 中所做的只是获取 byte[] 并直接将其保存在具有位置的文件中,但我想要的是在获取 byte[] 后我想将其转换为 .mp3 音频文件并将其保存在一些文件中路径..在将 byte[] 转换为 .mp3 音频文件后,我不知道如何继续... 任何人都可以帮助我..

【问题讨论】:

  • 没有必要转换字节[] 我只想通过 request.getparameter 并将其保存为我的服务器端的 .mp3 音频文件并将其保存在某个路径位置
  • 我的理解是你的安卓客户端确实发送了 MP3 文件。因此,无需在您的服务器上将 MP3 转换为 MP3!还是我错过了什么?
  • 那么我有一个疑问,当我从我的 android 客户端获取 mp3 文件作为 byte[] 时,我应该如何将它作为 .mp3 文件保存在我的服务器端。即我应该在我的服务器端目的地创建例如“audiorecord.mp3”文件。当我单击应该在我的服务器端播放的那个 .mp3 文件时。
  • 抱歉,我的问题 ham 已经从 android 获取为 mp3 文件有错误,因此无需将其转换为 mp3 我只想在服务器端播放该 mp3。即我应该在我的服务器端目的地创建例如“audiorecord.mp3”文件。

标签: android servlets


【解决方案1】:

如果您正在将 MP4 数据记录到文件中、读取它、base64 编码、传输、base64 解码、将字节写入文件,那么它已经是目的地的 MP4。你有错误吗?

【讨论】:

  • no ham 没有收到任何错误...正在我的目的地创建一个名为“test”的文本文件,其中保存有二进制值的 ham
  • 你完全正确,我在我的目的地作为文本文件获取 mp4 字节,但我想要实现的是我想播放该音频和 c,因为我应该创建一个 .mp4 文件而不是文本文件,以便我可以播放该文件。例如,在我的客户端,一个带有 .mp4 的音频文件正在 sdcard 中创建,就像它应该在我的服务器端目标中创建一样
  • 对不起,pratibha,我不明白你的意思
【解决方案2】:

InputStream is = Context.openFileInput(someFileName); // 无论你有什么甲酸盐

ByteArrayOutputStream bos = new ByteArrayOutputStream();

字节[] b = 新字节[1024]; while ((int bytesRead = is.read(b)) != -1) {

        bos.write(b, 0, bytesRead);

}

byte[] bytes = bos.toByteArray(); String audioDataString=Base64.encodeToString(bytes,Base64.NO_WRAP).toString();

使用 audioDataString 并将此 audioDataString 发送到 namevaluepair 对象

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2016-09-03
    • 2020-11-15
    • 2020-02-18
    • 2020-04-29
    相关资源
    最近更新 更多