【问题标题】:Live streaming with play back back functionality具有回放功能的实时流媒体
【发布时间】:2021-01-31 10:52:27
【问题描述】:

我需要开发具有播放功能的实时 DVR 以及广播直播。 就像已经有一些应用程序在做:V Radio Recorder。 我需要播放功能和实时流媒体的主要功能。 就像用户听了 20 秒的广播一样,他可以倒回到 10 秒。

【问题讨论】:

    标签: android playback


    【解决方案1】:

    首先下载直播流字节字节并缓存到本地。然后从该缓存播放收音机并录制将该文件保存到其他录制目录。 这是代码。这里我使用 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();
                    }
                }
            });
        }
    
    }
    

    【讨论】:

    • 感谢您的帮助,如果您能解释这些类会更有帮助:Bitstream ,Decoder,SampleBuffer 如何解决它。
    • 下载drive.google.com/open?id=0B3QOuxsFDJ3sWnJVR1BxM1pKZ3M jar文件并将其放入您的libs文件夹并在android gradle中使用编译文件('libs/jl1.0.1.jar')进行编译。也导入此导入javazoom.jl.decoder .比特流;导入 javazoom.jl.decoder.Decoder;导入 javazoom.jl.decoder.Header;导入 javazoom.jl.decoder.SampleBuffer;
    • 再次感谢@asim 的帮助,但我已经运行了代码,但是没有选项可以转发和倒带流,请您帮我解决这个问题,我将非常感谢您,我需要确切的功能就像 V Radio Recorder 一样。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2012-06-07
    • 2012-11-09
    • 1970-01-01
    • 2018-03-07
    • 2011-03-13
    相关资源
    最近更新 更多