日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视频:使用FFMpeg实现视频录制与压缩

發布時間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频:使用FFMpeg实现视频录制与压缩 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用https://github.com/mabeijianxi/small-video-record項目來實現視頻錄制與壓縮,博主博客:利用FFmpeg玩轉Android視頻錄制與壓縮(一) - CSDN博客 http://blog.csdn.net/mabeijianxi/article/details/63335722

下面主要講解如何把此項目引進自己的工程并做適當修改為符合自身項目滴。

博主講解了使用方法https://github.com/mabeijianxi/small-video-record使用方法中文文檔,此處純粹記錄一下自己引進的具體步驟。

使用導入SmallVideoLib2的方法實現。

引進步驟:

1.下載源碼GitHub - mabeijianxi/small-video-record: 利用FFmpeg視頻錄制微信小視頻與其壓縮處理 https://github.com/mabeijianxi/small-video-record下面的操作使用的是SmallVideoRecord2的源代碼。

2.新建一個自己的項目,此處名為“TestDemo”, 使用Androidstudio2.3.3

3.把“SmallVideoRecord2”工程里的"all_lib"文件夾

拷進自己的工程“TestDemo"中

4.為自己的工程引進module——SmallVideoLib2

5.把“SmallVideoRecord2”工程里的“sample”中的與界面布局、activity代碼相關的東西全部復制進自己的工程,然后刷新運行程序,完成啦~~~,接下來就是研究理解源代碼,為自己的項目定制功能啦

修改:

1.視頻文件保存路徑
博主原先是保存在SD卡DCIM文件下的,改為指定文件夾保存。
先添加兩個方法,用于生成或獲得指定的文件夾路徑:

/*** 獲取SD卡路徑** @return*/public static String getSDPath() {File sdDir = null;// 判斷sd卡是否存在boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);if (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();//獲取根目錄return sdDir.toString();}return null;}/*** 獲取錄制視頻的路徑* @return*/public static String getVideoRecordDir(){String dirPath = getSDPath();dirPath += "/" + "videorecordcompress";File file = new File(dirPath);if(!file.exists()){file.mkdir();}dirPath +="/"+"videorecord";file = new File(dirPath);if(!file.exists()){file.mkdir();}return dirPath;}

private static File recordDir;//錄制文件
在MainActivity中的initSmallVideo方法中進行接下來的修改:

public static void initSmallVideo() {// 設置拍攝視頻緩存文件夾的路徑 // File dcim = Environment // .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); // if (DeviceUtils.isZte()) { // if (dcim.exists()) { // JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/"); // } else { // JianXiCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/", // "/sdcard-ext/") // + "/mabeijianxi/"); // } // } else { // JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/"); // }recordDir = new File(getVideoRecordDir()); JianXiCamera.setVideoCachePath(recordDir.getAbsolutePath()); // 初始化拍攝JianXiCamera.initialize(false, null);}

2.為錄制的視頻指定名字

在MediaRecorderActivity中的initMediaRecorder方法里修改:
先添加此方法:

/**獲取系統時間- 視頻保存的時間*/public static String getCurrentDate() {SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");Date curDate = new Date(System.currentTimeMillis());String date = formatter.format(curDate);return date;}

再修改key的值:

if (!FileUtils.checkFile(f)) {f.mkdirs();}//錄制的視頻名字、路徑String key = getCurrentDate(); //String.valueOf(System.currentTimeMillis());mMediaObject = mMediaRecorder.setOutputDirectory(key,JianXiCamera.getVideoCachePath() + "/" + key);mMediaRecorder.setSurfaceHolder(mSurfaceView.getHolder());mMediaRecorder.prepare();//錄制的視頻名字、路徑String key = getCurrentDate(); //String.valueOf(System.currentTimeMillis());mMediaObject = mMediaRecorder.setOutputDirectory(key,JianXiCamera.getVideoCachePath() + "/" + key);mMediaRecorder.setSurfaceHolder(mSurfaceView.getHolder());mMediaRecorder.prepare();

3.壓縮指定路徑下的視頻
原先是打開文件選擇對話框,進行選擇任一視頻。

/*** 壓縮指定視頻文件* @param videoFilePath*/private void compressVideo(String videoFilePath){File file = new File(videoFilePath);if(!file.exists()){Toast.makeText(this, "視頻文件不存在,無法執行壓縮操作", Toast.LENGTH_SHORT).show();return;}BaseMediaBitrateConfig compressMode = null;int compressModeCheckedId = rg_only_compress_mode.getCheckedRadioButtonId();if (compressModeCheckedId == R.id.rb_cbr) {String bitrate = et_only_compress_bitrate.getText().toString();if (checkStrEmpty(bitrate, "請輸入壓縮額定碼率")) {return;}compressMode = new CBRMode(166, Integer.valueOf(bitrate));} else if (compressModeCheckedId == R.id.rb_auto) {String crfSize = et_only_compress_crfSize.getText().toString();if (TextUtils.isEmpty(crfSize)) {compressMode = new AutoVBRMode();} else {compressMode = new AutoVBRMode(Integer.valueOf(crfSize));}} else if (compressModeCheckedId == R.id.rb_vbr) {String maxBitrate = et_only_compress_maxbitrate.getText().toString();String bitrate = et_only_compress_bitrate.getText().toString();if (checkStrEmpty(maxBitrate, "請輸入壓縮最大碼率") || checkStrEmpty(bitrate, "請輸入壓縮額定碼率")) {return;}compressMode = new VBRMode(Integer.valueOf(maxBitrate), Integer.valueOf(bitrate));} else {compressMode = new AutoVBRMode();}if (!spinner_only_compress.getSelectedItem().toString().equals("none")) {compressMode.setVelocity(spinner_only_compress.getSelectedItem().toString());}String sRate = et_only_framerate.getText().toString();String scale = et_only_scale.getText().toString();int iRate = 0;float fScale = 0;if (!TextUtils.isEmpty(sRate)) {iRate = Integer.valueOf(sRate);}if (!TextUtils.isEmpty(scale)) {fScale = Float.valueOf(scale);}LocalMediaConfig.Buidler buidler = new LocalMediaConfig.Buidler();final LocalMediaConfig config = buidler.setVideoPath(videoFilePath).captureThumbnailsTime(1).doH264Compress(compressMode).setFramerate(iRate).setScale(fScale).build();new Thread(new Runnable() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {showProgress("", "壓縮中...", -1);}});OnlyCompressOverBean onlyCompressOverBean = new LocalMediaCompress(config).startCompress();runOnUiThread(new Runnable() {@Overridepublic void run() {hideProgress();}});Intent intent = new Intent(MainActivity.this, SendSmallVideoActivity.class);intent.putExtra(MediaRecorderActivity.VIDEO_URI, onlyCompressOverBean.getVideoPath());intent.putExtra(MediaRecorderActivity.VIDEO_SCREENSHOT, onlyCompressOverBean.getPicPath());startActivity(intent);}}).start();}

修改MainActivity中的choose方法:

public void choose(View v) {// Intent it = new Intent(Intent.ACTION_GET_CONTENT, // android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI); // // it.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*"); // startActivityForResult(it, CHOOSE_CODE);String videoFilePath = recordDir.getAbsolutePath() + "/videorecord1519898039101/1519898039101.mp4";compressVideo(videoFilePath);}

4.為壓縮視頻指定保存的路徑

private static File compressDir;//壓縮文件 /*** 獲取SD卡路徑** @return*/public static String getSDPath() {File sdDir = null;// 判斷sd卡是否存在boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);if (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();//獲取根目錄return sdDir.toString();}return null;} /*** 獲取壓縮視頻的路徑* @return*/public static String getVideoCompressDir(){String dirPath = getSDPath();dirPath += "/" + "videorecordcompress";File file = new File(dirPath);if(!file.exists()){file.mkdir();}dirPath +="/"+"videocompress";file = new File(dirPath);if(!file.exists()){file.mkdir();}return dirPath;}

在JianXiCamera里添加:

/** 視頻壓縮路徑 */private static String mVideoCompressPath;/** 獲取視頻壓縮文件夾 */public static String getVideoCompressPath() {return mVideoCompressPath;}/** 設置視頻壓縮路徑 */public static void setVideoCompressPath(String path) {File file = new File(path);if (!file.exists()) {file.mkdirs();}mVideoCompressPath = path;}

現在MainActivity中的initSmallVideo方法就應該為:

public static void initSmallVideo() {// 設置拍攝視頻緩存文件夾的路徑 // File dcim = Environment // .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); // if (DeviceUtils.isZte()) { // if (dcim.exists()) { // JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/"); // } else { // JianXiCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/", // "/sdcard-ext/") // + "/mabeijianxi/"); // } // } else { // JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/"); // }recordDir = new File(getVideoRecordDir());compressDir = new File(getVideoCompressDir());JianXiCamera.setVideoCachePath(recordDir.getAbsolutePath());JianXiCamera.setVideoCompressPath(compressDir.getAbsolutePath());// 初始化拍攝JianXiCamera.initialize(false, null);}

5.修改壓縮視頻的名字:
在LocalMediaCompress里的public OnlyCompressOverBean startCompress() 方法中進行修改key的值:

File f = new File(JianXiCamera.getVideoCachePath());if (!FileUtils.checkFile(f)) {f.mkdirs();}//壓縮后的視頻文件名字、路徑String key = getCurrentDate();//String.valueOf(System.currentTimeMillis());mMediaObject = setOutputDirectory(key,JianXiCamera.getVideoCompressPath() + "/" + key);mMediaObject.setOutputTempVideoPath(mNeedCompressVideo); /*** 獲取系統時間- 視頻保存的時間** @return*/public static String getCurrentDate() {SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");Date curDate = new Date(System.currentTimeMillis());String date = formatter.format(curDate);return date;}

6.其他一些修改就不寫了,花時間慢慢研究肯定值得滴

推薦學習網址:

1.首先肯定是使用的源代碼博主滴博客啦( ̄▽ ̄)/利用FFmpeg玩轉Android視頻錄制與壓縮(一) - CSDN博客 http://blog.csdn.net/mabeijianxi/article/details/63335722
2.在視頻影音方面特別厲害的博主最簡單的基于FFmpeg的移動端例子:Android HelloWorld - CSDN博客 http://blog.csdn.net/leixiaohua1020/article/details/47008825/

總結

以上是生活随笔為你收集整理的视频:使用FFMpeg实现视频录制与压缩的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。