Прямая трансляция с функцией воспроизведения

Мне нужно разработать живой видеорегистратор с функцией воспроизведения с прямой трансляцией радио. Как уже некоторые приложения делают: V Radio Recorder. Главное, мне нужны функциональность воспроизведения и потоковое вещание. Например, если пользователь прослушал 20 секунд радио, он может перемотать на 10 секунд.

2 ответа

Я нашел сервер wowza, чтобы исправить мою проблему.

создать аккаунт на wowza сервере. скачать файлы сервера. запустить сервер на вашем локальном компьютере. поместите ваш живой URL на сервер wowza и выберите время для воспроизведения. Я использовал MX-плеер для воспроизведения потоковой передачи, он имеет функцию воспроизведения.

вот ссылка на сайт

Сначала загрузите живой байтовый поток и кэшируйте его локально. затем воспроизведите радио из этого кэша и для записи сохраните этот файл в другой каталог записи. вот код здесь я использую AudioTrack, но вы можете использовать медиаплеер и установить источник для медиаплеера, который кеширует файл для воспроизведения.

public class MainActivity extends AppCompatActivity {
    private Decoder mDecoder;
    private AudioTrack mAudioTrack;
    File downloadingMediaFile;
    FileOutputStream out;
    Button stop, start;
    boolean isStop;
    Thread DownloadThread;
    String url = "http://stream.laut.fm/darksynthradio?type=.mp3/;stream.mp3";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.continer, AudioVisualizationFragment.newInstance())
                .addToBackStack(null)
                .commit();

        stop = (Button) findViewById(R.id.btn_stop);
        start = (Button) findViewById(R.id.btn_start);
        isStop = true;
        stop.setClickable(false);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isStop = true;
                start.setClickable(true);
                stop.setClickable(false);

                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Toast.makeText(MainActivity.this, "Download Stop", Toast.LENGTH_SHORT).show();


            }
        });
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                downloadingMediaFile = new File("/storage/sdcard0/", new Date() + ".mp3");
                try {
                    out = new FileOutputStream(downloadingMediaFile, true);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                isStop = false;
                stop.setClickable(true);
                start.setClickable(false);
                Download();
                DownloadThread.start();
                Toast.makeText(MainActivity.this, "Download Start", Toast.LENGTH_SHORT).show();

            }
        });

        final int sampleRate = 44100;
        final int minBufferSize = AudioTrack.getMinBufferSize(sampleRate,
                AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT);

        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate,
                AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT,
                minBufferSize,
                AudioTrack.MODE_STREAM);

        mDecoder = new Decoder();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    InputStream in = new URL(url)
                            .openConnection()
                            .getInputStream();
                    final Bitstream bitstream = new Bitstream(in);

                    final int READ_THRESHOLD = 2147483647;
                    int framesReaded = READ_THRESHOLD;

                    Header header;
                    for (; framesReaded-- > 0 && (header = bitstream.readFrame()) != null; ) {
                        SampleBuffer sampleBuffer = (SampleBuffer) mDecoder.decodeFrame(header, bitstream);
                        short[] buffer = sampleBuffer.getBuffer();
                        mAudioTrack.write(buffer, 0, buffer.length);
                        bitstream.closeFrame();

                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();

        mAudioTrack.play();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mAudioTrack.stop();
    }

    void Download() {
        DownloadThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    InputStream in = new URL(url)
                            .openConnection()
                            .getInputStream();
                    byte buf[] = new byte[16384];
                    do {
                        int numread = 0;
                        numread = in.read(buf);
                        if (numread > 0) {
                            out.write(buf, 0, numread);
                        }
                    } while (!isStop);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}
Другие вопросы по тегам