Android利用ffmpeg做视频裁剪

来源:互联网 发布:java调用jquery 编辑:程序博客网 时间:2024/05/17 05:42

根据自己需求,编译so,或者用网上搜现成的;https://github.com/FFmpeg/FFmpeg


时长裁切:

ffmpeg -i src.mp4 -ss 3 -t 10 out.mp4

3表示起始时间,10表示长度,也就表示视频裁切出来是3-13s的视频;


尺寸裁切:

ffmpeg -i src.mp4 -strict -2 -vf crop=1080:500:0:420 -preset fast out.mp4

1080表示宽度;500表示高度;0表示X起始点;420表示Y起始点;

 -preset fast 会保持原有清晰度;



//-ss 0 -t 5  时间裁切//-strict -2 -vf crop=500:500:0:100   尺寸裁切String cmd = "/data/data/" + context.getPackageName() + "/ffmpeg" + " -y -i "        + srcVideoPath        + " -ss " + start + " -t " + duration        + " -strict -2 -vf crop=" + width + ":" + height + ":" + x + ":" + y + " -preset fast "        + destPath;
-y 会覆盖输出文件;


Github源码:https://github.com/miLLlulei/VideoCrop ,欢迎大家来star,谢谢;




下面是一些其他方法:

/** * 获取本地视频信息 */public static LocalVideoBean getLocalVideoInfo(String path) {    LocalVideoBean info = new LocalVideoBean();    info.src_path = path;    android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();    try {        mmr.setDataSource(path);        info.duration = (Long.valueOf(mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION)));        info.width = Integer.valueOf(mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));        info.height = Integer.valueOf(mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));    } catch (Exception e) {        e.printStackTrace();    } finally {        mmr.release();    }    return info;}

    /**     * 获取视频帧列表     *     * @param path     * @param count    期望个数     * @param width    期望压缩后宽度     * @param height   期望压缩后高度     * @param listener     */    public static void getLocalVideoBitmap(final String path, final int count, final int width, final int height, final OnBitmapListener listener) {        AsyncTask<Object, Object, Object> task = new AsyncTask<Object, Object, Object>() {            @Override            protected Object doInBackground(Object... params) {                android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();                try {                    mmr.setDataSource(path);                    long duration = (Long.valueOf(mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION))) * 1000;                    long inv = (duration / count);                    for (long i = 0; i < duration; i += inv) {                        //注意getFrameAtTime方法的timeUs 是微妙, 1us * 1000 * 1000 = 1s                        Bitmap bitmap = mmr.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST);//                        Log.d(VideoFFCrop.TAG, "getFrameAtTime "+ i + "===" + bitmap.getWidth() + "===" + bitmap.getHeight());                        Bitmap destBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);                        Log.d(VideoFFCrop.TAG, "getFrameAtTime " + i + "===" + destBitmap.getWidth() + "===" + destBitmap.getHeight());                        bitmap.recycle();                        publishProgress(destBitmap);                    }                } catch (Throwable e) {                    e.printStackTrace();                } finally {                    mmr.release();                }                return null;            }            @Override            protected void onProgressUpdate(Object... values) {                if (listener != null) {                    listener.onBitmapGet((Bitmap) values[0]);                }            }            @Override            protected void onPostExecute(Object result) {            }        };        task.execute();    }    public interface OnBitmapListener {        void onBitmapGet(Bitmap bitmap);    }


原创粉丝点击