Как загрузить много растровых изображений без сбоя приложения в Android - PullRequest
2 голосов
/ 26 февраля 2011

Я работаю над потоковым видео из Интернета. Где я декодирую видео / аудио материал в нативном коде и получаю необработанные пиксели для видео

Я создаю растровое изображение в java-коде с держателем поверхности и канвой и обновляю пиксели для каждого растрового изображения из собственного кода, а затем транслирую растровые изображения в виде видео. Моя проблема здесь в том, что видео падает через несколько секунд из-за нехватки памяти.

Я хочу знать, есть ли что-то, что мне нужно, чтобы не вылетать приложение и использовать мало памяти.

Вот мой код.

public CanvasThread(SurfaceHolder surfaceHolder, Panel panel) {
    _surfaceHolder = surfaceHolder;
    _panel = panel;     }
public void setRunning(boolean run) {
    _run = run;    }

@Override
public void run() {
    Canvas c;
    while (_run) {
        c = null;
        try {
            c = _surfaceHolder.lockCanvas(null);
            synchronized (_surfaceHolder) {
                _panel.onDraw(c);
            }
        } finally {
                if (c != null) {
                _surfaceHolder.unlockCanvasAndPost(c);
            }
       }    

  public class Panel extends SurfaceView implements SurfaceHolder.Callback{
    private CanvasThread canvasthread;
    private static Bitmap mBitmap;
    private static boolean ii=false;
       public Panel(Context context, AttributeSet attrs) {
        super(context, attrs); 
        getHolder().addCallback(this);
        canvasthread = new CanvasThread(getHolder(), this);
        setFocusable(true);
       mBitmap=Bitmap.createBitmap(480, 320, Bitmap.Config.RGB_565);//bitmap created in constructor
    }

     public Panel(Context context) {
           super(context);
            getHolder().addCallback(this);
            canvasthread = new CanvasThread(getHolder(), this);
            setFocusable(true);
        }

     private static native void renderbitmap(Bitmap bitmap); //native function
    @Override
    public void onDraw(Canvas canvas) {

        renderbitmap(mBitmap); //Update pixels from native code
        canvas.drawBitmap(mBitmap, 0,0,null);//draw on canvas
}

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {        }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        canvasthread.setRunning(true);
        canvasthread.start();       }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        canvasthread.setRunning(false);
        while (retry) {
            try {
                canvasthread.join();
                retry = false;
            } catch (InterruptedException e) {              }
    }

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

После быстрого сканирования вашего кода, ваша основная проблема в том, что вы создаете новое растровое изображение каждый раз, когда вызывается ваш метод OnDraw. Вместо этого закомментируйте эту строку и создайте растровое изображение для mBitmap только один раз при запуске.

1 голос
/ 26 февраля 2011

Вы можете проверить glbuffer Ричарда Квирка.Я использую его в приложении видеопроигрывателя.

Как правило, вы хотите удерживать принимаемые вами видео пакеты и декодировать их только до того, как они понадобятся для отображения.Должно быть легко интегрировать ваш код с glbuffer и обойти любое распределение битовых карт в коде Java.

В любой момент времени в собственном коде и в памяти текстур GL будет один декодированный кадр и несколько закодированных пакетов, которыеты держишься для буферизации.

1 голос
/ 26 февраля 2011

Это, вероятно, не потому, что у вас ограниченный объем памяти. Вероятно, около 16 МБ для эмулятора. Вы не должны хранить все изображения в памяти. У вас есть варианты

  1. Исправьте свой алгоритм, чтобы он не нужно все в памяти
  2. Или сохранить только одно изображение в памяти и остаток на диске
...