【发布时间】:2021-01-31 10:52:27
【问题描述】:
我需要开发具有播放功能的实时 DVR 以及广播直播。 就像已经有一些应用程序在做:V Radio Recorder。 我需要播放功能和实时流媒体的主要功能。 就像用户听了 20 秒的广播一样,他可以倒回到 10 秒。
【问题讨论】:
我需要开发具有播放功能的实时 DVR 以及广播直播。 就像已经有一些应用程序在做:V Radio Recorder。 我需要播放功能和实时流媒体的主要功能。 就像用户听了 20 秒的广播一样,他可以倒回到 10 秒。
【问题讨论】:
首先下载直播流字节字节并缓存到本地。然后从该缓存播放收音机并录制将该文件保存到其他录制目录。 这是代码。这里我使用 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();
}
}
});
}
}
【讨论】: