2014-10-31 56 views
3

在Android中,是否可以直接从字节数组生成FileDescriptor,而无需先打开文件?在没有首先打开文件的情况下在Android上生成FileDescriptor

在Android 2.2中,我正在生成一个MIDI文件,然后使用MediaPlayer播放它。我已经包含了在下面成功完成Main.java文件的文本。到现在为止还挺好。

然而,这个过程首先调用...

FileOutputStream outputStream = openFileOutput(file, MODE_PRIVATE); 
outputStream.write(byteStream); 
outputStream.close(); 

...写出来的文件,然后调用...

FileInputStream inputStream = new FileInputStream(midifile); 
FileDescriptor fileDescriptor = inputStream.getFD(); 

...读它放回,致电前:

mediaPlayer.setDataSource(fileDescriptor); 

这在我看来是浪费。我可以直接从byteArray创建FileDescriptor,以便可以立即播放MIDI流?


==工作代码==

package com.example.midi; 

import java.io.File; 
import java.io.FileDescriptor; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 

import android.app.Activity; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 

public class Main extends Activity { 

    private String file = "midi.mid"; 
    private MediaPlayer mediaPlayer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    createNewMIDIFile(); 
    playNewMIDIFile(); 
    } 

    public void createNewMIDIFile() { 
    Integer[] stream = new Integer[]{ 
     // 
     0x4d, 0x54, 0x68, 0x64, // MThd = MIDI file designator 
     0x00, 0x00, 0x00, 0x06, // Standard MIDI File (SMF) 
     0x00, 0x01, 0x00, 0x02, // multiple-track format: 2 tracks 
     0x00, 0x40, // 64 ticks per beat (quarter note) 
     0x4D, 0x54, 0x72, 0x6B, // Header for track 1 
     0x00, 0x00, 0x00, 0x0B, // 11 bytes to describe the track 
     0x00, 0xFF, 0x51, 0x03, // set tempo: 
     0x0F, 0x42, 0x40, // 1,000,000 microseconds/beat: 60 bpm 
     0x00, 0xFF, 0x2F, 0x00, // End of track 1 
     0x4D, 0x54, 0x72, 0x6B, // Header for track 2 
     0x00, 0x00, 0x00, 0x0F, // 15 bytes to describe the track 
     0x00, // Immediately 
     0xC1, 0x01, // change instrument for track 2 to piano 
     0x00, // Immediately 
     0x91, 0x3C, 0x7F, // play middle C with a velocity of 127 
     0x30, // 48 ticks later (dotted eighth note) 
     0x81, 0x3C, 0x00, // stop playing the middle C 
     0x00, 0xFF, 0x2F, 0x00 // End of track 2 
    }; 

    int length = stream.length; 
    byte[] byteStream = new byte[length]; 
    for (int ii = 0; ii < length; ii++) { 
     byteStream[ii] = (byte) (stream[ii] % 256); 
    } 

    try { 
     FileOutputStream outputStream = openFileOutput(file, MODE_PRIVATE); 
     outputStream.write(byteStream); 
     outputStream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    public void play(View view) { 
    /* Triggered by a button defined in activity_main.xml as 
    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="play" 
    android:text="Play MIDI" /> 
    */ 
    playNewMIDIFile(); 
    } 

    public void playNewMIDIFile() { 
    try { 
     String filename = getFilesDir() + "/" + file; 
     File midifile = new File(filename); 
     FileInputStream inputStream = new FileInputStream(midifile); 
     FileDescriptor fileDescriptor = inputStream.getFD(); 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(fileDescriptor); 
     inputStream.close(); 
     mediaPlayer.prepare(); 
     mediaPlayer.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

有关建设上飞一个MIDI文件的详细信息,请参阅kevinboone.netskytopiasonicspot

+2

文件描述符被命名为文件描述符,因为它们描述*文件*。 – 2014-10-31 22:46:30

+0

是否可以写入标准输出,并将其重定向到mediaPlayer作为数据源? – 2014-11-01 00:50:45

回答

0

的MediaPlayer将起到无论是从一个文件,或来自HTTP网址。

所以这里的诀窍是从指向本地主机服务器的url播放内容,其中您可以在内存中或通过任何其他方式生成数据。

见我的答案在这里是如何做到这一点: Android ServerSocket programming with jCIFS streaming files

相关问题