apS*_*TRK 3 video encoding android opencv ffmpeg
我希望能够拍摄使用Android设备录制的视频,并使用我的应用将其编码为新的分辨率和帧速率.目的是上传一个小得多的原始视频版本(大小),因为这将是30分钟或更长的视频.
到目前为止,我已经读到人们说FFmpeg是他们的出路.但是,文档似乎缺乏.
我也考虑过使用http opencv http://opencv.org/platforms/android.html
考虑到我需要操纵视频分辨率和帧速率,您认为哪种工具可以做得更好?还有其他技术需要考虑吗?
一个重要的问题是,因为这将是长视频,在Android设备中进行编码是合理的(考虑电源,时间等)
提前致谢!
我决定使用ffmpeg来解决这个项目.经过大量的研究和试验,我无法为库构建ffmpeg(使用Ubuntu 14.04 LTS.)
但是,我使用了这个优秀的库https://github.com/guardianproject/android-ffmpeg-java 我刚刚创建了一个项目,并添加了该库,它就像一个魅力.无需构建自己的文件或乱用Android NDK.当然,如果要自定义库,您仍然需要自己构建库.但它拥有我需要的一切.
以下是我用来降低视频分辨率和更改帧速率的示例:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// input source
final Clip clip_in = new Clip("/storage/emulated/0/Developer/test.mp4");
Activity activity = (Activity) MainActivity.this;
File fileTmp = activity.getCacheDir();
File fileAppRoot = new File(activity.getApplicationInfo().dataDir);
final Clip clip_out = new Clip("/storage/emulated/0/Developer/result2.mp4");
//put flags in clip
clip_out.videoFps = "30";
clip_out.width = 480;
clip_out.height = 320;
clip_out.videoCodec = "libx264";
clip_out.audioCodec = "copy";
try {
FfmpegController fc = new FfmpegController(fileTmp, fileAppRoot);
fc.processVideo(clip_in, clip_out, false, new ShellUtils.ShellCallback() {
@Override
public void shellOut(String shellLine) {
System.out.println("MIX> " + shellLine);
}
@Override
public void processComplete(int exitValue) {
if (exitValue != 0) {
System.err.println("concat non-zero exit: " + exitValue);
Log.d("ffmpeg","Compilation error. FFmpeg failed");
Toast.makeText(MainActivity.this, "result: ffmpeg failed", Toast.LENGTH_LONG).show();
} else {
if(new File( "/storage/emulated/0/Developer/result2.mp4").exists()) {
Log.d("ffmpeg","Success file:"+ "/storage/emulated/0/Developer/result2.mp4");
}
}
}
});
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// automated try and catch
setContentView(R.layout.activity_main);
}
}
Run Code Online (Sandbox Code Playgroud)
该函数processVideo
产生类似于的命令ffmpeg -i input -s 480X320 -r 30 -vcodec libx264 -acodec copy output
这是一个非常简单的例子,但它输出了ffmpeg桌面完成的同类转换.这个代码需要大量的工作!我希望它可以帮助任何人.
归档时间: |
|
查看次数: |
6042 次 |
最近记录: |