Próbuję wysłać wideo h264/AAC z MediaRecorder Android przez lokalny Socket. Celem jest wysłanie wideo na serwer WOWZA za pośrednictwem RTMP lub RTSP, ale daje mi to wiele problemów i na razie próbuję tylko zapisać dane do pliku z LocalServerSocket.Przesyłanie strumieniowe wideo z MediaRecorder poprzez LocalSocket
Oto kod. Przepraszam, że to nie jest naprawdę czyste, ale spędziłem wiele godzin na testowaniu wielu rzeczy, a mój projekt jest teraz bałagan.
W działalności Camera setup plik wyjściowy:
LocalSocket outSocket = new LocalSocket();
try {
outSocket.connect(new LocalSocketAddress(LOCAL_SOCKET));
} catch (Exception e) {
Log.i(LOG_TAG, "Error connecting socket: "+e);
}
mMediaRecorder.setOutputFile(outSocket.getFileDescriptor());
Realizacja LocalServerSocket:
try {
mLocalServerSocket = new LocalServerSocket(mName);
} catch (Exception e) {
Log.e(LOG_TAG, "Error creating server socket: "+e);
return;
}
while (true) {
File out = null;
FileOutputStream fop = null;
try {
mLocalClientSocket = mLocalServerSocket.accept();
InputStream in = mLocalClientSocket.getInputStream();
out = new File(mContext.getExternalFilesDir(null), "testfile.mp4");
fop = new FileOutputStream(out);
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) >= 0) {
Log.i(LOG_TAG, "Writing "+len+" bytes");
fop.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
fop.close();
mLocalClientSocket.close();
} catch (Exception e2) {}
}
}
Problemem jest to, że plik wynikająca z tego nie jest czytelny dla dowolnego odtwarzacza multimedialnego. Czy uważasz, że dzieje się tak z powodu problemu z kodowaniem? Ten kod powinien wygenerować plik binarny, jeśli dobrze rozumiem ?!
Z góry dziękuję, pozdrawiam.
jeśli nie dostaniesz błędów to prawdopodobnie jest spowodowane problemami z kodowaniem/nazwami plików. Co [OutputFormat] (http://developer.android.com/reference/android/media/MediaRecorder.OutputFormat.html) ustawiłeś? Może zmiana nazwy na '.3gp' lub tak pomaga - patrz [tutaj] (http://stackoverflow.com/questions/9110711/android-mediarecorder-getting-3gp-instead-of-mpeg4) – zapl
Format wyjściowy to MPEG_4, więc myślę, że powinno to być ok z rozszerzeniem .mp4. Poza tym, jeśli piszę bezpośrednio do pliku .mp4 w mMediaRecorder.setOutputFile(), to działa idealnie. – Simon
czy sprawdziłeś, czy coś takiego jak [mediainfo] (http://mediainfo.sourceforge.net/en) może odczytać właściwości stworzonego wideo? Możesz także wypróbować różnicę binarną (przynajmniej nagłówek) bezpośrednio wygenerowanego pliku i plik wysłać przez lokalne gniazdo, aby sprawdzić, czy wygenerowany plik wygląda prawidłowo. – zapl