2010-08-07 40 views
4

我正在爲需要流式傳輸AAC音頻流的客戶端開發應用程序。不幸的是,我無能爲力的服務器上的流格式。我正在研究Android,並發現Android的媒體播放器不支持原始AAC流(這正是我所得到的)。我在Google Code上發現了一個支持它的項目(我用流測試了它),但它是GPL的,並且不適合我的客戶。我對這種事情沒有太多經驗,所以如果我的想法不是很好,請原諒我。我知道Android 可以播放AAC編碼的內容,如果它是在MP4封裝器中,所以我曾想過在客戶端即時創建一個MP4封裝器,或者甚至只是在飛行中做一些轉換爲另一種格式。這些合理的選擇?有人有更好的建議嗎?Android上的流AAC

提前致謝!

編輯要改寫,是否可以實時將來自網絡服務器的原始AAC流放入MP4容器中?如果是這樣,是否有人知道資源來幫助我完成這個過程?

+0

您可以嘗試查看FAAC中將AAC包裝到MP4容器中的例程。在ISO AAC規範中甚至可能會有一些源代碼可用。 – Danijel 2015-07-16 08:51:14

回答

1

我試過ACCDECODER谷歌爲4 motnhs它確實工作。我發現它,並在2天內,我可以做到這一點! :)我發現它,並看到它的最後谷歌I/O 2017年

我可以建議使用EXOPLAYERINSTEADMEDIAPLAYER。這是一個更好的改進方式。我只用MediaPlayer有同樣的問題,但不久前我找到了Exoplayer,現在我沒有問題來播放音頻流Acc,mp3,mpeg等。我可以給幾個鏈接來檢查它。

這與MediaPlayer幾乎相同,因爲Exoplayer從它延伸出來。您可以看到很多差異,並且可以輕鬆實現它。如果您需要更多的幫助,讓我知道:)

比如你有這樣的:

Media Player mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource("http://your.url.com"); //add you url address 
... 
mediaPlayer.prepare(); 
mediaPlayer.start(); 

在Exoplayer你需要它:

// Create the player 
     player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl); 
     simpleExoPlayerView = new SimpleExoPlayerView(this); 
     simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view); 

//Set media controller 
     simpleExoPlayerView.setUseController(true); 
     simpleExoPlayerView.requestFocus(); 

// Bind the player to the view. 
     simpleExoPlayerView.setPlayer(player); 

ExoPlayer示例代碼:

public class MainActivity extends AppCompatActivity { 


    private static final String TAG = "MainActivity"; 
    private SimpleExoPlayerView simpleExoPlayerView; 
    private SimpleExoPlayer player; 
    private ExoPlayer.EventListener exoPlayerEventListener; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Log.v(TAG,"portrait detected..."); 
     setContentView(R.layout.activity_main); 



// 1. Create a default TrackSelector 
     Handler mainHandler = new Handler(); 
     BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); 
     TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter); 
     TrackSelector trackSelector = new DefaultTrackSelector(mainHandler, videoTrackSelectionFactory); 

// 2. Create a default LoadControl 
     LoadControl loadControl = new DefaultLoadControl(); 

// 3. Create the player 
     player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl); 
     simpleExoPlayerView = new SimpleExoPlayerView(this); 
     simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view); 

//Set media controller 
     simpleExoPlayerView.setUseController(true); 
     simpleExoPlayerView.requestFocus(); 

// Bind the player to the view. 
     simpleExoPlayerView.setPlayer(player); 





//CHOOSE CONTENT: Livestream links may be out of date so find any m3u8 files online and replace: 
//VIDEO FROM SD CARD: 
//  String urimp4 = "/FileName.mp4"; 
//  Uri mp4VideoUri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+urimp4); 

//yachts livestream m3m8 file: 
     Uri mp4VideoUri =Uri.parse("http://your.url.com"); 

//Random livestream file: 
//  Uri mp4VideoUri =Uri.parse("http://your.url.com"); 

//Sports livestream file: 
//  Uri mp4VideoUri =Uri.parse("http://your.url.com"); 




// Measures bandwidth during playback. Can be null if not required. 
     DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter(); 
//Produces DataSource instances through which media data is loaded. 
//  DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "exoplayer2example"), bandwidthMeterA); 
     DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "exoplayer2example"), bandwidthMeterA); 

//Produces Extractor instances for parsing the media data. 
     ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); 

//This is the MediaSource representing the media to be played: 
//FOR SD CARD SOURCE: 
//  MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri, dataSourceFactory, extractorsFactory, null, null); 

//FOR LIVESTREAM LINK: 
     MediaSource videoSource = new HlsMediaSource(mp4VideoUri, dataSourceFactory, 1, null, null); 
     final LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource); 


// Prepare the player with the source. 
     player.prepare(loopingSource); 



     player.addListener(new ExoPlayer.EventListener() { 
      @Override 
      public void onLoadingChanged(boolean isLoading) { 
       Log.v(TAG,"Listener-onLoadingChanged..."); 

      } 

      @Override 
      public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { 
       Log.v(TAG,"Listener-onPlayerStateChanged..."); 

      } 

      @Override 
      public void onTimelineChanged(Timeline timeline, Object manifest) { 
       Log.v(TAG,"Listener-onTimelineChanged..."); 

      } 

      @Override 
      public void onPlayerError(ExoPlaybackException error) { 
       Log.v(TAG,"Listener-onPlayerError..."); 
       player.stop(); 
       player.prepare(loopingSource); 
       player.setPlayWhenReady(true); 
      } 

      @Override 
      public void onPositionDiscontinuity() { 
       Log.v(TAG,"Listener-onPositionDiscontinuity..."); 

      } 
     }); 
     player.setPlayWhenReady(true); 

    }//End of onCreate 




    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.v(TAG,"onStop()..."); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.v(TAG,"onStart()..."); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.v(TAG,"onResume()..."); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.v(TAG,"onPause()..."); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.v(TAG,"onDestroy()..."); 
     player.release(); 

    } 

} 

這只是一個簡短的例子,如果你正在尋找別的東西或者親d更多幫助讓我知道!我在這裏!我想提供幫助,因爲我知道當你在谷歌搜索和搜索以及它顯示的任何東西時它的感覺! :) 保重!!

相關問題