2013-03-07 4 views
8

Попробуйте взять рамку предварительного просмотра, сгенерированную камерой android, и передайте data[] на входной канал ffmpeg для создания FLV-видео. Команда, я использовал:Захват камеры Android с помощью FFmpeg

ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv 

Я также пытался заставить формат ввода в yuv4mpegpipe и rawvideo, но без успеха ... формат по умолчанию для предварительного просмотра кадра, сформированного андроида-камеры NV21. Путь утра invokin' FFmpeg это через Process API и написание предварительного просмотра кадры data[] к процессу stdin ... onPreviewFrame() определение следующим образом:

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
    try 
    { 
     processIn.write(data); 
    } 
    catch(Exception e) 
    { 
     Log.e(TAG, FUNCTION + " : " + e.getMessage()); 
    }    
    camera.addCallbackBuffer(new byte[bufferSize]); 
} 

processIn подключен к ffmpeg процесса stdin и buffersize рассчитывается на основании документации, предоставленной для addCallbackBuffer(). Есть ли что-то, что неправильно?

Спасибо ...

+0

могли бы вы объяснить, как вы запустили процесс FFmpeg с помощью процесса апи? – datayeah

ответ

8

Любопытное получил это работает отлично ... ошибка, казалось бы, Happenin' был связан с vcodec потока изображения. Кажется, что ffmpeg не имеет возможности для декодирования NV21 форматов изображений или потоков изображений. Для этого пришлось преобразовать рамку предварительного просмотра формата NV21 в JPEG, и, поскольку изображения должны были транслироваться в реальном времени до процесса ffmpeg, преобразование должно было быть On the Fly. Ближайшим надежное решение для On the Fly преобразования в JPEG следующим образом:

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
     if(isFirstFrame) 
    { 
     Camera.Parameters cameraParam = camera.getParameters(); 
     Camera.Size previewSize = cameraParam.getPreviewSize(); 
     previewFormat = cameraParam.getPreviewFormat(); 
     frameWidth = previewSize.width; 
     frameHeight = previewSize.height; 
     frameRect = new Rect(0, 0, frameWidth, frameHeight); 
     isFirstFrame = false; 
    } 

    previewImage = new YuvImage(data, previewFormat, frameWidth, frameHeight, null); 

    if(previewImage.compressToJpeg(frameRect, 50, processIn)) 
     Log.d(TAG, "Data : " + data.length); 

    previewImage = null; 

    camera.addCallbackBuffer(new byte[bufferSize]); 
} 

ffmpeg И команда была использована:

ffmpeg -f image2pipe -vcodec mjpeg -i - -f flv -vcodec libx264 out.flv 
+0

Привет, Можете ли вы поделиться своим кодом? Я хочу знать, как вы используете 'processIn'. Спасибо – suitianshi

+0

Дайте больше деталей? – user1767754

+0

Я получаю неподдерживаемый формат «mjpeg» на Android, когда я пытаюсь использовать этот код, используя статическую сборку ffmpeg. Какое решение для этого? –

Смежные вопросы