Прямая трансляция с функцией воспроизведения
Мне нужно разработать живой видеорегистратор с функцией воспроизведения с прямой трансляцией радио. Как уже некоторые приложения делают: 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();
}
}
});
}
}