Цель:
Сделайте приложение для Android для потоковой передачи видео / аудио в реальном времени на ПК. Файлы не должны никуда сохраняться. Atm im работает на java на обоих концах (android / ПК) из-за находок библиотек libstreamer и vlcj.
В общем и целом:
Я заставил видео работать, но он не воспроизводит звук на ПК. Я пробовал другую кодировку звука. При попытке использовать AAC - VLC выдаст ошибку, сообщив, что это неизвестный формат. Не возникает такая же ошибка при использовании формата AMRNB, поэтому должен идти какой-то звук, или я ошибаюсь в этом? Я пробовал несколько разных тестовых ссылок RTPS из G33Ktricks Не удалось найти ни одного не работающего с ПК vlcj. Logcat для запуска после подключения ПК к android pastebin
Вопрос:
Что мне не хватает для работы звука? Если на это нет ответа, мне следует посмотреть на сторону Android или ПК, чтобы найти недостающую строку больше всего?
Android:
Я использую libstreamer и примеры из Spydroid, чтобы заставить это работать. Код, с которого я начал, находится в примере 1 пакета libstreamer:
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
private SurfaceView mSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
// Sets the port of the RTSP server to 1234
Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putString(RtspServer.KEY_PORT, String.valueOf(1234));
editor.commit();
// Configures the SessionBuilder
SessionBuilder builder = SessionBuilder.getInstance();
builder.setSurfaceView(mSurfaceView);
builder.setPreviewOrientation(90);
builder.setContext(getApplicationContext());
builder.setAudioEncoder(SessionBuilder.AUDIO_AMRNB);
builder.setAudioQuality(new AudioQuality(8000,16000));
builder.setVideoEncoder(SessionBuilder.VIDEO_H264);
builder.setVideoQuality(new VideoQuality(480,320,10,500000));
builder.setCamera(CameraInfo.CAMERA_FACING_FRONT);
builder.build();
// Starts the RTSP server
this.startService(new Intent(this,RtspServer.class));
}
}
ПК
Использование VLCJ для потоковой передачи. Код, с которого я начал работать, находится в официальном пакете vlcj-master - Пример2:
public class Example2
{
private final JFrame frame;
private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
public static void main( String[ ] args )
{
new NativeDiscovery().discover();
final String mrl = "rtsp://10.251.1.107:1234/trackID=0";
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run( )
{
new Example2().start( mrl );
}
} );
}
public Example2( )
{
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
frame = new JFrame( "vlcj quickstart" );
frame.setLocation( 0, 0 );
frame.setSize( 1400, 800 );
frame.setContentPane( mediaPlayerComponent );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
}
private void start( String mrl )
{
String[] options = {"--ffmpeg-threads=1"};
EmbeddedMediaPlayer p = mediaPlayerComponent.getMediaPlayer();
p.playMedia( mrl, options );
}
}
SDP
Со стороны андроида:
RTSP/1.0 200 OK
Server: MajorKernelPanic RTSP Server
Cseq: 3
Content-Length: 366
Content-Base: 10.251.1.107:1234/
Content-Type: application/sdp
v=0
o=- 0 0 IN IP4 10.251.1.107
s=Unnamed
i=N/A
c=IN IP4 10.251.1.125
t=0 0
a=recvonly
m=audio 5004 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1;
a=control:trackID=0
m=video 5006 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=428015;sprop-parameter-sets=Z0KAFdoHgpoBtChNQA==,aM4G4g==;
a=control:trackID=1
SETUP 10.251.1.107:1234/trackID=0
Requested audio with 16kbps at 8kHz
1 ответ
Я нашел причину, почему ...
Следующий код взят из библиотеки libstreaming net.majorkernelpanic.streaming.SessionBuilder.java.
if (session.getVideoTrack()!=null) {
VideoStream video = session.getVideoTrack();
video.setFlashState(mFlash);
video.setVideoQuality(mVideoQuality);
video.setSurfaceView(mSurfaceView);
video.setPreviewOrientation(mOrientation);
video.setDestinationPorts(5006);
}
if (session.getAudioTrack()!=null) {
AudioStream audio = session.getAudioTrack();
audio.setAudioQuality(mAudioQuality);
audio.setDestinationPorts(5004); //Change this port to anything else fx 5010 worked for me
}
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.