所以,我正在为Android开发一个自定义视频播放器,但我需要播放超过Android支持的视频文件(mp4,3gp ...),如wmv,avi,flv.
此时我已经将任何视频类型转换为.mp4并且我可以在重新编码后播放它们,但我不知道如何在不将它们重新编码为mp4的情况下播放这些wmv,avi文件.
我有什么方法可以在Android上播放任何视频而无需重新编码吗?JavaCV + FFmpeg库已经工作,只是不知道该怎么做.
顺便说一句,继承人我用来重新编码视频的代码:
public static void convert(File file) {
FFmpegFrameGrabber frameGrabber =
new FFmpegFrameGrabber(file.getAbsolutePath());
IplImage captured_frame = null;
FrameRecorder recorder = null;
recorder = new FFmpegFrameRecorder("/mnt/sdcard/external_sd/videosteste/primeiroteste.mp4", 300, 300);
recorder.setVideoCodec(13);
recorder.setFrameRate(30);
recorder.setFormat("mp4");
try {
recorder.start();
frameGrabber.start();
while (true) {
try {
captured_frame = frameGrabber.grab();
if (captured_frame == null) {
System.out.println("!!! Failed cvQueryFrame");
break;
}
recorder.record(captured_frame);
} catch (Exception e) {
}
}
recorder.stop();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 这是我的问题,我已经使用Red5实现了一个服务器端应用程序,它发送H.264编码的直播流,在客户端,流被接收为byte []
为了在Android客户端端解码它我已经跟随Javacv- FFmpeg库.解码代码如下
public Frame decodeVideo(byte[] data,long timestamp){
frame.image = null;
frame.samples = null;
avcodec.av_init_packet(pkt);
BytePointer video_data = new BytePointer(data);
avcodec.AVCodec codec = avcodec.avcodec_find_decoder(codec_id);
video_c = null;
video_c = avcodec.avcodec_alloc_context3(codec);
video_c.width(320);
video_c.height(240);
video_c.pix_fmt(0);
video_c.flags2(video_c.flags2()|avcodec.CODEC_FLAG2_CHUNKS);
avcodec.avcodec_open2(video_c, codec, null))
picture = avcodec.avcodec_alloc_frame()
pkt.data(video_data);
pkt.size(data.length);
int len = avcodec.avcodec_decode_video2(video_c, picture, got_frame, pkt);
if ((len >= 0) && ( got_frame[0] != 0)) {
....
process the decoded frame into **IPLImage of Javacv** and render it with **Imageview** of Android …Run Code Online (Sandbox Code Playgroud) 您好我使用https://github.com/bytedeco/javacv/录制视频.使用横向模式时,方向很好但是当我将方向更改为纵向模式时,视频旋转-90度.任何机构都知道我可能做错了什么.这是代码.
package org.bytedeco.javacv_android_example.record;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_imgproc;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv_android_example.R;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class RecordActivity …Run Code Online (Sandbox Code Playgroud) 不久前得到了O'Reilly的"学习OpenCV"一书,从那以后我一直在忙着将我看到的所有示例代码从OpenCV转换为JavaCV,通常也会进行一些我自己的修改.我一直试图尽可能地保持纯OpenCV(C语言)代码并避免使用Java.例如,我直接通过JavaCV中的OpenCV highgui包实现了所有的接口元素,而不是通过Java Swing.通过这样做,我希望以相对较短的顺序学习OpenCV库和一些C,以及建立一个有用的函数库,如果我决定稍后切换到纯OpenCV,我将能够轻松地转换为C.
无论如何,我对C知之甚少,有时在处理指针时会遇到麻烦.本书推荐使用以下代码作为迭代3通道矩阵的最佳方法:
float sum( const CvMat* mat ) {
float s = 0.0f;
for(int row=0; row<mat->rows; row++ ) {
const float* ptr = (const float*)(mat->data.ptr + row * mat->step);
for( col=0; col<mat->cols; col++ ) {
s += *ptr++;
}
}
return( s );
}
Run Code Online (Sandbox Code Playgroud)
以下是此代码的附加说明:
在将指针计算到矩阵中时,请记住矩阵元素数据是联合.因此,在取消引用此指针时,必须指示union的正确元素才能获得正确的指针类型.然后,要设置该指针,必须使用矩阵的step元素.如前所述,step元素以字节为单位.为了安全起见,最好以字节为单位进行指针运算,然后>转换为适当的类型,在本例中为float.虽然CVMat结构具有>高度和宽度的概念,以便与旧的IplImage结构兼容,但我们>使用更新的行和列.最后,请注意我们为每一行重新计算ptr,而不是简单地从开头开始,然后在每次读取时递增该指针.这可能看起来过多,但由于CvMat数据指针可能只指向较大数组中的ROI,因此无法保证数据在行之间是>连续的.
但是我无法将其转换为JavaCV.ptr字段(指针)似乎是一个浮点数,这让我很困惑.我认为它实际上不是一个"指针",而是一个值,每个像素的值被添加到其中?或者它实际上是一个指针,s值找到给定行中所有列的总和?
无论如何,如果有人为我发布一些JavaCV代码以获得公平的循环,我将非常感激.我知道有其他方法可以访问CvMat中的每个像素,但是AFAIK它们效率低或不准确.
我正在使用JavaCV(OpenCV包装器)进行硬币检测,但是当硬币连接时我有一点问题.如果我试图侵蚀它们以分离这些硬币,它们会松开它们的圆形形状,如果我试图计算每个硬币内部的像素,就会出现问题,因此一些硬币可能被错误地计算为更大的硬币.我想要做的是首先重塑它们并使它们像一个圆圈(等于该硬币的半径),然后计算它们内部的像素.
这是我的阈值图像:
这里是被侵蚀的图像:
有什么建议?或者有没有更好的方法来打破硬币之间的桥梁?
我正在开发关于javacv的项目,我需要知道如何识别以下图像并使用特定颜色填充图像?
我尝试通过这个问题,这是我使用的图像

我尝试通过这段代码,并在javacv中开发了一个代码
import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.CanvasFrame;
import static com.googlecode.javacpp.Loader.*;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import java.io.File;
import javax.swing.JFileChooser;
public class PolyGonIdentification {
public static void main(String[] args) {
CanvasFrame cnvs=new CanvasFrame("Polygon");
cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
CvMemStorage storage=CvMemStorage.create();
CvSeq squares = new CvContour();
squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage);
JFileChooser f=new JFileChooser();
int result=f.showOpenDialog(f);//show dialog box to choose files
File myfile=null;
String path="";
if(result==0){
myfile=f.getSelectedFile();//selected file taken to myfile
path=myfile.getAbsolutePath();//get the path of the file
}
IplImage …Run Code Online (Sandbox Code Playgroud) 我希望将sdcard图像转换为android中的视频.经过多次搜索,我发现它有可能在javacv.when我在纯java中尝试简单的javacv示例,它在我的eclipse中工作完美.但是当我变成android时,同样的示例不在android.i下载中运行,并在myproject-> libs/armeabi文件夹中添加所有.jar文件和.so文件.我的项目没有显示任何错误.但是在运行时发生错误.
我尝试这堂课,
package com.example.ndkfoo_sample;
import static com.googlecode.javacv.cpp.opencv_core.cvReleaseImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvShowImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvWaitKey;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_GAUSSIAN;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvSmooth;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
// @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IplImage img=cvLoadImage("helloworld.jpg");
cvShowImage("/mnt/sdcard/helloworld",img);
cvSmooth(img,img,CV_GAUSSIAN,13);
cvShowImage("Blur-Image",img);
cvWaitKey();
cvReleaseImage(img);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我的错误就像,
opencv error unspecified error.
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在android.is中集成opencv/javacv任何步骤或教程.
谢谢,
这是我在这里的第一篇文章,所以如果我的问题不清楚或者提供的信息不足,我很抱歉.
我目前正在开发一款能够识别照片中脸部的Android应用程序.
我的第一个方法是使用JavaCV并且一切正常,除了面部检测需要花费太多时间才能完成的事实!
之后,我尝试使用FaceDetector.Face检测面部.然后我使用检测到的面部来训练我的脸部识别器模型.到目前为止没有发现任何错误.
我的问题是我的模型无法识别FaceDetector.Face给出的任何检测到的面部.我总是从预测函数得到-1.有人能说出什么可能是错的吗?先感谢您!
这是我在检测后裁剪面部的方法:
for(int count=0;count<NUMBER_OF_FACE_DETECTED;count++)
{
Face face=detectedFaces[count];
PointF midPoint=new PointF();
face.getMidPoint(midPoint);
eyeDistance=face.eyesDistance();
left = midPoint.x - (float)(1.4 * eyeDistance);
top = midPoint.y - (float)(1.8 * eyeDistance);
bmFace = Bitmap.createBitmap(origiImage, (int) left, (int) top, (int) (2.8 * eyeDistance), (int) (3.6 * eyeDistance));
bmFaces.add(bmFace);
}
Run Code Online (Sandbox Code Playgroud)
这是培训模型的主要部分.
MatVector images = new MatVector(imageFiles.length);
int[] labels = new int[imageFiles.length];
IplImage img;
IplImage grayImage;
FaceRecognizer faceRecognizer = createLBPHFaceRecognizer(1, 8, 8, 8, binaryTreshold);
try
{
FileInputStream fstream = new FileInputStream(working_Dir.getAbsolutePath()+"/csv.txt");
BufferedReader br = …Run Code Online (Sandbox Code Playgroud) 我有一个项目,用于收集安装程序(sbt-install4j)的依赖项dependencyClasspath.它大部分时间都有效,除非我有一个特定的依赖:
libraryDependencies += "org.bytedeco" % "javacpp" % "0.10"
Run Code Online (Sandbox Code Playgroud)
"javacpp"不会被添加到dependencyClasspath.您可以创建一个仅包含上述依赖项的简单SBT项目并尝试show dependencyClasspath,它将打印:
[info] List(Attributed(C:\Users\me\.sbt\boot\scala-2.10.4\lib\scala-library.jar))
Run Code Online (Sandbox Code Playgroud)
没有"javacpp".有什么线索可能会发生什么?这是一个SBT错误吗?
我正在使用Windows10,eclipse-neon和JDK1.8版本,我得到以下异常.
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.bytedeco.javacpp.Loader.load(Loader.java:385)
at org.bytedeco.javacpp.Loader.load(Loader.java:353)
at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2719)
at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:391)
at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:385)
at com.segment.processor.AudioMain.main(ApacheMathAudioMain.java:20)
Error getting static method ID of org/bytedeco/javacpp/Loader/putMemberOffset
Run Code Online (Sandbox Code Playgroud)
这是我在pom.xml中使用的依赖项
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg</artifactId>
<version>3.0.2-1.2</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv</artifactId>
<version>3.1.0-1.2</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>0.10</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)