我試圖通過本地Socket從Android的MediaRecorder發送h264/AAC視頻。目標是通過RTMP或RTSP將視頻發送到WOWZA服務器,但它給我帶來了很多麻煩,現在我只是試圖從LocalServerSocket將數據寫入文件。從MediaRecorder通過LocalSocket流式傳輸視頻
這是一些代碼。對不起,它不是很乾淨,但我花了幾個小時來測試很多事情,現在我的項目很混亂。
在攝像頭活動,將輸出文件設置:
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());
的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) {}
}
}
的問題是,由此產生的文件是不會被任何媒體播放器可讀。你認爲這是由於編碼問題?如果我理解得很好,這段代碼應該生成一個二進制文件?!
在此先感謝,歡呼聲。
如果您沒有得到錯誤,它可能是由編碼/文件名問題引起的。你設置了什麼[OutputFormat](http://developer.android.com/reference/android/media/MediaRecorder.OutputFormat.html)?也許將其重命名爲'.3gp'或者幫助 - 請參閱[這裏](http://stackoverflow.com/questions/9110711/android-mediarecorder-getting-3gp-instead-of-mpeg4) – zapl
輸出格式是MPEG_4,所以我想應該用.mp4擴展名來確定。此外,如果我直接寫入mMediaRecorder.setOutputFile()中的.mp4文件,它可以很好地工作。 – Simon
是否檢查過像[mediainfo](http://mediainfo.sourceforge.net/en)這樣的內容是否可以讀取已創建視頻的屬性?你也可以嘗試直接生成的文件的二進制比較(至少是頭文件),並通過本地套接字發送文件以檢查生成的文件是否正確。 – zapl