我正在尝试将h.264视频从我的电脑传输到安卓。
我写了一个简单的服务器,接受了android的连接,从这里读取测试文件 http://support.apple.com/kb/HT1425 sample_iPod.m4v并在循环中执行一系列等待一段时间的发送,这样我就不会躲过网络
这里是服务器线程
int CLmfdtServerThread::Run()
{
TRACE("CLPitServerThread::Run START\n") ;
int sz = 2236480;
char* testbits = new char[sz];
FILE* fp = fopen("d:/misc/sample_iPod.m4v", "rb");
int n = fread(testbits, 1, sz, fp);
fclose(fp);
SOCKET serverSocket=NULL;
for( ; ; Sleep(1000) ) { // try to connect to android ever 1 secs
// open a server socket to listen for connections from androids
strcpy(g_androidLmfdMsg, "Not connected"); g_theDialog->Invalidate();
SOCKET clientSocket = socketSetupAndWaitAccept(serverSocket, 21121, g_androidLmfdMsg);
if(!clientSocket)
continue;
for( int i=0 ; i<sz; i+=10000 ) {
TRACE("CLPitServerThread::Run try send lmfd\n");
int bytesSent = send(clientSocket, (char*)testbits, 10000, 0);
if (bytesSent == SOCKET_ERROR || bytesSent!=10000) {
int erno = WSAGetLastError(); closesocket(clientSocket); WSACleanup();
break;
}
TRACE("CLPitServerThread::Run sent lmfd %d bytes\n", bytesSent);
Sleep(20);
}
}
在android上我创建一个异步任务
@Override
protected String doInBackground(String... params) {
mMfdImg = (ImageView) MainActivity.getStaticRef().findViewById(R.id.imageViewMfd);
while(true) {
try {
if(mServerIP==null) {
Thread.sleep(1000);
continue;
}
@SuppressWarnings("resource")
Socket socket = new Socket(mServerIP, LPIT_PORT); // LMFD port is 21121
DataInputStream dis = new DataInputStream(socket.getInputStream());
for ( mLoops=0 ; ; mLoops++ ) { //
mMfdBmp = BitmapFactory.decodeStream(dis);
publishProgress(); // force redraw
Thread.sleep(5); //
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
protected void onProgressUpdate(Void... values) {
//Log.d("ReadAndDisplay", "onProgressUpdate");
mMfdImg.setImageBitmap(mMfdBmp); // draw new img to screen
mMfdImg.invalidate();
但它不起作用,decodeStream立即返回NULL 它应根据此http://developer.android.com/guide/appendix/media-formats.html#core
解码h.264我现在有一个类似的系统从服务器发送jpeg,然后我在套接字上执行readFully并使用BitmapFactory.decodeByteArray并且工作正常,但我想从jpegs模式到mpegs以节省带宽< / p>
任何人的想法?感谢
更新
简化我将文件复制到sdcard(另一个测试文件,确定仅限h.264基线视频)并验证它在videoplayer上播放的内容
然后我写了这个
final String fname = Environment.getExternalStorageDirectory().getPath()+"/Download/out.mp4";
try {
File file = new File(fname);
byte[] ip = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(ip);
fis.close();
mMfdBmp = BitmapFactory.decodeByteArray (ip, 0, ip.length);
publishProgress(); // force redraw
} catch
我验证了ip中的内容是真正的mp4数据。仍然没有运气,我也试过decodeFile,结果相同。
我使用完全相同的代码,但加载.jpp并且工作正常
我想这http://developer.android.com/guide/appendix/media-formats.html#core就是说谎 H.264 AVC• (Android 3.0+)•基线配置文件(BP)•3GPP(.3gp) •MPEG-4(.mp4)