mjpeg和jpeg和JFIF和AVI的理解,各种码流,视频格式

1.jpeg

其标准文档为ISO_IEC_10918_1

jpeg图片格式详解

WIKI jpeg

JFIFJPEG File Interchange Format,JPEG文件交换格式)详细说明如何从一个JPEG流,产出一个适合于计算机存储和传输(像是在互联网上)的文件。在普遍的用法,当有人称呼一个"JPEG文件",一般而言他是意指一个JFIF文件,或有时候是一个Exif JPEG文件。然而,也有其他以JPEG为基础的文件格式,像是JNG

2.mjpeg

motion-jpeg:就是简单的一系列JFIF码流帧组合在一起,是一种视频编码方式,也可以有.mjpeg格式的文件。

可以用vlc视频直接播放

3.AVI

是一种视频格式,可以包含多种视频编码方式,AVI可以包含MJPEG编码视频,是对mjpeg的视频封装

4.mjpeg,H265,H264,VP8等码流

存储路径为个人百度网盘

在Android上解码MJPEG格式的视频流,你可以使用以下步骤: 1. 添加必要的依赖项。在你的Android项目中,添加对OpenCV的依赖项,以便使用其图像处理功能。在项目的build.gradle文件中,添加以下依赖项: ```groovy implementation 'org.opencv:opencv-android:3.4.13' ``` 2. 创建一个自定义的SurfaceView类,并实现SurfaceHolder.Callback接口,以监听SurfaceView的生命周期事件。 ```java public class MJPEGSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private MJPEGDecoder mjpegDecoder; public MJPEGSurfaceView(Context context) { super(context); getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // 在Surface创建时初始化解码器 mjpegDecoder = new MJPEGDecoder(holder.getSurface()); mjpegDecoder.startDecoding(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 在Surface尺寸发生变化时更新解码器 mjpegDecoder.updateSurface(holder.getSurface()); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 在Surface销毁时停止解码器 mjpegDecoder.stopDecoding(); } } ``` 3. 创建一个MJPEGDecoder类,负责接收和解码MJPEG格式的视频流。 ```java public class MJPEGDecoder { private Surface surface; private boolean isDecoding; public MJPEGDecoder(Surface surface) { this.surface = surface; isDecoding = true; } public void startDecoding() { // 开始解码线程 new Thread(new Runnable() { @Override public void run() { while (isDecoding) { // 从MJPEG视频流中获取数据并解码 byte[] frameData = getFrameDataFromStream(); // 使用OpenCV解码图像 Bitmap frame = decodeFrame(frameData); // 将解码后的帧绘制到Surface上 drawFrameToSurface(frame); } } }).start(); } public void updateSurface(Surface surface) { this.surface = surface; } public void stopDecoding() { isDecoding = false; } private byte[] getFrameDataFromStream() { // 从网络或其他来源获取MJPEG视频流数据 // 返回帧的字节数组 } private Bitmap decodeFrame(byte[] frameData) { // 使用OpenCV解码MJPEG帧 Mat frameMat = Imgcodecs.imdecode(new MatOfByte(frameData), Imgcodecs.IMREAD_UNCHANGED); Bitmap frameBitmap = null; if (!frameMat.empty()) { frameBitmap = Bitmap.createBitmap(frameMat.cols(), frameMat.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(frameMat, frameBitmap); } return frameBitmap; } private void drawFrameToSurface(Bitmap frame) { if (frame != null) { Canvas canvas = surface.lockCanvas(null); if (canvas != null) { canvas.drawBitmap(frame, 0, 0, null); surface.unlockCanvasAndPost(canvas); } } } } ``` 4. 在你的Activity中使用自定义的MJPEGSurfaceView来显示MJPEG视频流。 ```java public class MainActivity extends AppCompatActivity { private MJPEGSurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surface_view); } } ``` 确保在布局文件中添加一个MJPEGSurfaceView元素: ```xml <com.example.MJPEGSurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 这样,你就可以在Android上解码和显示MJPEG格式的视频流了。请确保根据你的需求和网络库进行必要的调整和配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值