Recherche avancée

Médias (1)

Mot : - Tags -/belgique

Autres articles (57)

  • Websites made ​​with MediaSPIP

    2 mai 2011, par

    This page lists some websites based on MediaSPIP.

  • Le plugin : Podcasts.

    14 juillet 2010, par

    Le problème du podcasting est à nouveau un problème révélateur de la normalisation des transports de données sur Internet.
    Deux formats intéressants existent : Celui développé par Apple, très axé sur l’utilisation d’iTunes dont la SPEC est ici ; Le format "Media RSS Module" qui est plus "libre" notamment soutenu par Yahoo et le logiciel Miro ;
    Types de fichiers supportés dans les flux
    Le format d’Apple n’autorise que les formats suivants dans ses flux : .mp3 audio/mpeg .m4a audio/x-m4a .mp4 (...)

  • Configurer la prise en compte des langues

    15 novembre 2010, par

    Accéder à la configuration et ajouter des langues prises en compte
    Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
    De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
    Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...)

Sur d’autres sites (8335)

  • Cant we use mp4 as format of FFmpegFrameRecorder while RTMP streaming

    13 avril 2016, par Saty

    I am trying to stream video with FFmpegFrameRecorder using javacv. All are working good however I want to use "mp4" as the recording format instead of FLV. is that possible because when i set that, it crashed ?

    I am using the below code which half of the internet community is using to live stream

    public class MainActivity extends Activity implements OnClickListener {

    private final static String LOG_TAG = "MainActivity";

    private PowerManager.WakeLock mWakeLock;

    private String ffmpeg_link = "rtmp://username:password@xxx.xxx.xxx.xxx:1935/live/test.flv";
    //private String ffmpeg_link = "/mnt/sdcard/new_stream.flv";

    private volatile FFmpegFrameRecorder recorder;
    boolean recording = false;
    long startTime = 0;

    private int sampleAudioRateInHz = 44100;
    private int imageWidth = 320;
    private int imageHeight = 240;
    private int frameRate = 30;

    private Thread audioThread;
    volatile boolean runAudioThread = true;
    private AudioRecord audioRecord;
    private AudioRecordRunnable audioRecordRunnable;

    private CameraView cameraView;
    private IplImage yuvIplimage = null;

    private Button recordButton;
    private LinearLayout mainLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
       setContentView(R.layout.activity_main);

       initLayout();
       initRecorder();
    }

    @Override
    protected void onResume() {
       super.onResume();

       if (mWakeLock == null) {
           PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
           mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, LOG_TAG);
           mWakeLock.acquire();
       }
    }

    @Override
    protected void onPause() {
       super.onPause();

       if (mWakeLock != null) {
           mWakeLock.release();
           mWakeLock = null;
       }
    }

    @Override
    protected void onDestroy() {
       super.onDestroy();

       recording = false;
    }


    private void initLayout() {

       mainLayout = (LinearLayout) this.findViewById(R.id.record_layout);

       recordButton = (Button) findViewById(R.id.recorder_control);
       recordButton.setText("Start");
       recordButton.setOnClickListener(this);

       cameraView = new CameraView(this);

       LinearLayout.LayoutParams layoutParam = new LinearLayout.LayoutParams(imageWidth, imageHeight);        
       mainLayout.addView(cameraView, layoutParam);
       Log.v(LOG_TAG, "added cameraView to mainLayout");
    }

    private void initRecorder() {
       Log.w(LOG_TAG,"initRecorder");

       if (yuvIplimage == null) {
           // Recreated after frame size is set in surface change method
           yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
           //yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_32S, 2);

           Log.v(LOG_TAG, "IplImage.create");
       }

       recorder = new FFmpegFrameRecorder(ffmpeg_link, imageWidth, imageHeight, 1);
       Log.v(LOG_TAG, "FFmpegFrameRecorder: " + ffmpeg_link + " imageWidth: " + imageWidth + " imageHeight " + imageHeight);

       recorder.setFormat("flv");
       Log.v(LOG_TAG, "recorder.setFormat(\"flv\")");

       recorder.setSampleRate(sampleAudioRateInHz);
       Log.v(LOG_TAG, "recorder.setSampleRate(sampleAudioRateInHz)");

       // re-set in the surface changed method as well
       recorder.setFrameRate(frameRate);
       Log.v(LOG_TAG, "recorder.setFrameRate(frameRate)");

       // Create audio recording thread
       audioRecordRunnable = new AudioRecordRunnable();
       audioThread = new Thread(audioRecordRunnable);
    }

    // Start the capture
    public void startRecording() {
       try {
           recorder.start();
           startTime = System.currentTimeMillis();
           recording = true;
           audioThread.start();
       } catch (FFmpegFrameRecorder.Exception e) {
           e.printStackTrace();
       }
    }

    public void stopRecording() {
       // This should stop the audio thread from running
       runAudioThread = false;

       if (recorder != null && recording) {
           recording = false;
           Log.v(LOG_TAG,"Finishing recording, calling stop and release on recorder");
           try {
               recorder.stop();
               recorder.release();
           } catch (FFmpegFrameRecorder.Exception e) {
               e.printStackTrace();
           }
           recorder = null;
       }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       // Quit when back button is pushed
       if (keyCode == KeyEvent.KEYCODE_BACK) {
           if (recording) {
               stopRecording();
           }
           finish();
           return true;
       }
       return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onClick(View v) {
       if (!recording) {
           startRecording();
           Log.w(LOG_TAG, "Start Button Pushed");
           recordButton.setText("Stop");
       } else {
           stopRecording();
           Log.w(LOG_TAG, "Stop Button Pushed");
           recordButton.setText("Start");
       }
    }

    //---------------------------------------------
    // audio thread, gets and encodes audio data
    //---------------------------------------------
    class AudioRecordRunnable implements Runnable {

       @Override
       public void run() {
           // Set the thread priority
           android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

           // Audio
           int bufferSize;
           short[] audioData;
           int bufferReadResult;

           bufferSize = AudioRecord.getMinBufferSize(sampleAudioRateInHz,
                   AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
           audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleAudioRateInHz,
                   AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

           audioData = new short[bufferSize];

           Log.d(LOG_TAG, "audioRecord.startRecording()");
           audioRecord.startRecording();

           // Audio Capture/Encoding Loop
           while (runAudioThread) {
               // Read from audioRecord
               bufferReadResult = audioRecord.read(audioData, 0, audioData.length);
               if (bufferReadResult > 0) {
                   //Log.v(LOG_TAG,"audioRecord bufferReadResult: " + bufferReadResult);

                   // Changes in this variable may not be picked up despite it being "volatile"
                   if (recording) {
                       try {
                           // Write to FFmpegFrameRecorder
                           Buffer[] buffer = {ShortBuffer.wrap(audioData, 0, bufferReadResult)};                        
                           recorder.record(buffer);
                       } catch (FFmpegFrameRecorder.Exception e) {
                           Log.v(LOG_TAG,e.getMessage());
                           e.printStackTrace();
                       }
                   }
               }
           }
           Log.v(LOG_TAG,"AudioThread Finished");

           /* Capture/Encoding finished, release recorder */
           if (audioRecord != null) {
               audioRecord.stop();
               audioRecord.release();
               audioRecord = null;
               Log.v(LOG_TAG,"audioRecord released");
           }
       }
    }

    class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {

       private boolean previewRunning = false;

       private SurfaceHolder holder;
       private Camera camera;

       private byte[] previewBuffer;

       long videoTimestamp = 0;

       Bitmap bitmap;
       Canvas canvas;

       public CameraView(Context _context) {
           super(_context);

           holder = this.getHolder();
           holder.addCallback(this);
           holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
       }

       @Override
       public void surfaceCreated(SurfaceHolder holder) {
           camera = Camera.open();

           try {
               camera.setPreviewDisplay(holder);
               camera.setPreviewCallback(this);

               Camera.Parameters currentParams = camera.getParameters();
               Log.v(LOG_TAG,"Preview Framerate: " + currentParams.getPreviewFrameRate());
               Log.v(LOG_TAG,"Preview imageWidth: " + currentParams.getPreviewSize().width + " imageHeight: " + currentParams.getPreviewSize().height);

               // Use these values
               imageWidth = currentParams.getPreviewSize().width;
               imageHeight = currentParams.getPreviewSize().height;
               frameRate = currentParams.getPreviewFrameRate();                

               bitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ALPHA_8);


               /*
               Log.v(LOG_TAG,"Creating previewBuffer size: " + imageWidth * imageHeight * ImageFormat.getBitsPerPixel(currentParams.getPreviewFormat())/8);
               previewBuffer = new byte[imageWidth * imageHeight * ImageFormat.getBitsPerPixel(currentParams.getPreviewFormat())/8];
               camera.addCallbackBuffer(previewBuffer);
               camera.setPreviewCallbackWithBuffer(this);
               */              

               camera.startPreview();
               previewRunning = true;
           }
           catch (IOException e) {
               Log.v(LOG_TAG,e.getMessage());
               e.printStackTrace();
           }  
       }

       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
           Log.v(LOG_TAG,"Surface Changed: width " + width + " height: " + height);

           // We would do this if we want to reset the camera parameters
           /*
           if (!recording) {
               if (previewRunning){
                   camera.stopPreview();
               }
               try {
                   //Camera.Parameters cameraParameters = camera.getParameters();
                   //p.setPreviewSize(imageWidth, imageHeight);
                   //p.setPreviewFrameRate(frameRate);
                   //camera.setParameters(cameraParameters);

                   camera.setPreviewDisplay(holder);
                   camera.startPreview();
                   previewRunning = true;
               }
               catch (IOException e) {
                   Log.e(LOG_TAG,e.getMessage());
                   e.printStackTrace();
               }  
           }            
           */

           // Get the current parameters
           Camera.Parameters currentParams = camera.getParameters();
           Log.v(LOG_TAG,"Preview Framerate: " + currentParams.getPreviewFrameRate());
           Log.v(LOG_TAG,"Preview imageWidth: " + currentParams.getPreviewSize().width + " imageHeight: " + currentParams.getPreviewSize().height);

           // Use these values
           imageWidth = currentParams.getPreviewSize().width;
           imageHeight = currentParams.getPreviewSize().height;
           frameRate = currentParams.getPreviewFrameRate();

           // Create the yuvIplimage if needed
           yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
           //yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_32S, 2);
       }

       @Override
       public void surfaceDestroyed(SurfaceHolder holder) {
           try {
               camera.setPreviewCallback(null);

               previewRunning = false;
               camera.release();

           } catch (RuntimeException e) {
               Log.v(LOG_TAG,e.getMessage());
               e.printStackTrace();
           }
       }

       @Override
       public void onPreviewFrame(byte[] data, Camera camera) {

           if (yuvIplimage != null && recording) {
               videoTimestamp = 1000 * (System.currentTimeMillis() - startTime);

               // Put the camera preview frame right into the yuvIplimage object
               yuvIplimage.getByteBuffer().put(data);

               // FAQ about IplImage:
               // - For custom raw processing of data, getByteBuffer() returns an NIO direct
               //   buffer wrapped around the memory pointed by imageData, and under Android we can
               //   also use that Buffer with Bitmap.copyPixelsFromBuffer() and copyPixelsToBuffer().
               // - To get a BufferedImage from an IplImage, we may call getBufferedImage().
               // - The createFrom() factory method can construct an IplImage from a BufferedImage.
               // - There are also a few copy*() methods for BufferedImage<->IplImage data transfers.

               // Let's try it..
               // This works but only on transparency
               // Need to find the right Bitmap and IplImage matching types

               /*
               bitmap.copyPixelsFromBuffer(yuvIplimage.getByteBuffer());
               //bitmap.setPixel(10,10,Color.MAGENTA);

               canvas = new Canvas(bitmap);
               Paint paint = new Paint();
               paint.setColor(Color.GREEN);
               float leftx = 20;
               float topy = 20;
               float rightx = 50;
               float bottomy = 100;
               RectF rectangle = new RectF(leftx,topy,rightx,bottomy);
               canvas.drawRect(rectangle, paint);

               bitmap.copyPixelsToBuffer(yuvIplimage.getByteBuffer());
               */
               //Log.v(LOG_TAG,"Writing Frame");

               try {

                   // Get the correct time
                   recorder.setTimestamp(videoTimestamp);

                   // Record the image into FFmpegFrameRecorder
                   recorder.record(yuvIplimage);

               } catch (FFmpegFrameRecorder.Exception e) {
                   Log.v(LOG_TAG,e.getMessage());
                   e.printStackTrace();
               }
           }
       }
    }

    }

  • squeeze image while capturing video with FFmpegFrameRecorder

    12 avril 2016, par Saty

    I am trying to stream video with FFmpegFrameRecorder using javacv. All are working great except I find videos which are actually images are bit squeeze from the height.

    I am using the below code which half of the internet community is using to live stream

    public class MainActivity extends Activity implements OnClickListener {

    private final static String LOG_TAG = "MainActivity";

    private PowerManager.WakeLock mWakeLock;

    private String ffmpeg_link = "rtmp://username:password@xxx.xxx.xxx.xxx:1935/live/test.flv";
    //private String ffmpeg_link = "/mnt/sdcard/new_stream.flv";

    private volatile FFmpegFrameRecorder recorder;
    boolean recording = false;
    long startTime = 0;

    private int sampleAudioRateInHz = 44100;
    private int imageWidth = 320;
    private int imageHeight = 240;
    private int frameRate = 30;

    private Thread audioThread;
    volatile boolean runAudioThread = true;
    private AudioRecord audioRecord;
    private AudioRecordRunnable audioRecordRunnable;

    private CameraView cameraView;
    private IplImage yuvIplimage = null;

    private Button recordButton;
    private LinearLayout mainLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
       setContentView(R.layout.activity_main);

       initLayout();
       initRecorder();
    }

    @Override
    protected void onResume() {
       super.onResume();

       if (mWakeLock == null) {
           PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
           mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, LOG_TAG);
           mWakeLock.acquire();
       }
    }

    @Override
    protected void onPause() {
       super.onPause();

       if (mWakeLock != null) {
           mWakeLock.release();
           mWakeLock = null;
       }
    }

    @Override
    protected void onDestroy() {
       super.onDestroy();

       recording = false;
    }


    private void initLayout() {

       mainLayout = (LinearLayout) this.findViewById(R.id.record_layout);

       recordButton = (Button) findViewById(R.id.recorder_control);
       recordButton.setText("Start");
       recordButton.setOnClickListener(this);

       cameraView = new CameraView(this);

       LinearLayout.LayoutParams layoutParam = new LinearLayout.LayoutParams(imageWidth, imageHeight);        
       mainLayout.addView(cameraView, layoutParam);
       Log.v(LOG_TAG, "added cameraView to mainLayout");
    }

    private void initRecorder() {
       Log.w(LOG_TAG,"initRecorder");

       if (yuvIplimage == null) {
           // Recreated after frame size is set in surface change method
           yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
           //yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_32S, 2);

           Log.v(LOG_TAG, "IplImage.create");
       }

       recorder = new FFmpegFrameRecorder(ffmpeg_link, imageWidth, imageHeight, 1);
       Log.v(LOG_TAG, "FFmpegFrameRecorder: " + ffmpeg_link + " imageWidth: " + imageWidth + " imageHeight " + imageHeight);

       recorder.setFormat("flv");
       Log.v(LOG_TAG, "recorder.setFormat(\"flv\")");

       recorder.setSampleRate(sampleAudioRateInHz);
       Log.v(LOG_TAG, "recorder.setSampleRate(sampleAudioRateInHz)");

       // re-set in the surface changed method as well
       recorder.setFrameRate(frameRate);
       Log.v(LOG_TAG, "recorder.setFrameRate(frameRate)");

       // Create audio recording thread
       audioRecordRunnable = new AudioRecordRunnable();
       audioThread = new Thread(audioRecordRunnable);
    }

    // Start the capture
    public void startRecording() {
       try {
           recorder.start();
           startTime = System.currentTimeMillis();
           recording = true;
           audioThread.start();
       } catch (FFmpegFrameRecorder.Exception e) {
           e.printStackTrace();
       }
    }

    public void stopRecording() {
       // This should stop the audio thread from running
       runAudioThread = false;

       if (recorder != null && recording) {
           recording = false;
           Log.v(LOG_TAG,"Finishing recording, calling stop and release on recorder");
           try {
               recorder.stop();
               recorder.release();
           } catch (FFmpegFrameRecorder.Exception e) {
               e.printStackTrace();
           }
           recorder = null;
       }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       // Quit when back button is pushed
       if (keyCode == KeyEvent.KEYCODE_BACK) {
           if (recording) {
               stopRecording();
           }
           finish();
           return true;
       }
       return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onClick(View v) {
       if (!recording) {
           startRecording();
           Log.w(LOG_TAG, "Start Button Pushed");
           recordButton.setText("Stop");
       } else {
           stopRecording();
           Log.w(LOG_TAG, "Stop Button Pushed");
           recordButton.setText("Start");
       }
    }

    //---------------------------------------------
    // audio thread, gets and encodes audio data
    //---------------------------------------------
    class AudioRecordRunnable implements Runnable {

       @Override
       public void run() {
           // Set the thread priority
           android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

           // Audio
           int bufferSize;
           short[] audioData;
           int bufferReadResult;

           bufferSize = AudioRecord.getMinBufferSize(sampleAudioRateInHz,
                   AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
           audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleAudioRateInHz,
                   AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

           audioData = new short[bufferSize];

           Log.d(LOG_TAG, "audioRecord.startRecording()");
           audioRecord.startRecording();

           // Audio Capture/Encoding Loop
           while (runAudioThread) {
               // Read from audioRecord
               bufferReadResult = audioRecord.read(audioData, 0, audioData.length);
               if (bufferReadResult > 0) {
                   //Log.v(LOG_TAG,"audioRecord bufferReadResult: " + bufferReadResult);

                   // Changes in this variable may not be picked up despite it being "volatile"
                   if (recording) {
                       try {
                           // Write to FFmpegFrameRecorder
                           Buffer[] buffer = {ShortBuffer.wrap(audioData, 0, bufferReadResult)};                        
                           recorder.record(buffer);
                       } catch (FFmpegFrameRecorder.Exception e) {
                           Log.v(LOG_TAG,e.getMessage());
                           e.printStackTrace();
                       }
                   }
               }
           }
           Log.v(LOG_TAG,"AudioThread Finished");

           /* Capture/Encoding finished, release recorder */
           if (audioRecord != null) {
               audioRecord.stop();
               audioRecord.release();
               audioRecord = null;
               Log.v(LOG_TAG,"audioRecord released");
           }
       }
    }

    class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {

       private boolean previewRunning = false;

       private SurfaceHolder holder;
       private Camera camera;

       private byte[] previewBuffer;

       long videoTimestamp = 0;

       Bitmap bitmap;
       Canvas canvas;

       public CameraView(Context _context) {
           super(_context);

           holder = this.getHolder();
           holder.addCallback(this);
           holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
       }

       @Override
       public void surfaceCreated(SurfaceHolder holder) {
           camera = Camera.open();

           try {
               camera.setPreviewDisplay(holder);
               camera.setPreviewCallback(this);

               Camera.Parameters currentParams = camera.getParameters();
               Log.v(LOG_TAG,"Preview Framerate: " + currentParams.getPreviewFrameRate());
               Log.v(LOG_TAG,"Preview imageWidth: " + currentParams.getPreviewSize().width + " imageHeight: " + currentParams.getPreviewSize().height);

               // Use these values
               imageWidth = currentParams.getPreviewSize().width;
               imageHeight = currentParams.getPreviewSize().height;
               frameRate = currentParams.getPreviewFrameRate();                

               bitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ALPHA_8);


               /*
               Log.v(LOG_TAG,"Creating previewBuffer size: " + imageWidth * imageHeight * ImageFormat.getBitsPerPixel(currentParams.getPreviewFormat())/8);
               previewBuffer = new byte[imageWidth * imageHeight * ImageFormat.getBitsPerPixel(currentParams.getPreviewFormat())/8];
               camera.addCallbackBuffer(previewBuffer);
               camera.setPreviewCallbackWithBuffer(this);
               */              

               camera.startPreview();
               previewRunning = true;
           }
           catch (IOException e) {
               Log.v(LOG_TAG,e.getMessage());
               e.printStackTrace();
           }  
       }

       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
           Log.v(LOG_TAG,"Surface Changed: width " + width + " height: " + height);

           // We would do this if we want to reset the camera parameters
           /*
           if (!recording) {
               if (previewRunning){
                   camera.stopPreview();
               }
               try {
                   //Camera.Parameters cameraParameters = camera.getParameters();
                   //p.setPreviewSize(imageWidth, imageHeight);
                   //p.setPreviewFrameRate(frameRate);
                   //camera.setParameters(cameraParameters);

                   camera.setPreviewDisplay(holder);
                   camera.startPreview();
                   previewRunning = true;
               }
               catch (IOException e) {
                   Log.e(LOG_TAG,e.getMessage());
                   e.printStackTrace();
               }  
           }            
           */

           // Get the current parameters
           Camera.Parameters currentParams = camera.getParameters();
           Log.v(LOG_TAG,"Preview Framerate: " + currentParams.getPreviewFrameRate());
           Log.v(LOG_TAG,"Preview imageWidth: " + currentParams.getPreviewSize().width + " imageHeight: " + currentParams.getPreviewSize().height);

           // Use these values
           imageWidth = currentParams.getPreviewSize().width;
           imageHeight = currentParams.getPreviewSize().height;
           frameRate = currentParams.getPreviewFrameRate();

           // Create the yuvIplimage if needed
           yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
           //yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_32S, 2);
       }

       @Override
       public void surfaceDestroyed(SurfaceHolder holder) {
           try {
               camera.setPreviewCallback(null);

               previewRunning = false;
               camera.release();

           } catch (RuntimeException e) {
               Log.v(LOG_TAG,e.getMessage());
               e.printStackTrace();
           }
       }

       @Override
       public void onPreviewFrame(byte[] data, Camera camera) {

           if (yuvIplimage != null && recording) {
               videoTimestamp = 1000 * (System.currentTimeMillis() - startTime);

               // Put the camera preview frame right into the yuvIplimage object
               yuvIplimage.getByteBuffer().put(data);

               // FAQ about IplImage:
               // - For custom raw processing of data, getByteBuffer() returns an NIO direct
               //   buffer wrapped around the memory pointed by imageData, and under Android we can
               //   also use that Buffer with Bitmap.copyPixelsFromBuffer() and copyPixelsToBuffer().
               // - To get a BufferedImage from an IplImage, we may call getBufferedImage().
               // - The createFrom() factory method can construct an IplImage from a BufferedImage.
               // - There are also a few copy*() methods for BufferedImage<->IplImage data transfers.

               // Let's try it..
               // This works but only on transparency
               // Need to find the right Bitmap and IplImage matching types

               /*
               bitmap.copyPixelsFromBuffer(yuvIplimage.getByteBuffer());
               //bitmap.setPixel(10,10,Color.MAGENTA);

               canvas = new Canvas(bitmap);
               Paint paint = new Paint();
               paint.setColor(Color.GREEN);
               float leftx = 20;
               float topy = 20;
               float rightx = 50;
               float bottomy = 100;
               RectF rectangle = new RectF(leftx,topy,rightx,bottomy);
               canvas.drawRect(rectangle, paint);

               bitmap.copyPixelsToBuffer(yuvIplimage.getByteBuffer());
               */
               //Log.v(LOG_TAG,"Writing Frame");

               try {

                   // Get the correct time
                   recorder.setTimestamp(videoTimestamp);

                   // Record the image into FFmpegFrameRecorder
                   recorder.record(yuvIplimage);

               } catch (FFmpegFrameRecorder.Exception e) {
                   Log.v(LOG_TAG,e.getMessage());
                   e.printStackTrace();
               }
           }
       }
    }

    }

  • ffmpeg android concatenation with different codec [on hold]

    31 mars 2016, par raphwilmes

    I’m trying to concatenate 10 videos, but 5 of them have
    Stream #0:0(und) : Video : h264 (High) (avc1 / 0x31637661), yuv420p, 600x976 [SAR 1:1 DAR 75:122], 17 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

    And the rest have
    Stream #1:0(eng) : Video : h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x480x 175 kb/s, SAR 65536:65536 DAR 4:3, 7.69frp, 23.08 tbr, 90k tbn, 15tbc (default)

    And my code is :

    String commandForMerge = "";
    for(int i = 1; i<=numberQuestion;i++){
       commandForMerge += "-i "+toDir+"/image"+i+".mp4 -i "+toDir+"/"+i+".mp4 ";
    }
    String cmd = commandForMerge+"-filter_complex concat=n=10:v=1:a=1 -y "+toDir+"/input.mp4";
    execFFmpegBinaryMerge(cmd);

    Here my fonction :

    private void execFFmpegBinaryMerge(final String command) {
       try {

           ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
               @Override
               public void onFailure(String s) {
               }

               @Override
               public void onSuccess(String s) {
               }

               @Override
               public void onProgress(String s) {
                   txtProcess.setText(txtProcess.getText()+"\n "+s.toString());
               }

               @Override
               public void onStart() {
                   txtProcess.setText("mise en place...");
               }

               @Override
               public void onFinish() {

               }
           });
       } catch (FFmpegCommandAlreadyRunningException e) {
           // do nothing for now
       }
    }

    I use this library : https://github.com/WritingMinds/ffmpeg-android-java

    Edit :

    Now, I’v this : Unable to find a suitable output format for ’[1:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v1] ;’ Invalid Agurment

    My Command is : *ffmpeg -i image1.mp4 -i 1.mp4 -i image2.mp4 -i 2.mp4 -i image3.mp4 -i 3.mp4.mp4 -i image4.mp4 -i 4.mp4 -i image5.mp4 -i .mp4

    - filter-complex
    "[0:v]scale=-1:480,pad=640:0 :(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v0] ;
    [1:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v1] ;
    [2:v]scale=-1:480,pad=640:0 :(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v2] ;
    [3:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v3] ;
    [4:v]scale=-1:480,pad=640:0 :(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v4] ;
    [5:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v5] ;
    [6:v]scale=-1:480,pad=640:0 :(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v6] ;
    [7:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v7] ;
    [8:v]scale=-1:480,pad=640:0 :(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v8] ;
    [9:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v9] ;"
    ’[v0][0:a][v1][1:a][v2][2:a][v3][3:a][v4][4:a][v5][5:a][v6][6:a][v7][7:a][v8][8:a][v9][9:a]’ concat=n=10:v=1:a=1 -y output.mp4
    *

    Now the "[0:v]scale=-1:480,pad=640:0 :(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v0] ;" pass but not the [1:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v1] ;

    output :

    WARINING:linker : /data/data/vrapp_mobile.com.duoquiz2/files/ffmpeg has text relocation. This is wasting memory and is security risk. Please fix.
    ffmpeg version n2.4.2 Copyright (c) 2000-2014 the FFmpeg developpers built on Oct 7 2014 15:08:46 with gcc 4.8 (GCC)
    configuration :—target-os=linux —cross-prefix=/home/sb/Source-Code/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- —arm=arm —cpu=cortex-a8 —enable-runtime-cpudetect —sysroot=/home/sb/Source-Code/ffmpeg-android/toolchain-android/sysroot —enable-pic—enable-libx264 —enable-libass —enable-libfreetype —enable-libfrididi —enable-fontconfig —enable-pthreads —disable-debug —disable-ffserver —enable-version3 —enable-hardcored-tables —disable-ffplay —disable-ffprobe —enable-gpl —enable-yasm —disable-doc —disable-shared —enable-static —pjg-config=/home/sb/Source-Code/ffmpeg-android/ffmpeg-pkg-config —prefix=/home/sb/Source-Code/ffmpeg-android/build/armeabi-v7a-neon —extra-cflags=’-l/home/sb/Source-Code/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protextor-all -mfpu=neon’ —extra-ldflags=’-L/home/sb/Source-Code/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,now -pie’ —extra-libs=’-lpng -lexpat -lm’ —extra-cxxflags =
    libavutil 54. 7.100/54. 7.100
    libavcodec 56 1.100/56. 1.100
    libavformat 56. 4.101/56. 4.101
    libavdevice 56. 0.100/56. 0.100
    libavfilter 5. 1.100/5. 1.100
    libswscale 3. 0.100/3. 0.100
    libswresample 1. 1.100/1. 1.100
    libpostproc 53. 0.100/53. 0.100
    Input #0,mov,mp4,m4a,3gp,mj2, from ’/storage/emulated/0/DuoQuiz/image1.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :512
    compatible_brands:isomiso2avc1mp41
    encoder :Lavf56.4.101
    Duration : 00:00:02.40, start : 0.023021 , bitrate : 334 kb/s
    Stream #0:0(und) : Video : h264 (High) (avc1 / 0x31637661), yuv420p, 600x976 [SAR 1:1 DAR 75:122], 17 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata :
    handler_name : VideoHandler
    Stream #0:1(und) : Audio.mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 320 kb/s (default)
    Metadata :
    handler_name :SoundHandler
    Input #1,mov,mp4,m4a,3gp,3g2,mj2, from ’/storage/emulated/0/DuoQuiz/1.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :0
    compatible_brands:isom3gp4
    creation_time :2016-03-21 16:05:25
    Duration : 00:00:02.73, start : 0.000000, bitrate : 229 kb/s
    Stream #1:0(eng) : Video : h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x480x 175 kb/s, SAR 65536:65536 DAR 4:3, 7.69frp, 23.08 tbr, 90k tbn, 15tbc (default)
    Metadata :
    rotate :270
    creation_time :2016-03-21 16:05:25
    handler_name :VideoHandle
    Side data :
    displaymatrix : rotation of 90.00 degrees
    Stream #1:1(eng) : Audio : aac (mp4a / 0x6134706D),44100 Hz, mono, fltp, 49 kb/s (default)
    Metadata :
    creation_time :2016-03-21 16:05:25
    handler_name :SoundHandle
    Input #2,mov,mp4,m4a,3gp,mj2, from ’/storage/emulated/0/DuoQuiz/image2.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :512
    compatible_brands:isomiso2avc1mp41
    encoder :Lavf56.4.101
    Duration : 00:00:02.40, start : 0.023021 , bitrate : 334 kb/s
    Stream #0:0(und) : Video : h264 (High) (avc1 / 0x31637661), yuv420p, 600x976 [SAR 1:1 DAR 75:122], 17 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata :
    handler_name : VideoHandler
    Stream #0:1(und) : Audio.mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 320 kb/s (default)
    Metadata :
    handler_name :SoundHandler
    Input #3,mov,mp4,m4a,3gp,3g2,mj2, from ’/storage/emulated/0/DuoQuiz/2.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :0
    compatible_brands:isom3gp4
    creation_time :2016-03-21 16:05:25
    Duration : 00:00:02.73, start : 0.000000, bitrate : 229 kb/s
    Stream #1:0(eng) : Video : h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x480x 175 kb/s, SAR 65536:65536 DAR 4:3, 7.69frp, 23.08 tbr, 90k tbn, 15tbc (default)
    Metadata :
    rotate :270
    creation_time :2016-03-21 16:05:25
    handler_name :VideoHandle
    Side data :
    displaymatrix : rotation of 90.00 degrees
    Stream #1:1(eng) : Audio : aac (mp4a / 0x6134706D),44100 Hz, mono, fltp, 49 kb/s (default)
    Metadata :
    creation_time :2016-03-21 16:05:25
    handler_name :SoundHandle
    Input #4,mov,mp4,m4a,3gp,mj2, from ’/storage/emulated/0/DuoQuiz/image3.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :512
    compatible_brands:isomiso2avc1mp41
    encoder :Lavf56.4.101
    Duration : 00:00:02.40, start : 0.023021 , bitrate : 334 kb/s
    Stream #0:0(und) : Video : h264 (High) (avc1 / 0x31637661), yuv420p, 600x976 [SAR 1:1 DAR 75:122], 17 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata :
    handler_name : VideoHandler
    Stream #0:1(und) : Audio.mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 320 kb/s (default)
    Metadata :
    handler_name :SoundHandler
    Input #5,mov,mp4,m4a,3gp,3g2,mj2, from ’/storage/emulated/0/DuoQuiz/3.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :0
    compatible_brands:isom3gp4
    creation_time :2016-03-21
    Duration : 00:00:02.73, start : 0.000000, bitrate : 229 kb/s
    Stream #1:0(eng) : Video : h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x480x 175 kb/s, SAR 65536:65536 DAR 4:3, 7.69frp, 23.08 tbr, 90k tbn, 15tbc (default)
    Metadata :
    rotate :270
    creation_time :2016-03-2116:05:25
    handler_name :VideoHandle
    Side data :
    displaymatrix : rotation of 90.00 degrees
    Stream #1:1(eng) : Audio : aac (mp4a / 0x6134706D),44100 Hz, mono, fltp, 49 kb/s (default)
    Metadata :
    creation_time :2016-03-21 16:05:25
    handler_name :SoundHandle
    Input #6,mov,mp4,m4a,3gp,mj2, from ’/storage/emulated/0/DuoQuiz/image4.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :512
    compatible_brands:isomiso2avc1mp41
    encoder :Lavf56.4.101
    Duration : 00:00:02.40, start : 0.023021 , bitrate : 334 kb/s
    Stream #0:0(und) : Video : h264 (High) (avc1 / 0x31637661), yuv420p, 600x976 [SAR 1:1 DAR 75:122], 17 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata :
    handler_name : VideoHandler
    Stream #0:1(und) : Audio.mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 320 kb/s (default)
    Metadata :
    handler_name :SoundHandler
    Input #7,mov,mp4,m4a,3gp,3g2,mj2, from ’/storage/emulated/0/DuoQuiz/4.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :0
    compatible_brands:isom3gp4
    creation_time :2016-03-21
    Duration : 00:00:02.73, start : 0.000000, bitrate : 229 kb/s
    Stream #1:0(eng) : Video : h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x480x 175 kb/s, SAR 65536:65536 DAR 4:3, 7.69frp, 23.08 tbr, 90k tbn, 15tbc (default)
    Metadata :
    rotate :270
    creation_time :2016-03-2116:05:25
    handler_name :VideoHandle
    Side data :
    displaymatrix : rotation of 90.00 degrees
    Stream #1:1(eng) : Audio : aac (mp4a / 0x6134706D),44100 Hz, mono, fltp, 49 kb/s (default)
    Metadata :
    creation_time :2016-03-21 16:05:25
    handler_name :SoundHandle
    Input #8,mov,mp4,m4a,3gp,mj2, from ’/storage/emulated/0/DuoQuiz/image5.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :512
    compatible_brands:isomiso2avc1mp41
    encoder :Lavf56.4.101
    Duration : 00:00:02.40, start : 0.023021 , bitrate : 334 kb/s
    Stream #0:0(und) : Video : h264 (High) (avc1 / 0x31637661), yuv420p, 600x976 [SAR 1:1 DAR 75:122], 17 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata :
    handler_name : VideoHandler
    Stream #0:1(und) : Audio.mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 320 kb/s (default)
    Metadata :
    handler_name :SoundHandler
    Input #9,mov,mp4,m4a,3gp,3g2,mj2, from ’/storage/emulated/0/DuoQuiz/5.mp4’ :
    Metadata :
    major_brand :isom
    minor_version :0
    compatible_brands:isom3gp4
    creation_time :2016-03-21
    Duration : 00:00:02.73, start : 0.000000, bitrate : 229 kb/s
    Stream #1:0(eng) : Video : h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x480x 175 kb/s, SAR 65536:65536 DAR 4:3, 7.69frp, 23.08 tbr, 90k tbn, 15tbc (default)
    Metadata :
    rotate :270
    creation_time :2016-03-2116:05:25
    handler_name :VideoHandle
    Side data :
    displaymatrix : rotation of 90.00 degrees
    Stream #1:1(eng) : Audio : aac (mp4a / 0x6134706D),44100 Hz, mono, fltp, 49 kb/s (default)
    Metadata :
    creation_time :2016-03-21 16:05:25
    handler_name :SoundHandle
    [AVFilterGraph @ 0x2b5b2e10] No such filter : ""
    Error configuring filter
    *

    On my computer, i try this command :

    -i image1.mp4 -i 1.mp4 -i image2.mp4 -i 2.mp4 -i image3.mp4 -i 3.mp4 -i image4.mp4 -i 4.mp4 -i image5.mp4 -i 5.mp4 -filter_complex "[0:v]scale=-1:480,pad=640:0:(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v0]; [1:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v1]; [2:v]scale=-1:480,pad=640:0:(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v2]; [3:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v3]; [4:v]scale=-1:480,pad=640:0:(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v4]; [5:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v5]; [6:v]scale=-1:480,pad=640:0:(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v6]; [7:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v7]; [8:v]scale=-1:480,pad=640:0:(ow-iw)/2,setsar=1,setpts=PTS-STARTPTS[v8]; [9:v]fps=25,setsar=1,setpts=PTS-STARTPTS[v9]; [v0][0:a][v1][1:a][v2][2:a][v3][3:a][v4][4:a][v5][5:a][v6][6:a][v7][7:a][v8][8:a][v9][9:a] concat=n=10:v=1:a=1" -y output.mp4

    That’s ok on my PC but not on my Android