0

私はコードを持っています:

private MediaRecorder recorder;

String hostname = "192.168.1.125";
int port = 1935;
Socket socket;
ParcelFileDescriptor pfd;

public void start()
    {

        try {
            socket = new Socket(InetAddress.getByName(hostname), port);
            pfd = ParcelFileDescriptor.fromSocket(socket);

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

  recorder.setOutputFile(pfd.getFileDescriptor()); 

  //  String filename = String.format("/sdcard/%d.mp4", System.currentTimeMillis());
  // 
  // recorder.setOutputFile(filename);

    try
        {
        recorder.prepare();
            recorder.start();
        }
        catch (IllegalStateException e)
        {
        e.printStackTrace();
        }
        catch (IOException e)
        {
        e.printStackTrace();
        }
    }

そしてサーバー側:

import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

        public static void main(String[] args) 
        {

            try
                {
                System.out.println("create sock");
                ServerSocket svsock = new ServerSocket(1935);

                System.out.println("accept");
                Socket sock = svsock.accept();
                System.out.println("buffer read");

                FileOutputStream outFile = null;

    String filename = String.format("%d.mp4", System.currentTimeMillis());

                   try {
                                        outFile = new FileOutputStream(filename);
                                        System.out.println(filename);
                                } catch (IOException e1) {
                                        e1.printStackTrace();
                                }

                  InputStream is = new DataInputStream(sock.getInputStream());
                                byte[] byteBuffer = new byte[1024];

                                int allsize = 0;
                                while(sock.isConnected()) {

                                    int size = is.read(byteBuffer);
                                        if (size == -1){
                                                break;
                                        } else {
                                                outFile.write(byteBuffer, 0, size);
                                        }
                                        allsize += size;

                                }
                                System.out.println("close size=" + allsize);
                                outFile.close();
                                sock.close();

                }
                catch(Exception e)
                {
                        e.printStackTrace();
                }       

                System.out.println("endmain");
        }
}

Android 2.2.2 (HTC quiet bright) でテストしたところ、すべて正常に動作しました。「開始」ボタンを押すと、サーバーがファイルを作成し、ストリームからファイルにデータを記録します。このファイルの後、VLCプレーヤーなどで正常に再生されます。

しかし、Android 4.0.4(Galaxy S2)サーバーでテストすると、ファイルが作成され、ストリームからファイルにデータが記録されますが、VLC(および他のプレーヤーも)で再生されず、エラーが発生します

mp4 エラー: MP4 プラグインが破棄されました (moov、foov、moof ボックスがありません) avcodec エラー: コーデックを開けませんでした demux エラー: 指定されたイベント オブジェクト ハンドルが無効です ps エラー: ピークを確認できません メイン エラー: `file/:/ に適した demux モジュールがありません//C:/1345461283455.mp4'

このファイルをYouTubeにもアップロードしようとしましたが、YouTubeをアップロードした後、ファイル形式がサポートされていないなどのエラーが表示されます。

しかし、Android 4.0.4(Galaxy S2)は、ファイルを電話のメモリに保存すると(サーバーにストリーミングしないで)、ファイルを正常に作成して再生します

おそらくサーバー側の問題か、Android 4.0.4で何かが変更されたと思います。

私を助けてください。前もって感謝します。

4

1 に答える 1

0

これを試して

recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setOutputFile(pfd.getFileDescriptor()); 

問題を解決する必要があると思います。試してみて、それが役立つかどうかを確認してください...

于 2012-09-24T20:27:16.433 に答える