2014-10-31 57 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

相關問題