2016-07-13 3 views
1

라디오의 라이브 스트리밍으로 재생 기능을 갖춘 라이브 DVR을 개발해야합니다. 이미 일부 응용 프로그램처럼 : V Radio Recorder. 중요한 것은 재생 기능과 라이브 스트리밍이 필요합니다. 사용자가 20 초 동안 라디오를 들으면 10 초에 되감기 할 수 있습니다.재생 후 기능으로 라이브 스트리밍

답변

0

먼저 실시간 스트림 바이트를 다운로드하고 로컬로 캐시합니다. 그런 다음 해당 캐시에서 라디오를 재생하고 녹음을 위해 해당 파일을 다른 녹음 디렉토리에 저장하십시오. 여기에 코드가 있습니다. 여기 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(); 
       } 
      } 
     }); 
    } 

} 
+0

덕분이다. –

+0

https://drive.google.com/open?id=0B3QOuxsFDJ3sWnJVR1BxM1pKZ3M jar 파일을 다운로드하여 libs 폴더에 넣고 android gradle 파일을 컴파일 파일 ('libs/jl1.0.1.jar')로 컴파일하고이 가져 오기도 가져옵니다. javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.SampleBuffer; – asim

+0

도움을 주셔서 감사합니다 다시 @asim하지만 코드를 실행했지만 스트림을 전달하고 되감기 할 수있는 옵션이 없습니다. 당신이 V 라디오 레코더와 같은 정확한 기능을 필요로하는 것에 대해 매우 감사 할 것입니다. –

0

내 문제를 해결하기 위해 wowza 서버를 찾았습니다.

wowza 서버에 계정을 만드십시오. 서버 파일을 다운로드하십시오. 로컬 시스템에서 서버를 실행하십시오. 라이브 URL을 wowza 서버에 넣고 재생할 시간을 선택하십시오. MX 플레이어를 사용하여 재생 기능을 가진 스트리밍을 재생했습니다. 이를 해결하는 방법을 비트 스트림 디코더, SampleBuffer : 여기

는 이러한 클래스를 설명 할 수 있다면 더 도움이 될 것입니다 도움을 website Link