Recherche avancée

Médias (0)

Mot : - Tags -/upload

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (53)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • Support de tous types de médias

    10 avril 2011

    Contrairement à beaucoup de logiciels et autres plate-formes modernes de partage de documents, MediaSPIP a l’ambition de gérer un maximum de formats de documents différents qu’ils soient de type : images (png, gif, jpg, bmp et autres...) ; audio (MP3, Ogg, Wav et autres...) ; vidéo (Avi, MP4, Ogv, mpg, mov, wmv et autres...) ; contenu textuel, code ou autres (open office, microsoft office (tableur, présentation), web (html, css), LaTeX, Google Earth) (...)

Sur d’autres sites (10052)

  • How do I use native C libraries in Android Studio

    11 mars 2015, par Nicholas

    I created a problem some years back based on https://ikaruga2.wordpress.com/2011/06/15/video-live-wallpaper-part-1/. My project was built in the version of Eclipse provided directly by Google at the time and worked fine with a copy of the compiled ffmpeg libraries created with my app name.

    Now I’m trying to create a new app based on my old app. As Google no longer supports Eclipse I downloaded Android Studio and imported my project. With a few tweaks, I was able to successfully compile the old version of the project. So I modified the name, copied a new set of ".so" files into app\src\main\jniLibs\armeabi (where I assumed they should go) and tried running the application on my phone again with absolutely no other changes.

    The NDK throws no errors. Gradle compiles the file without errors and installs it on my phone. The app appears in my live wallpapers list and I can click it to bring up the preview. But instead of a video appearing I receive and error and logCat reports :

    02-26 21:50:31.164  18757-18757/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.ExceptionInInitializerError
           at com.nightscapecreations.anim3free.VideoLiveWallpaper.onSharedPreferenceChanged(VideoLiveWallpaper.java:165)
           at com.nightscapecreations.anim3free.VideoLiveWallpaper.onCreate(VideoLiveWallpaper.java:81)
           at android.app.ActivityThread.handleCreateService(ActivityThread.java:2273)
           at android.app.ActivityThread.access$1600(ActivityThread.java:127)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
           at android.os.Handler.dispatchMessage(Handler.java:99)
           at android.os.Looper.loop(Looper.java:137)
           at android.app.ActivityThread.main(ActivityThread.java:4441)
           at java.lang.reflect.Method.invokeNative(Native Method)
           at java.lang.reflect.Method.invoke(Method.java:511)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
           at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]:   144 could not load needed library '/data/data/com.nightscapecreations.anim1free/lib/libavutil.so' for 'libavcore.so' (load_library[1091]: Library '/data/data/com.nightscapecreations.anim1free/lib/libavutil.so' not found)
           at java.lang.Runtime.loadLibrary(Runtime.java:370)
           at java.lang.System.loadLibrary(System.java:535)
           at com.nightscapecreations.anim3free.NativeCalls.<clinit>(NativeCalls.java:64)
           at com.nightscapecreations.anim3free.VideoLiveWallpaper.onSharedPreferenceChanged(VideoLiveWallpaper.java:165)
           at com.nightscapecreations.anim3free.VideoLiveWallpaper.onCreate(VideoLiveWallpaper.java:81)
           at android.app.ActivityThread.handleCreateService(ActivityThread.java:2273)
           at android.app.ActivityThread.access$1600(ActivityThread.java:127)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
           at android.os.Handler.dispatchMessage(Handler.java:99)
           at android.os.Looper.loop(Looper.java:137)
           at android.app.ActivityThread.main(ActivityThread.java:4441)
           at java.lang.reflect.Method.invokeNative(Native Method)
           at java.lang.reflect.Method.invoke(Method.java:511)
    </clinit>

    I’m a novice Android/Java/C++ developer and am not sure what this error means, but Google leads me to believe that my new libraries are not being found. In my Eclipse project I had this set of libraries in "libs\armeabi", and another copy of them in a more complicated folder structure at "jni\ffmpeg-android\build\ffmpeg\armeabi\lib". Android Studio appears to have kept everything the same, other than renaming "libs" to "jniLibs", but I’m hitting a brick wall with this error and am unsure how to proceed.

    How can I compile this new app with the new name using Android Studio ?

    In case it helps here is my Android.mk file :

       LOCAL_PATH := $(call my-dir)

       include $(CLEAR_VARS)
       MY_LIB_PATH := ffmpeg-android/build/ffmpeg/armeabi/lib
       LOCAL_MODULE := bambuser-libavcore
       LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavcore.so
       include $(PREBUILT_SHARED_LIBRARY)

       include $(CLEAR_VARS)
       LOCAL_MODULE := bambuser-libavformat
       LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavformat.so
       include $(PREBUILT_SHARED_LIBRARY)

       include $(CLEAR_VARS)
       LOCAL_MODULE := bambuser-libavcodec
       LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavcodec.so
       include $(PREBUILT_SHARED_LIBRARY)

       include $(CLEAR_VARS)
       LOCAL_MODULE := bambuser-libavfilter
       LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavfilter.so
       include $(PREBUILT_SHARED_LIBRARY)

       include $(CLEAR_VARS)
       LOCAL_MODULE := bambuser-libavutil
       LOCAL_SRC_FILES := $(MY_LIB_PATH)/libavutil.so
       include $(PREBUILT_SHARED_LIBRARY)

       include $(CLEAR_VARS)
       LOCAL_MODULE := bambuser-libswscale
       LOCAL_SRC_FILES := $(MY_LIB_PATH)/libswscale.so
       include $(PREBUILT_SHARED_LIBRARY)

       #local_PATH := $(call my-dir)

       include $(CLEAR_VARS)

       LOCAL_CFLAGS := -DANDROID_NDK \
                       -DDISABLE_IMPORTGL

       LOCAL_MODULE    := video
       LOCAL_SRC_FILES := video.c

       LOCAL_C_INCLUDES := \
           $(LOCAL_PATH)/include \
           $(LOCAL_PATH)/ffmpeg-android/ffmpeg \
           $(LOCAL_PATH)/freetype/include/freetype2 \
           $(LOCAL_PATH)/freetype/include \
           $(LOCAL_PATH)/ftgl/src \
           $(LOCAL_PATH)/ftgl
       LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -L$(LOCAL_PATH)/ffmpeg-android/build/ffmpeg/armeabi/lib/ -lGLESv1_CM -ldl -lavformat -lavcodec -lavfilter -lavutil -lswscale -llog -lz -lm

       include $(BUILD_SHARED_LIBRARY)

    And here is my NativeCalls.java :

       package com.nightscapecreations.anim3free;

       public class NativeCalls {
           //ffmpeg
           public static native void initVideo();
           public static native void loadVideo(String fileName); //
           public static native void prepareStorageFrame();
           public static native void getFrame(); //
           public static native void freeConversionStorage();
           public static native void closeVideo();//
           public static native void freeVideo();//
           //opengl
           public static native void initPreOpenGL(); //
           public static native void initOpenGL(); //
           public static native void drawFrame(); //
           public static native void closeOpenGL(); //
           public static native void closePostOpenGL();//
           //wallpaper
           public static native void updateVideoPosition();
           public static native void setSpanVideo(boolean b);
           //getters
           public static native int getVideoHeight();
           public static native int getVideoWidth();
           //setters
           public static native void setWallVideoDimensions(int w,int h);
           public static native void setWallDimensions(int w,int h);
           public static native void setScreenPadding(int w,int h);
           public static native void setVideoMargins(int w,int h);
           public static native void setDrawDimensions(int drawWidth,int drawHeight);
           public static native void setOffsets(int x,int y);
           public static native void setSteps(int xs,int ys);
           public static native void setScreenDimensions(int w, int h);
           public static native void setTextureDimensions(int tx,
                                  int ty );
           public static native void setOrientation(boolean b);
           public static native void setPreviewMode(boolean b);
           public static native void setTonality(int t);
           public static native void toggleGetFrame(boolean b);
           //fps
           public static native void setLoopVideo(boolean b);

           static {
           System.loadLibrary("avcore");
           System.loadLibrary("avformat");
           System.loadLibrary("avcodec");
           //System.loadLibrary("avdevice");
           System.loadLibrary("avfilter");
           System.loadLibrary("avutil");
           System.loadLibrary("swscale");
           System.loadLibrary("video");
           }

       }

    EDIT

    This is the first part of my video.c file :

       #include <gles></gles>gl.h>
       #include <gles></gles>glext.h>

       #include <gles2></gles2>gl2.h>
       #include <gles2></gles2>gl2ext.h>

       #include
       #include

       #include <libavcodec></libavcodec>avcodec.h>
       #include <libavformat></libavformat>avformat.h>
       #include <libswscale></libswscale>swscale.h>

       #include  
       #include  
       #include
       #include <android></android>log.h>

       //#include <ftgl></ftgl>ftgl.h>

       //ffmpeg video variables
       int      initializedVideo=0;
       int      initializedFrame=0;
       AVFormatContext *pFormatCtx=NULL;
       int             videoStream;
       AVCodecContext  *pCodecCtx=NULL;
       AVCodec         *pCodec=NULL;
       AVFrame         *pFrame=NULL;
       AVPacket        packet;
       int             frameFinished;
       float           aspect_ratio;

       //ffmpeg video conversion variables
       AVFrame         *pFrameConverted=NULL;
       int             numBytes;
       uint8_t         *bufferConverted=NULL;

       //opengl
       int textureFormat=PIX_FMT_RGBA; // PIX_FMT_RGBA   PIX_FMT_RGB24
       int GL_colorFormat=GL_RGBA; // Must match the colorspace specified for textureFormat
       int textureWidth=256;
       int textureHeight=256;
       int nTextureHeight=-256;
       int textureL=0, textureR=0, textureW=0;
       int frameTonality;

       //GLuint textureConverted=0;
       GLuint texturesConverted[2] = { 0,1 };
       GLuint dummyTex = 2;
       static int len=0;


       static const char* BWVertexSrc =
                "attribute vec4 InVertex;\n"
                "attribute vec2 InTexCoord0;\n"
                "attribute vec2 InTexCoord1;\n"
                "uniform mat4 ProjectionModelviewMatrix;\n"
                "varying vec2 TexCoord0;\n"
                "varying vec2 TexCoord1;\n"

                "void main()\n"
                "{\n"
                "  gl_Position = ProjectionModelviewMatrix * InVertex;\n"
                "  TexCoord0 = InTexCoord0;\n"
                "  TexCoord1 = InTexCoord1;\n"
                "}\n";
       static const char* BWFragmentSrc  =

                "#version 110\n"
                "uniform sampler2D Texture0;\n"
                "uniform sampler2D Texture1;\n"

                "varying vec2 TexCoord0;\n"
                "varying vec2 TexCoord1;\n"

                "void main()\n"
                "{\n"
               "   vec3 color = texture2D(m_Texture, texCoord).rgb;\n"
               "   float gray = (color.r + color.g + color.b) / 3.0;\n"
               "   vec3 grayscale = vec3(gray);\n"

               "   gl_FragColor = vec4(grayscale, 1.0);\n"
                "}";
       static GLuint shaderProgram;


       //// Create a pixmap font from a TrueType file.
       //FTGLPixmapFont font("/home/user/Arial.ttf");
       //// Set the font size and render a small text.
       //font.FaceSize(72);
       //font.Render("Hello World!");

       //screen dimensions
       int screenWidth = 50;
       int screenHeight= 50;
       int screenL=0, screenR=0, screenW=0;
       int dPaddingX=0,dPaddingY=0;
       int drawWidth=50,drawHeight=50;

       //wallpaper
       int wallWidth = 50;
       int wallHeight = 50;
       int xOffSet, yOffSet;
       int xStep, yStep;
       jboolean spanVideo = JNI_TRUE;

       //video dimensions
       int wallVideoWidth = 0;
       int wallVideoHeight = 0;
       int marginX, marginY;
       jboolean isScreenPortrait = JNI_TRUE;
       jboolean isPreview = JNI_TRUE;
       jboolean loopVideo = JNI_TRUE;
       jboolean isGetFrame = JNI_TRUE;

       //file
       const char * szFileName;

       #define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
       #define min( a, b ) ( ((a) &lt; (b)) ? (a) : (b) )

       //test variables
       #define RGBA8(r, g, b)  (((r) &lt;&lt; (24)) | ((g) &lt;&lt; (16)) | ((b) &lt;&lt; (8)) | 255)
       int sPixelsInited=JNI_FALSE;
       uint32_t *s_pixels=NULL;

       int s_pixels_size() {
         return (sizeof(uint32_t) * textureWidth * textureHeight * 5);
       }

       void render_pixels1(uint32_t *pixels, uint32_t c) {
           int x, y;
           /* fill in a square of 5 x 5 at s_x, s_y */
           for (y = 0; y &lt; textureHeight; y++) {
               for (x = 0; x &lt; textureWidth; x++) {
                   int idx = x + y * textureWidth;
                   pixels[idx++] = RGBA8(255, 255, 0);
               }
           }
       }

       void render_pixels2(uint32_t *pixels, uint32_t c) {
           int x, y;
           /* fill in a square of 5 x 5 at s_x, s_y */
           for (y = 0; y &lt; textureHeight; y++) {
               for (x = 0; x &lt; textureWidth; x++) {
                   int idx = x + y * textureWidth;
                   pixels[idx++] = RGBA8(0, 0, 255);
               }
           }
       }

       void Java_com_nightscapecreations_anim3free_NativeCalls_initVideo (JNIEnv * env, jobject this) {
           initializedVideo = 0;
           initializedFrame = 0;
       }

       /* list of things that get loaded: */
       /* buffer */
       /* pFrameConverted */
       /* pFrame */
       /* pCodecCtx */
       /* pFormatCtx */
       void Java_com_nightscapecreations_anim3free_NativeCalls_loadVideo (JNIEnv * env, jobject this, jstring fileName)  {
           jboolean isCopy;
           szFileName = (*env)->GetStringUTFChars(env, fileName, &amp;isCopy);
           //debug
           __android_log_print(ANDROID_LOG_DEBUG, "NDK: ", "NDK:LC: [%s]", szFileName);
           // Register all formats and codecs
           av_register_all();
           // Open video file
           if(av_open_input_file(&amp;pFormatCtx, szFileName, NULL, 0, NULL)!=0) {
           __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Couldn't open file");
           return;
           }
           __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Succesfully loaded file");
           // Retrieve stream information */
           if(av_find_stream_info(pFormatCtx)&lt;0) {
           __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Couldn't find stream information");
           return;
           }
           __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Found stream info");
           // Find the first video stream
           videoStream=-1;
           int i;
           for(i=0; inb_streams; i++)
               if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {
                   videoStream=i;
                   break;
               }
           if(videoStream==-1) {
               __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Didn't find a video stream");
               return;
           }
           __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Found video stream");
           // Get a pointer to the codec contetx for the video stream
           pCodecCtx=pFormatCtx->streams[videoStream]->codec;
           // Find the decoder for the video stream
           pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
           if(pCodec==NULL) {
               __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Unsupported codec");
               return;
           }
           // Open codec
           if(avcodec_open(pCodecCtx, pCodec)&lt;0) {
               __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Could not open codec");
               return;
           }
           // Allocate video frame (decoded pre-conversion frame)
           pFrame=avcodec_alloc_frame();
           // keep track of initialization
           initializedVideo = 1;
           __android_log_print(ANDROID_LOG_DEBUG, "video.c", "NDK: Finished loading video");
       }

       //for this to work, you need to set the scaled video dimensions first
       void Java_com_nightscapecreations_anim3free_NativeCalls_prepareStorageFrame (JNIEnv * env, jobject this)  {
           // Allocate an AVFrame structure
           pFrameConverted=avcodec_alloc_frame();
           // Determine required buffer size and allocate buffer
           numBytes=avpicture_get_size(textureFormat, textureWidth, textureHeight);
           bufferConverted=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
           if ( pFrameConverted == NULL || bufferConverted == NULL )
               __android_log_print(ANDROID_LOG_DEBUG, "prepareStorage>>>>", "Out of memory");
           // Assign appropriate parts of buffer to image planes in pFrameRGB
           // Note that pFrameRGB is an AVFrame, but AVFrame is a superset
           // of AVPicture
           avpicture_fill((AVPicture *)pFrameConverted, bufferConverted, textureFormat, textureWidth, textureHeight);
           __android_log_print(ANDROID_LOG_DEBUG, "prepareStorage>>>>", "Created frame");
           __android_log_print(ANDROID_LOG_DEBUG, "prepareStorage>>>>", "texture dimensions: %dx%d", textureWidth, textureHeight);
           initializedFrame = 1;
       }

       jint Java_com_nightscapecreations_anim3free_NativeCalls_getVideoWidth (JNIEnv * env, jobject this)  {
           return pCodecCtx->width;
       }

       jint Java_com_nightscapecreations_anim3free_NativeCalls_getVideoHeight (JNIEnv * env, jobject this)  {
           return pCodecCtx->height;
       }

       void Java_com_nightscapecreations_anim3free_NativeCalls_getFrame (JNIEnv * env, jobject this)  {
           // keep reading packets until we hit the end or find a video packet
           while(av_read_frame(pFormatCtx, &amp;packet)>=0) {
               static struct SwsContext *img_convert_ctx;
               // Is this a packet from the video stream?
               if(packet.stream_index==videoStream) {
                   // Decode video frame
                   /* __android_log_print(ANDROID_LOG_DEBUG,  */
                   /*            "video.c",  */
                   /*            "getFrame: Try to decode frame" */
                   /*            ); */
                   avcodec_decode_video(pCodecCtx, pFrame, &amp;frameFinished, packet.data, packet.size);
                   // Did we get a video frame?
                   if(frameFinished) {
                       if(img_convert_ctx == NULL) {
                           /* get/set the scaling context */
                           int w = pCodecCtx->width;
                           int h = pCodecCtx->height;
                           img_convert_ctx = sws_getContext(w, h, pCodecCtx->pix_fmt, textureWidth,textureHeight, textureFormat, SWS_FAST_BILINEAR, NULL, NULL, NULL);
                           if(img_convert_ctx == NULL) {
                               return;
                           }
                       }
                       /* if img convert null */
                       /* finally scale the image */
                       /* __android_log_print(ANDROID_LOG_DEBUG,  */
                       /*          "video.c",  */
                       /*          "getFrame: Try to scale the image" */
                       /*          ); */

                       //pFrameConverted = pFrame;
                       sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameConverted->data, pFrameConverted->linesize);
                       //av_picture_crop(pFrameConverted->data, pFrame->data, 1, pCodecCtx->height, pCodecCtx->width);
                       //av_picture_crop();
                       //avfilter_vf_crop();

                       /* do something with pFrameConverted */
                       /* ... see drawFrame() */
                       /* We found a video frame, did something with it, now free up
                          packet and return */
                       av_free_packet(&amp;packet);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.age: %d", pFrame->age);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.buffer_hints: %d", pFrame->buffer_hints);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.display_picture_number: %d", pFrame->display_picture_number);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.hwaccel_picture_private: %d", pFrame->hwaccel_picture_private);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.key_frame: %d", pFrame->key_frame);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.palette_has_changed: %d", pFrame->palette_has_changed);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.pict_type: %d", pFrame->pict_type);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrame.qscale_type: %d", pFrame->qscale_type);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.age: %d", pFrameConverted->age);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.buffer_hints: %d", pFrameConverted->buffer_hints);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.display_picture_number: %d", pFrameConverted->display_picture_number);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.hwaccel_picture_private: %d", pFrameConverted->hwaccel_picture_private);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.key_frame: %d", pFrameConverted->key_frame);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.palette_has_changed: %d", pFrameConverted->palette_has_changed);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.pict_type: %d", pFrameConverted->pict_type);
       //              __android_log_print(ANDROID_LOG_INFO, "Droid Debug", "pFrameConverted.qscale_type: %d", pFrameConverted->qscale_type);
                       return;
                   } /* if frame finished */
               } /* if packet video stream */
               // Free the packet that was allocated by av_read_frame
               av_free_packet(&amp;packet);
           } /* while */
           //reload video when you get to the end
           av_seek_frame(pFormatCtx,videoStream,0,AVSEEK_FLAG_ANY);
       }

       void Java_com_nightscapecreations_anim3free_NativeCalls_setLoopVideo (JNIEnv * env, jobject this, jboolean b) {
           loopVideo = b;
       }

       void Java_com_nightscapecreations_anim3free_NativeCalls_closeVideo (JNIEnv * env, jobject this) {
           if ( initializedFrame == 1 ) {
               // Free the converted image
               av_free(bufferConverted);
               av_free(pFrameConverted);
               initializedFrame = 0;
               __android_log_print(ANDROID_LOG_DEBUG, "closeVideo>>>>", "Freed converted image");
           }
           if ( initializedVideo == 1 ) {
               /* // Free the YUV frame */
               av_free(pFrame);
               /* // Close the codec */
               avcodec_close(pCodecCtx);
               // Close the video file
               av_close_input_file(pFormatCtx);
               initializedVideo = 0;
               __android_log_print(ANDROID_LOG_DEBUG, "closeVideo>>>>", "Freed video structures");
           }
       }

       void Java_com_nightscapecreations_anim3free_NativeCalls_freeVideo (JNIEnv * env, jobject this) {
           if ( initializedVideo == 1 ) {
               /* // Free the YUV frame */
               av_free(pFrame);
               /* // Close the codec */
               avcodec_close(pCodecCtx);
               // Close the video file
               av_close_input_file(pFormatCtx);
               __android_log_print(ANDROID_LOG_DEBUG, "closeVideo>>>>", "Freed video structures");
               initializedVideo = 0;
           }
       }

       void Java_com_nightscapecreations_anim3free_NativeCalls_freeConversionStorage (JNIEnv * env, jobject this) {
           if ( initializedFrame == 1 ) {
               // Free the converted image
               av_free(bufferConverted);
               av_freep(pFrameConverted);
               initializedFrame = 0;
           }
       }

       /*--- END OF VIDEO ----*/

       /* disable these capabilities. */
       static GLuint s_disable_options[] = {
           GL_FOG,
           GL_LIGHTING,
           GL_CULL_FACE,
           GL_ALPHA_TEST,
           GL_BLEND,
           GL_COLOR_LOGIC_OP,
           GL_DITHER,
           GL_STENCIL_TEST,
           GL_DEPTH_TEST,
           GL_COLOR_MATERIAL,
           0
       };

       // For stuff that opengl needs to work with,
       // like the bitmap containing the texture
       void Java_com_nightscapecreations_anim3free_NativeCalls_initPreOpenGL (JNIEnv * env, jobject this)  {

       }
       ...
  • ALSA buffer xrun induced by low quality source in ffmpeg capture

    24 juin 2015, par Peter Becich

    I am attempting to transfer some old Video 8 tapes to my computer, though an EasyCap USB stick and the motherboard’s sound line-in, on Ubuntu. I believe the arguments are correctly laid out below to capture from two independent streams, and encode them both into the output MP4 file.

    Edit :

    I can simplify the question a bit, now.

    ALSA buffer overrun (or underrun ?) is induced by the unreliable/noisy audio source. For instance, if ffmpeg captures the beginning of tape playback, this causes "buffer xrun" far beyond when the tape gets up to speed and playback should be normal.

    It is interesting that the bitrate shown in the ffmpeg log shoots up higher than normal when it’s producing a garbage output ! (Is this bitrate a sum of of audio and video bitrates ?)

    I’ve tried a couple of audio encoding codecs, and had the same problem.

    Using libfdk_aac :

     Metadata:
       encoder         : Lavf56.15.102
       Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 640x480, q=-1--1, 29.97 fps, 11988 tbn, 29.97 tbc
       Metadata:
         encoder         : Lavc56.13.100 libx264
       Stream #0:1: Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 48000 Hz, mono, s16, 128 kb/s
       Metadata:
         encoder         : Lavc56.13.100 libfdk_aac
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
     Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (libfdk_aac))
    [alsa @ 0x22038a0] ALSA buffer xrun.  0kB time=00:00:00.00 bitrate=N/A    
    [alsa @ 0x22038a0] ALSA buffer xrun.1934kB time=00:00:02.76 bitrate=5723.5kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.4795kB time=00:00:05.49 bitrate=7150.1kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.7668kB time=00:00:08.21 bitrate=7646.1kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.1475kB time=00:00:10.94 bitrate=8588.9kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.3822kB time=00:00:13.66 bitrate=8289.0kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.5388kB time=00:00:16.38 bitrate=7695.0kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.6896kB time=00:00:19.10 bitrate=7244.0kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.8980kB time=00:00:21.84 bitrate=7118.8kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.2032kB time=00:00:24.55 bitrate=7349.3kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.4612kB time=00:00:27.27 bitrate=7391.1kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.6660kB time=00:00:29.98 bitrate=7284.6kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.9123kB time=00:00:32.68 bitrate=7299.3kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.0641kB time=00:00:35.39 bitrate=7091.7kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.2601kB time=00:00:38.13 bitrate=7002.6kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.5828kB time=00:00:40.87 bitrate=7181.0kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.8481kB time=00:00:43.60 bitrate=7229.9kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.1461kB time=00:00:46.34 bitrate=7328.0kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.3982kB time=00:00:49.06 bitrate=7342.7kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.6565kB time=00:00:51.77 bitrate=7367.8kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.9718kB time=00:00:54.51 bitrate=7471.3kbits/s    
    [alsa @ 0x22038a0] ALSA buffer xrun.2341kB time=00:00:57.25 bitrate=7489.2kbits/s    
    ^Cframe= 1760 fps= 29 q=-1.0 Lsize=   53946kB time=00:01:00.04 bitrate=7360.3kbits/s    
    video:53880kB audio:53kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.022994%
    [libx264 @ 0x2217ac0] frame I:8     Avg QP:24.00  size: 55686
    [libx264 @ 0x2217ac0] frame P:1752  Avg QP:27.66  size: 31237
    [libx264 @ 0x2217ac0] mb I  I16..4: 100.0%  0.0%  0.0%
    [libx264 @ 0x2217ac0] mb P  I16..4: 15.0%  0.0%  0.0%  P16..4: 80.2%  0.0%  0.0%  0.0%  0.0%    skip: 4.8%
    [libx264 @ 0x2217ac0] coded y,uvDC,uvAC intra: 45.3% 86.6% 59.4% inter: 65.7% 81.3% 11.5%
    [libx264 @ 0x2217ac0] i16 v,h,dc,p: 40% 25% 26%  9%
    [libx264 @ 0x2217ac0] i8c dc,h,v,p: 45% 24% 19% 12%
    [libx264 @ 0x2217ac0] kb/s:7516.07
    Received signal 2: terminating.

    Using libvorbis :

     Metadata:
       encoder         : Lavf56.15.102
       Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 640x480, q=-1--1, 29.97 fps, 11988 tbn, 29.97 tbc
       Metadata:
         encoder         : Lavc56.13.100 libx264
       Stream #0:1: Audio: vorbis (libvorbis) ([221][0][0][0] / 0x00DD), 48000 Hz, mono, fltp, 128 kb/s
       Metadata:
         encoder         : Lavc56.13.100 libvorbis
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
     Stream #1:0 -> #0:1 (pcm_s16le (native) -> vorbis (libvorbis))
    [alsa @ 0x1a948a0] ALSA buffer xrun.  0kB time=00:00:00.00 bitrate=N/A    
    [alsa @ 0x1a948a0] ALSA buffer xrun. 402kB time=00:00:04.37 bitrate= 752.3kbits/s    
    [alsa @ 0x1a948a0] ALSA buffer xrun.4122kB time=00:00:08.80 bitrate=3833.0kbits/s    
    [alsa @ 0x1a948a0] ALSA buffer xrun.8722kB time=00:00:13.14 bitrate=5436.3kbits/s    
    [alsa @ 0x1a948a0] ALSA buffer xrun.3903kB time=00:00:17.51 bitrate=6502.2kbits/s    
    [alsa @ 0x1a948a0] ALSA buffer xrun.6625kB time=00:00:21.89 bitrate=6221.4kbits/s    
    [alsa @ 0x1a948a0] ALSA buffer xrun.9548kB time=00:00:26.28 bitrate=6092.5kbits/s    
    ^Cframe=  851 fps= 26 q=-1.0 Lsize=   22018kB time=00:00:30.69 bitrate=5875.3kbits/s    
    video:21996kB audio:12kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.044897%
    [libx264 @ 0x1aa8ac0] frame I:4     Avg QP:23.50  size: 62405
    [libx264 @ 0x1aa8ac0] frame P:847   Avg QP:25.58  size: 26297
    [libx264 @ 0x1aa8ac0] mb I  I16..4: 100.0%  0.0%  0.0%
    [libx264 @ 0x1aa8ac0] mb P  I16..4: 13.2%  0.0%  0.0%  P16..4: 72.0%  0.0%  0.0%  0.0%  0.0%    skip:14.8%
    [libx264 @ 0x1aa8ac0] coded y,uvDC,uvAC intra: 40.6% 81.0% 58.6% inter: 58.8% 72.7% 8.6%
    [libx264 @ 0x1aa8ac0] i16 v,h,dc,p: 41% 28% 22%  9%
    [libx264 @ 0x1aa8ac0] i8c dc,h,v,p: 54% 19% 16% 11%
    [libx264 @ 0x1aa8ac0] kb/s:6345.60
    Received signal 2: terminating.

    ffmpeg’s detection of the ALSA stream is seemingly goofed up by the inconsistencies of the tape. In the failure case, only short blips of the tapes audio exist in the output MP4. The audio bitrate of the output file is less than 10 kbps, averaged out across the whole file. The output video seems to be fine, even though the low frames-per-second in the failure case log below.

    The audio and video streams can be captured fine for short amounts of time before a source error occurs ; this provides the success case log. The failure case log was created by intentionally making an error in the source streams — turning on the camera makes a brief noisy signal.

    Is there a setting that needs to be forced to keep ffmpeg recording the audio stream, even when the tape is blank or noisy ?

    Could it be that the libfdk_aac audio encoder is tripped up by the low quality source ?

    The relevant line ; rawvideo stream is piped to this in script at bottom :

    ffmpeg -pixel_format uyvy422 -s:v 720x480 -framerate 29.97 -f rawvideo \
    -i $PIPE  -f alsa -i hw:0,0 -vf scale=w=720:h=540 -vcodec libx264 \
    -preset ultrafast -shortest -c:a libfdk_aac -b:a 128k -af pan=1:c0=c0  \
    -ar 96000 $OUTFILE

    The ar argument was one attempt to force recording.

    ffmpeg log file for (short-lived) success ; high frames-per-second captured :

    ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers
     built on Jan 11 2015 17:53:45 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
     configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
     libavutil      54. 15.100 / 54. 15.100
     libavcodec     56. 13.100 / 56. 13.100
     libavformat    56. 15.102 / 56. 15.102
     libavdevice    56.  3.100 / 56.  3.100
     libavfilter     5.  2.103 /  5.  2.103
     libavresample   2.  1.  0 /  2.  1.  0
     libswscale      3.  1.101 /  3.  1.101
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  3.100 / 53.  3.100
    Input #0, rawvideo, from '/tmp/somagic-pipe':
     Duration: N/A, start: 0.000000, bitrate: 165722 kb/s
       Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 720x480, 165722 kb/s, 29.97 tbr, 29.97 tbn, 29.97 tbc
    Home directory not accessible: Permission denied
    Guessed Channel Layout for  Input Stream #1.0 : stereo
    Input #1, alsa, from 'hw:0,0':
     Duration: N/A, start: 1423202268.577088, bitrate: 1536 kb/s
       Stream #1:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    No pixel format specified, yuv422p for H.264 encoding chosen.
    Use -pix_fmt yuv420p for compatibility with outdated media players.
    [Parsed_pan_0 @ 0x3335d60] This syntax is deprecated. Use '|' to separate the list items.
    Single channel layout '1' is interpreted as a number of channels, switch to the syntax '1c' otherwise it will be interpreted as a channel layout number in a later version
    [Parsed_pan_0 @ 0x3335d60] Pure channel mapping detected: 0
    [libx264 @ 0x3364bc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
    [libx264 @ 0x3364bc0] profile High 4:2:2, level 3.1, 4:2:2 8-bit
    [libx264 @ 0x3364bc0] 264 - core 142 r2389 956c8d8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
    Output #0, mp4, to '/home/peterbecich/easycap/Videos/fpv_video_02_05_2015_21_57_48.mp4':
     Metadata:
       encoder         : Lavf56.15.102
       Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 720x540, q=-1--1, 29.97 fps, 11988 tbn, 29.97 tbc
       Metadata:
         encoder         : Lavc56.13.100 libx264
       Stream #0:1: Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 96000 Hz, mono, s16, 128 kb/s
       Metadata:
         encoder         : Lavc56.13.100 libfdk_aac
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
     Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (libfdk_aac))
    Press [q] to stop, [?] for help
    frame=   13 fps=0.0 q=26.0 size=     187kB time=00:00:00.30 bitrate=5102.7kbits/s    
    frame=   29 fps= 29 q=26.0 size=     469kB time=00:00:00.83 bitrate=4607.6kbits/s    
    frame=   44 fps= 29 q=26.0 size=     755kB time=00:00:01.33 bitrate=4635.2kbits/s    
    frame=   59 fps= 29 q=26.0 size=    1024kB time=00:00:01.83 bitrate=4572.1kbits/s    
    frame=   74 fps= 29 q=26.0 size=    1279kB time=00:00:02.33 bitrate=4486.5kbits/s    
    frame=   89 fps= 29 q=26.0 size=    1516kB time=00:00:02.83 bitrate=4378.0kbits/s    
    frame=  104 fps= 29 q=26.0 size=    1752kB time=00:00:03.33 bitrate=4301.0kbits/s    
    frame=  119 fps= 29 q=26.0 size=    1991kB time=00:00:03.83 bitrate=4251.1kbits/s    
    frame=  135 fps= 30 q=26.0 size=    2245kB time=00:00:04.37 bitrate=4207.5kbits/s    
    frame=  150 fps= 30 q=26.0 size=    2524kB time=00:00:04.87 bitrate=4245.0kbits/s    
    frame=  165 fps= 30 q=26.0 size=    2808kB time=00:00:05.37 bitrate=4282.0kbits/s    
    frame=  180 fps= 30 q=26.0 size=    3091kB time=00:00:05.87 bitrate=4311.5kbits/s    
    [rawvideo @ 0x3350640] Invalid buffer size, packet size 65536 &lt; expected frame_size 691200
    Error while decoding stream #0:0: Invalid argument
    frame=  183 fps= 29 q=-1.0 Lsize=    3247kB time=00:00:06.11 bitrate=4351.5kbits/s    
    video:3142kB audio:96kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.254788%
    [libx264 @ 0x3364bc0] frame I:1     Avg QP:20.00  size:  2289
    [libx264 @ 0x3364bc0] frame P:182   Avg QP:25.99  size: 17664
    [libx264 @ 0x3364bc0] mb I  I16..4: 100.0%  0.0%  0.0%
    [libx264 @ 0x3364bc0] mb P  I16..4: 78.5%  0.0%  0.0%  P16..4: 20.2%  0.0%  0.0%  0.0%  0.0%    skip: 1.4%
    [libx264 @ 0x3364bc0] coded y,uvDC,uvAC intra: 84.1% 71.5% 18.9% inter: 51.9% 63.5% 0.4%
    [libx264 @ 0x3364bc0] i16 v,h,dc,p: 15%  8% 69%  8%
    [libx264 @ 0x3364bc0] i8c dc,h,v,p: 50% 19% 24%  7%
    [libx264 @ 0x3364bc0] kb/s:4215.02

    ffmpeg log for failure ; low FPS captured :

    ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers
     built on Jan 11 2015 17:53:45 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
     configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
     libavutil      54. 15.100 / 54. 15.100
     libavcodec     56. 13.100 / 56. 13.100
     libavformat    56. 15.102 / 56. 15.102
     libavdevice    56.  3.100 / 56.  3.100
     libavfilter     5.  2.103 /  5.  2.103
     libavresample   2.  1.  0 /  2.  1.  0
     libswscale      3.  1.101 /  3.  1.101
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  3.100 / 53.  3.100
    Input #0, rawvideo, from '/tmp/somagic-pipe':
     Duration: N/A, start: 0.000000, bitrate: 165722 kb/s
       Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 720x480, 165722 kb/s, 29.97 tbr, 29.97 tbn, 29.97 tbc
    Home directory not accessible: Permission denied
    Guessed Channel Layout for  Input Stream #1.0 : stereo
    Input #1, alsa, from 'hw:0,0':
     Duration: N/A, start: 1423201999.226455, bitrate: 1536 kb/s
       Stream #1:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    No pixel format specified, yuv422p for H.264 encoding chosen.
    Use -pix_fmt yuv420p for compatibility with outdated media players.
    [Parsed_pan_0 @ 0x21cad60] This syntax is deprecated. Use '|' to separate the list items.
    Single channel layout '1' is interpreted as a number of channels, switch to the syntax '1c' otherwise it will be interpreted as a channel layout number in a later version
    [Parsed_pan_0 @ 0x21cad60] Pure channel mapping detected: 0
    [libx264 @ 0x21f9bc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
    [libx264 @ 0x21f9bc0] profile High 4:2:2, level 3.1, 4:2:2 8-bit
    [libx264 @ 0x21f9bc0] 264 - core 142 r2389 956c8d8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
    Output #0, mp4, to '/home/peterbecich/easycap/Videos/fpv_video_02_05_2015_21_53_18.mp4':
     Metadata:
       encoder         : Lavf56.15.102
       Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 720x540, q=-1--1, 29.97 fps, 11988 tbn, 29.97 tbc
       Metadata:
         encoder         : Lavc56.13.100 libx264
       Stream #0:1: Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 96000 Hz, mono, s16, 128 kb/s
       Metadata:
         encoder         : Lavc56.13.100 libfdk_aac
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
     Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (libfdk_aac))
    Press [q] to stop, [?] for help
    frame=    1 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=1.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.7 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.5 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.4 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.3 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.3 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    [alsa @ 0x21e5ac0] ALSA buffer xrun.
    frame=    8 fps=1.3 q=19.0 size=      12kB time=00:00:06.03 bitrate=  15.9kbits/s    
    frame=   23 fps=3.5 q=18.0 size=      12kB time=00:00:06.03 bitrate=  16.4kbits/s    
    frame=   38 fps=5.4 q=18.0 size=      12kB time=00:00:06.03 bitrate=  16.7kbits/s    
    frame=   53 fps=7.0 q=18.0 size=      12kB time=00:00:06.03 bitrate=  16.9kbits/s    
    frame=   68 fps=8.4 q=26.0 size=     146kB time=00:00:06.03 bitrate= 198.8kbits/s    
    frame=   83 fps=9.7 q=26.0 size=     375kB time=00:00:06.03 bitrate= 510.0kbits/s    
    frame=   98 fps= 11 q=26.0 size=     608kB time=00:00:06.03 bitrate= 826.5kbits/s    
    frame=  114 fps= 12 q=26.0 size=     875kB time=00:00:06.03 bitrate=1189.1kbits/s    
    frame=  128 fps= 13 q=26.0 size=    1091kB time=00:00:06.03 bitrate=1481.6kbits/s    
    frame=  144 fps= 14 q=26.0 size=    1339kB time=00:00:06.03 bitrate=1819.2kbits/s    
    frame=  159 fps= 14 q=26.0 size=    1571kB time=00:00:06.03 bitrate=2134.6kbits/s    
    frame=  174 fps= 15 q=26.0 size=    1796kB time=00:00:06.03 bitrate=2440.1kbits/s    
    [alsa @ 0x21e5ac0] ALSA buffer xrun.
    frame=  189 fps= 16 q=26.0 size=    2015kB time=00:00:12.04 bitrate=1370.4kbits/s    
    frame=  204 fps= 16 q=26.0 size=    2238kB time=00:00:12.04 bitrate=1522.3kbits/s    
    frame=  219 fps= 17 q=26.0 size=    2490kB time=00:00:12.04 bitrate=1694.2kbits/s    
    frame=  235 fps= 17 q=26.0 size=    2728kB time=00:00:12.04 bitrate=1855.8kbits/s    
    frame=  250 fps= 18 q=26.0 size=    2973kB time=00:00:12.04 bitrate=2022.4kbits/s    
    [rawvideo @ 0x21e5640] Invalid buffer size, packet size 65536 &lt; expected frame_size 691200
    Error while decoding stream #0:0: Invalid argument
    frame=  261 fps= 18 q=-1.0 Lsize=    3269kB time=00:00:12.06 bitrate=2220.1kbits/s    
    video:3263kB audio:4kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.081101%
    [libx264 @ 0x21f9bc0] frame I:2     Avg QP:21.50  size: 21342
    [libx264 @ 0x21f9bc0] frame P:259   Avg QP:24.22  size: 12734
    [libx264 @ 0x21f9bc0] mb I  I16..4: 100.0%  0.0%  0.0%
    [libx264 @ 0x21f9bc0] mb P  I16..4: 62.8%  0.0%  0.0%  P16..4: 14.2%  0.0%  0.0%  0.0%  0.0%    skip:22.9%
    [libx264 @ 0x21f9bc0] coded y,uvDC,uvAC intra: 77.7% 61.2% 14.1% inter: 19.7% 24.8% 1.6%
    [libx264 @ 0x21f9bc0] i16 v,h,dc,p: 17% 10% 65%  8%
    [libx264 @ 0x21f9bc0] i8c dc,h,v,p: 52% 18% 24%  6%
    [libx264 @ 0x21f9bc0] kb/s:3068.90

    The whole script :

    #!/bin/sh

    PIPE=/tmp/somagic-pipe
    OUTFILEDIR=~/easycap/Videos/
    LOGDIR=~/.somagic-log/
    NOW=`date +"%m_%d_%Y_%H_%M_%S"`

    OUTFILE=${OUTFILEDIR}fpv_video_${NOW}.mp4

    mkdir $LOGDIR

    FFMPEG_LOG=${LOGDIR}ffmpeg.log
    SOMAGIC_LOG=${LOGDIR}somagic.log
    MPLAYER_LOG=${LOGDIR}mplayer.log

    rm $PIPE >/dev/null 2>&amp;1
    rm $OUTFILE >/dev/null 2>&amp;1

    rm $FFMPEG_LOG
    rm $SOMAGIC_LOG
    rm $MPLAYER_LOG

    mkfifo $PIPE >/dev/null 2>&amp;1

    ffmpeg -pixel_format uyvy422 -s:v 720x480 -framerate 29.97 -f rawvideo \
    -i $PIPE  -f alsa -i hw:0,0 -vf scale=w=720:h=540 -vcodec libx264 \
    -preset ultrafast -shortest -c:a libfdk_aac -b:a 128k -af pan=1:c0=c0  \
    -ar 96000 $OUTFILE > $FFMPEG_LOG 2>&amp;1 &amp;

    somagic-capture --ntsc -c --luminance=2 --lum-aperture=3 2> $SOMAGIC_LOG \
    | tee $PIPE | \
    mplayer -vf yadif,screenshot -demuxer rawvideo -rawvideo \
    "ntsc:format=uyvy:fps=30000/1001" -aspect 4:3 - 2> $MPLAYER_LOG


    rm $PIPE >/dev/null 2>&amp;1

    Modified from here : https://gist.github.com/Brick85/0b327ac2d3d45e23ed33

  • Forcing ffmpeg to capture unreliable ALSA audio stream

    6 février 2015, par Peter Becich

    I am attempting to transfer some old Video 8 tapes to my computer, though an EasyCap USB stick and the motherboard’s sound line-in, on Ubuntu. I believe the arguments are correctly laid out below to capture from two independent streams, and encode them both into the output MP4 file.

    ffmpeg’s detection of the ALSA stream is seemingly goofed up by the inconsistencies of the tape. In the failure case, only short blips of the tapes audio exist in the output MP4. The audio bitrate of the output file is less than 10 kbps, averaged out across the whole file. The output video seems to be fine, even though the low frames-per-second in the failure case log below.

    The audio and video streams can be captured fine for short amounts of time before a source error occurs ; this provides the success case log. The failure case log was created by intentionally making an error in the source streams — turning on the camera makes a brief noisy signal.

    Is there a setting that needs to be forced to keep ffmpeg recording the audio stream, even when the tape is blank or noisy ?

    Could it be that the libfdk_aac audio encoder is tripped up by the low quality source ?

    The relevant line ; rawvideo stream is piped to this in script at bottom :

    ffmpeg -pixel_format uyvy422 -s:v 720x480 -framerate 29.97 -f rawvideo \
    -i $PIPE  -f alsa -i hw:0,0 -vf scale=w=720:h=540 -vcodec libx264 \
    -preset ultrafast -shortest -c:a libfdk_aac -b:a 128k -af pan=1:c0=c0  \
    -ar 96000 $OUTFILE

    The ar argument was one attempt to force recording.

    ffmpeg log file for (short-lived) success ; high frames-per-second captured :

    ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers
     built on Jan 11 2015 17:53:45 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
     configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
     libavutil      54. 15.100 / 54. 15.100
     libavcodec     56. 13.100 / 56. 13.100
     libavformat    56. 15.102 / 56. 15.102
     libavdevice    56.  3.100 / 56.  3.100
     libavfilter     5.  2.103 /  5.  2.103
     libavresample   2.  1.  0 /  2.  1.  0
     libswscale      3.  1.101 /  3.  1.101
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  3.100 / 53.  3.100
    Input #0, rawvideo, from '/tmp/somagic-pipe':
     Duration: N/A, start: 0.000000, bitrate: 165722 kb/s
       Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 720x480, 165722 kb/s, 29.97 tbr, 29.97 tbn, 29.97 tbc
    Home directory not accessible: Permission denied
    Guessed Channel Layout for  Input Stream #1.0 : stereo
    Input #1, alsa, from 'hw:0,0':
     Duration: N/A, start: 1423202268.577088, bitrate: 1536 kb/s
       Stream #1:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    No pixel format specified, yuv422p for H.264 encoding chosen.
    Use -pix_fmt yuv420p for compatibility with outdated media players.
    [Parsed_pan_0 @ 0x3335d60] This syntax is deprecated. Use '|' to separate the list items.
    Single channel layout '1' is interpreted as a number of channels, switch to the syntax '1c' otherwise it will be interpreted as a channel layout number in a later version
    [Parsed_pan_0 @ 0x3335d60] Pure channel mapping detected: 0
    [libx264 @ 0x3364bc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
    [libx264 @ 0x3364bc0] profile High 4:2:2, level 3.1, 4:2:2 8-bit
    [libx264 @ 0x3364bc0] 264 - core 142 r2389 956c8d8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
    Output #0, mp4, to '/home/peterbecich/easycap/Videos/fpv_video_02_05_2015_21_57_48.mp4':
     Metadata:
       encoder         : Lavf56.15.102
       Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 720x540, q=-1--1, 29.97 fps, 11988 tbn, 29.97 tbc
       Metadata:
         encoder         : Lavc56.13.100 libx264
       Stream #0:1: Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 96000 Hz, mono, s16, 128 kb/s
       Metadata:
         encoder         : Lavc56.13.100 libfdk_aac
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
     Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (libfdk_aac))
    Press [q] to stop, [?] for help
    frame=   13 fps=0.0 q=26.0 size=     187kB time=00:00:00.30 bitrate=5102.7kbits/s    
    frame=   29 fps= 29 q=26.0 size=     469kB time=00:00:00.83 bitrate=4607.6kbits/s    
    frame=   44 fps= 29 q=26.0 size=     755kB time=00:00:01.33 bitrate=4635.2kbits/s    
    frame=   59 fps= 29 q=26.0 size=    1024kB time=00:00:01.83 bitrate=4572.1kbits/s    
    frame=   74 fps= 29 q=26.0 size=    1279kB time=00:00:02.33 bitrate=4486.5kbits/s    
    frame=   89 fps= 29 q=26.0 size=    1516kB time=00:00:02.83 bitrate=4378.0kbits/s    
    frame=  104 fps= 29 q=26.0 size=    1752kB time=00:00:03.33 bitrate=4301.0kbits/s    
    frame=  119 fps= 29 q=26.0 size=    1991kB time=00:00:03.83 bitrate=4251.1kbits/s    
    frame=  135 fps= 30 q=26.0 size=    2245kB time=00:00:04.37 bitrate=4207.5kbits/s    
    frame=  150 fps= 30 q=26.0 size=    2524kB time=00:00:04.87 bitrate=4245.0kbits/s    
    frame=  165 fps= 30 q=26.0 size=    2808kB time=00:00:05.37 bitrate=4282.0kbits/s    
    frame=  180 fps= 30 q=26.0 size=    3091kB time=00:00:05.87 bitrate=4311.5kbits/s    
    [rawvideo @ 0x3350640] Invalid buffer size, packet size 65536 &lt; expected frame_size 691200
    Error while decoding stream #0:0: Invalid argument
    frame=  183 fps= 29 q=-1.0 Lsize=    3247kB time=00:00:06.11 bitrate=4351.5kbits/s    
    video:3142kB audio:96kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.254788%
    [libx264 @ 0x3364bc0] frame I:1     Avg QP:20.00  size:  2289
    [libx264 @ 0x3364bc0] frame P:182   Avg QP:25.99  size: 17664
    [libx264 @ 0x3364bc0] mb I  I16..4: 100.0%  0.0%  0.0%
    [libx264 @ 0x3364bc0] mb P  I16..4: 78.5%  0.0%  0.0%  P16..4: 20.2%  0.0%  0.0%  0.0%  0.0%    skip: 1.4%
    [libx264 @ 0x3364bc0] coded y,uvDC,uvAC intra: 84.1% 71.5% 18.9% inter: 51.9% 63.5% 0.4%
    [libx264 @ 0x3364bc0] i16 v,h,dc,p: 15%  8% 69%  8%
    [libx264 @ 0x3364bc0] i8c dc,h,v,p: 50% 19% 24%  7%
    [libx264 @ 0x3364bc0] kb/s:4215.02

    ffmpeg log for failure ; low FPS captured :

    ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers
     built on Jan 11 2015 17:53:45 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
     configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
     libavutil      54. 15.100 / 54. 15.100
     libavcodec     56. 13.100 / 56. 13.100
     libavformat    56. 15.102 / 56. 15.102
     libavdevice    56.  3.100 / 56.  3.100
     libavfilter     5.  2.103 /  5.  2.103
     libavresample   2.  1.  0 /  2.  1.  0
     libswscale      3.  1.101 /  3.  1.101
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  3.100 / 53.  3.100
    Input #0, rawvideo, from '/tmp/somagic-pipe':
     Duration: N/A, start: 0.000000, bitrate: 165722 kb/s
       Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 720x480, 165722 kb/s, 29.97 tbr, 29.97 tbn, 29.97 tbc
    Home directory not accessible: Permission denied
    Guessed Channel Layout for  Input Stream #1.0 : stereo
    Input #1, alsa, from 'hw:0,0':
     Duration: N/A, start: 1423201999.226455, bitrate: 1536 kb/s
       Stream #1:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    No pixel format specified, yuv422p for H.264 encoding chosen.
    Use -pix_fmt yuv420p for compatibility with outdated media players.
    [Parsed_pan_0 @ 0x21cad60] This syntax is deprecated. Use '|' to separate the list items.
    Single channel layout '1' is interpreted as a number of channels, switch to the syntax '1c' otherwise it will be interpreted as a channel layout number in a later version
    [Parsed_pan_0 @ 0x21cad60] Pure channel mapping detected: 0
    [libx264 @ 0x21f9bc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
    [libx264 @ 0x21f9bc0] profile High 4:2:2, level 3.1, 4:2:2 8-bit
    [libx264 @ 0x21f9bc0] 264 - core 142 r2389 956c8d8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
    Output #0, mp4, to '/home/peterbecich/easycap/Videos/fpv_video_02_05_2015_21_53_18.mp4':
     Metadata:
       encoder         : Lavf56.15.102
       Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 720x540, q=-1--1, 29.97 fps, 11988 tbn, 29.97 tbc
       Metadata:
         encoder         : Lavc56.13.100 libx264
       Stream #0:1: Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 96000 Hz, mono, s16, 128 kb/s
       Metadata:
         encoder         : Lavc56.13.100 libfdk_aac
    Stream mapping:
     Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
     Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (libfdk_aac))
    Press [q] to stop, [?] for help
    frame=    1 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=1.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.7 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.5 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.4 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.3 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.3 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    frame=    1 fps=0.2 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A    
    [alsa @ 0x21e5ac0] ALSA buffer xrun.
    frame=    8 fps=1.3 q=19.0 size=      12kB time=00:00:06.03 bitrate=  15.9kbits/s    
    frame=   23 fps=3.5 q=18.0 size=      12kB time=00:00:06.03 bitrate=  16.4kbits/s    
    frame=   38 fps=5.4 q=18.0 size=      12kB time=00:00:06.03 bitrate=  16.7kbits/s    
    frame=   53 fps=7.0 q=18.0 size=      12kB time=00:00:06.03 bitrate=  16.9kbits/s    
    frame=   68 fps=8.4 q=26.0 size=     146kB time=00:00:06.03 bitrate= 198.8kbits/s    
    frame=   83 fps=9.7 q=26.0 size=     375kB time=00:00:06.03 bitrate= 510.0kbits/s    
    frame=   98 fps= 11 q=26.0 size=     608kB time=00:00:06.03 bitrate= 826.5kbits/s    
    frame=  114 fps= 12 q=26.0 size=     875kB time=00:00:06.03 bitrate=1189.1kbits/s    
    frame=  128 fps= 13 q=26.0 size=    1091kB time=00:00:06.03 bitrate=1481.6kbits/s    
    frame=  144 fps= 14 q=26.0 size=    1339kB time=00:00:06.03 bitrate=1819.2kbits/s    
    frame=  159 fps= 14 q=26.0 size=    1571kB time=00:00:06.03 bitrate=2134.6kbits/s    
    frame=  174 fps= 15 q=26.0 size=    1796kB time=00:00:06.03 bitrate=2440.1kbits/s    
    [alsa @ 0x21e5ac0] ALSA buffer xrun.
    frame=  189 fps= 16 q=26.0 size=    2015kB time=00:00:12.04 bitrate=1370.4kbits/s    
    frame=  204 fps= 16 q=26.0 size=    2238kB time=00:00:12.04 bitrate=1522.3kbits/s    
    frame=  219 fps= 17 q=26.0 size=    2490kB time=00:00:12.04 bitrate=1694.2kbits/s    
    frame=  235 fps= 17 q=26.0 size=    2728kB time=00:00:12.04 bitrate=1855.8kbits/s    
    frame=  250 fps= 18 q=26.0 size=    2973kB time=00:00:12.04 bitrate=2022.4kbits/s    
    [rawvideo @ 0x21e5640] Invalid buffer size, packet size 65536 &lt; expected frame_size 691200
    Error while decoding stream #0:0: Invalid argument
    frame=  261 fps= 18 q=-1.0 Lsize=    3269kB time=00:00:12.06 bitrate=2220.1kbits/s    
    video:3263kB audio:4kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.081101%
    [libx264 @ 0x21f9bc0] frame I:2     Avg QP:21.50  size: 21342
    [libx264 @ 0x21f9bc0] frame P:259   Avg QP:24.22  size: 12734
    [libx264 @ 0x21f9bc0] mb I  I16..4: 100.0%  0.0%  0.0%
    [libx264 @ 0x21f9bc0] mb P  I16..4: 62.8%  0.0%  0.0%  P16..4: 14.2%  0.0%  0.0%  0.0%  0.0%    skip:22.9%
    [libx264 @ 0x21f9bc0] coded y,uvDC,uvAC intra: 77.7% 61.2% 14.1% inter: 19.7% 24.8% 1.6%
    [libx264 @ 0x21f9bc0] i16 v,h,dc,p: 17% 10% 65%  8%
    [libx264 @ 0x21f9bc0] i8c dc,h,v,p: 52% 18% 24%  6%
    [libx264 @ 0x21f9bc0] kb/s:3068.90

    The whole script :

    #!/bin/sh

    PIPE=/tmp/somagic-pipe
    OUTFILEDIR=~/easycap/Videos/
    LOGDIR=~/.somagic-log/
    NOW=`date +"%m_%d_%Y_%H_%M_%S"`

    OUTFILE=${OUTFILEDIR}fpv_video_${NOW}.mp4

    mkdir $LOGDIR

    FFMPEG_LOG=${LOGDIR}ffmpeg.log
    SOMAGIC_LOG=${LOGDIR}somagic.log
    MPLAYER_LOG=${LOGDIR}mplayer.log

    rm $PIPE >/dev/null 2>&amp;1
    rm $OUTFILE >/dev/null 2>&amp;1

    rm $FFMPEG_LOG
    rm $SOMAGIC_LOG
    rm $MPLAYER_LOG

    mkfifo $PIPE >/dev/null 2>&amp;1

    ffmpeg -pixel_format uyvy422 -s:v 720x480 -framerate 29.97 -f rawvideo \
    -i $PIPE  -f alsa -i hw:0,0 -vf scale=w=720:h=540 -vcodec libx264 \
    -preset ultrafast -shortest -c:a libfdk_aac -b:a 128k -af pan=1:c0=c0  \
    -ar 96000 $OUTFILE > $FFMPEG_LOG 2>&amp;1 &amp;

    somagic-capture --ntsc -c --luminance=2 --lum-aperture=3 2> $SOMAGIC_LOG \
    | tee $PIPE | \
    mplayer -vf yadif,screenshot -demuxer rawvideo -rawvideo \
    "ntsc:format=uyvy:fps=30000/1001" -aspect 4:3 - 2> $MPLAYER_LOG


    rm $PIPE >/dev/null 2>&amp;1

    Modified from here : https://gist.github.com/Brick85/0b327ac2d3d45e23ed33