Стрим AAC на Android - PullRequest
       14

Стрим AAC на Android

4 голосов
/ 08 августа 2010

Я работаю над приложением для клиента, которое требует потоковой передачи аудиопотока AAC.К сожалению, я ничего не могу сделать с потоковым форматом на сервере.Я работаю над Android и обнаружил, что медиа-проигрыватель Android не поддерживает необработанные потоки AAC (что я и получаю).Я нашел проект на Google Code , который поддерживает его (я проверил его в потоке), но он поддерживает GPL, и он не работает для моего клиента.У меня нет большого опыта с такими вещами, так что прости меня, если мои идеи не велики.Я знаю, что Android может воспроизводить закодированный контент AAC, если он находится в оболочке MP4, поэтому я думал о создании оболочки MP4 на лету на стороне клиента или, возможно, даже просто выполнил какое-то преобразование в другой форматлетать.Это разумные варианты?У кого-нибудь есть лучшие предложения?

Заранее спасибо!

Редактировать Перефразируя, можно ли в реальном времени поместить необработанный поток AAC с веб-сервера в контейнер MP4?Если так, кто-нибудь знает ресурсы, чтобы помочь мне с процессом?

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Мне интересно, вы когда-нибудь предлагали решение этой проблемы? Я в похожей ситуации. У нас есть веб-сервис, генерирующий файлы AAC, хотя они и не являются необработанными, у них есть заголовок ADTS. Android 2.2 не может воспроизводить эти файлы, хотя Android 2.1 может, как ни странно. Кажется, проблема связана с переходом Android на библиотеки stagefright для воспроизведения мультимедиа в версии 2.2.

Файлы AAC воспроизводятся нормально, если находятся в контейнере MP4. Мы достигли этого на серверной стороне с помощью FAAC (я понимаю, что это не поможет вам в вашей ситуации). Мы все еще исследуем проблемы с использованием контейнера mp4. Требуется ли роялти?


Чтобы ответить на мой собственный вопрос ... адвокат подтвердил, что использование контейнера mp4 для файла AAC не требует лицензирования.

1 голос
/ 21 июня 2017

Я ПРОБОВАЛ ACCDECODER от Google в течение 4 месяцев, он работал хорошо.Я нашел это и через 2 дня я мог сделать это работает!:) Я нашел его и увидел в последний Google I / O 2017

Я могу предложить использовать EXOPLAYER INSTEAD MediaPlayer .Это лучший и лучший способ.У меня была та же проблема с использованием только MediaPlayer, но недавно я нашел Exoplayer, теперь у меня нет проблем с воспроизведением потокового аудио Acc, mp3, mpeg и т. Д. Я могу дать пару ссылок, чтобы проверить это.

ExoPlayer - это проект с открытым исходным кодом, который не является частью платформы Android и распространяется отдельно от Android SDK .Стандартные аудио и видео компоненты ExoPlayer построены на Android MediaCodec API, который был выпущен в Android 4.1 (уровень API 16).Поскольку ExoPlayer - это библиотека, вы можете легко воспользоваться новыми функциями по мере их появления, обновляя ваше приложение.

ExoPlayer поддерживает такие функции, как динамическая адаптивная потоковая передача по HTTP (DASH), SmoothStreaming и Common Encryption,которые не поддерживаются MediaPlayer .Он прост в настройке и расширении.

Это почти то же самое, что 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();

    }

}

Это был короткий пример, если вы ищете что-то еще или вам нужна дополнительная помощь , дайте мне знать!Я здесь!Я хотел бы помочь, потому что я знаю, каково это, когда вы гуглите и ищете и все, что он показывает!:) Береги себя !!

...