各种格式视频互转(以mp4转NV21视频为例说明)

此文转载于https://blog.csdn.net/water_forever_/article/details/49639259在此特别感谢该作者。
用OpenGL写了段代码,将NV21视频转成RGBA视频并显示,为了测试自己的代码正确性,需要一段1280720的NV21视频测试数据,在此使用mencoder实现。使用mencoder将一段1280720P的mp4视频转成1280*720的NV21格式数据。在此记录。

mencoder 是一款命令行方式的视频处理软件,支持几乎所有的格式的视频转换,可以将任意格式转换到任意格式,有Linux、Windows、MAC版本。

在Windows上实现mp4转NV21的步骤如下:


(1)首先需要下载两个软件

软件1下载地址:
【2007年版本】下载地址:
http://www5.mplayerhq.hu/MPlayer/releases/win32/
找到如下图示的地方
这里写图片描述
楼主是64位系统,选择第一个(x86_64)亲测有效。
下载后解压,随便放哪,建议路径中不要带中文路径
例如:D:\Program Files(x86)\mencoder
软件2下载地址:http://www5.mplayerhq.hu/MPlayer/releases/codecs/
在该页面下载windows-all-xxxx.zip文件,解压,将解压后的文件夹放到前面软件1解压后的文件夹(
D:\Program Files(x86)\mencoder即可)


(2)配置系统环境变量,将“D:\ProgramFiles(x86)\mencoder”加到path(Path)末尾
计算机->属性->高级->环境变量
上述步骤完成后,打开cmd,输入mencoder,如果显示版本号,则说明软件安装成功。但是为了方便操作,还是建议cmd进入到安装目录再输入mencoder。


(3)cmd命令操作,进入安装路径mencoder


(4)转换命令:在cmd窗口输入: mencoder xx.mp4 -ovc raw -of rawvideo -vf format=i420 -o xx.yuv,需要被转换的文件最好放在mencoder 刚才的解压目录,回车,自动开始转换,等待转换完毕

(5)查看生成的NV21数据:生成的xx.yuv就是转换后的NV21数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
,该如何将其换成JPEG格式? 您可以使用Android的ImageReader类来在NV21格式和JPEG格式之间进行换。在将NV21格式的数据传递给ImageReader对象时,ImageReader会自动将其换为JPEG格式。以下是将NV21格式数据换为JPEG格式的示代码段: ``` // 创建一个ImageReader对象来接收NV21格式的数据 ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.NV21, 1); // 将NV21格式数据传递给ImageReader对象 byte[] nv21Data = ...; Image image = reader.acquireLatestImage(); image.getPlanes()[0].getBuffer().put(nv21Data); // 读取JPEG格式的数据 ByteBuffer jpegData = ByteBuffer.allocateDirect(width * height * 3); // JPEG格式占用的内存通常比NV21格式多一些 Image.Plane[] planes = image.getPlanes(); byte[] rowData = new byte[planes[0].getRowStride()]; for (int i = 0; i < planes.length; i++) { int bytesPerPixel = i == 0 ? 1 : 2; // 输入格式NV21,因此只有一种颜色通道是1字节/像素 (Y通道),其余是2字节/像素 (UV通道) int rowStride = planes[i].getRowStride() / bytesPerPixel; int pixelStride = planes[i].getPixelStride() / bytesPerPixel; int offset = 0; ByteBuffer buffer = planes[i].getBuffer(); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { int pixelOffset = col * pixelStride + offset; jpegData.put(buffer.get(pixelOffset + 0)); // 将Y分量复制到输出缓冲区 jpegData.put(buffer.get(pixelOffset + 1)); // 将UV分量复制到输出缓冲区 } offset += rowStride; } } // 停止使用Image对象并释放资源 image.close(); ``` 请注意,此代码段仅用于演示目的,实际使用时可能需要进行一些调整。具体而言,您需要根据NV21格式中的数据布局和JPEG格式中的数据布局来设置读取和写入像素数据的偏移量。此外,您还需要为生成的JPEG数据指定压缩质量等选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值