5

AAC オーディオ ストリームのストリーミングを必要とするクライアント用のアプリに取り組んでいます。残念ながら、サーバー上のストリーム形式について私にできることは何もありません。私は Android に取り組んでおり、Android のメディア プレーヤーが生の AAC ストリームをサポートしていないことを発見しました (これは私が得ているものです)。Google Codeでそれをサポートするプロジェクトを見つけました(ストリームでテストしました) が、GPL であり、私のクライアントでは機能しません。私はこの種のことについてあまり経験がないので、私のアイデアが良くない場合はご容赦ください。私はAndroidができることを知っていますMP4ラッパーにある場合はAACでエンコードされたコンテンツを再生するので、クライアント側でMP4ラッパーをオンザフライで作成するか、オンザフライで別の形式に変換することさえ考えていました。これらは合理的な選択肢ですか?誰かがより良い提案をしていますか?

前もって感謝します!

編集 言い換えると、Web サーバーからの生の AAC ストリームをリアルタイムで MP4 コンテナーに入れることは可能ですか? もしそうなら、プロセスに役立つリソースを知っている人はいますか?

4

2 に答える 2

3

この問題の解決策を思いついたことがありますか? 私も似たような状況です。AACファイルを生成するWebサービスがありますが、生ではありませんが、ADTSヘッダーがあります。Android 2.2 ではこれらのファイルを再生できませんが、奇妙なことに Android 2.1 では再生できます。これは、Android 2.2 でのメディア再生用の stagefright ライブラリへの切り替えに起因する問題のようです。

AAC ファイルは、MP4 コンテナーにラップされている場合は正常に再生されます。FAAC を使用して、サーバー側でこれを非常に簡単に実現しました (これはあなたの状況では役に立たないことを認識しています)。ただし、mp4 コンテナーの使用に関するライセンスの問題はまだ調査中です。これにはロイヤリティが必要ですか?


私自身の質問に答えるために...弁護士は、AAC ファイルに mp4 コンテナーを使用するのにライセンスは必要ないことを確認しました。

于 2010-09-28T15:42:16.067 に答える
1

Google のACCDECODER を 4 か月試してみましたが、うまくいきました。私はそれを見つけて、2日でうまくいきました!:) 私はそれを見つけて、前回のGoogle I/O 2017で見ました

EXOPLAYER INSTEAD MEDIAPLAYERを使用することをお勧めします。それはより良い改善方法です。MediaPlayer だけを使用しても同じ問題が発生しましたが、少し前に Exoplayer を見つけました。今ではオーディオ ストリーミング Acc、mp3、mpeg などを再生するのに問題はありません。確認するためのリンクをいくつか提供できます。

ExoPlayer は、Android フレームワークの一部ではなく、Android SDK とは別に配布されるオープン ソース プロジェクトです。ExoPlayer の標準オーディオおよびビデオ コンポーネントは、Android 4.1 (API レベル 16) でリリースされた Android の MediaCodec API に基づいて構築されています。ExoPlayer はライブラリであるため、アプリを更新することで、利用可能になった新機能を簡単に利用できます。

ExoPlayerは、MediaPlayer ではサポートされていない、HTTP 経由の動的適応ストリーミング (DASH)、SmoothStreaming、Common Encryption などの機能をサポートしています。カスタマイズと拡張が容易になるように設計されています。

これは、Exoplayer が拡張されているため、MediaPlayer とほぼ同じです。多くの違いと、それを実装する簡単な方法を見ることができます。さらにヘルプが必要な場合はお知らせください:)

たとえば、これがあります:

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();

    }

}

これは短い例でした。何か他のものを探している場合、またはさらにサポートが必要な場合はお知らせください。私はここにいます! あなたがグーグルで検索したり、何かが表示されたりするときの気持ちを知っているので、私は助けたいです! :) 気をつけて!!

于 2017-06-21T13:34:43.993 に答える