一、写入文件

1、变量定义

private FileOutputStream m265FileOutputStream = null;
private File m265File = null;
private static final String HEVC_265_FILE_NAME = "output.265"; // 或 .265
private static final String AVC_264_FILE_NAME = "output.264"; // 或 .265

2、初始化

try {// 获取系统临时目录(通常指向应用私有缓存)String tmpDirPath = System.getProperty("java.io.tmpdir"); // 如:/data/data/com.pkg/cacheFile tmpDir = new File(tmpDirPath, "test");if (!tmpDir.exists()) {tmpDir.mkdirs();}m265File = new File(tmpDirPath, isHevc ? HEVC_265_FILE_NAME : AVC_264_FILE_NAME);m265FileOutputStream = new FileOutputStream(m265File);Log.d(TAG, "开始录制" + (isHevc ? ".265" : ".264") + " 文件: " + m265File.getAbsolutePath());} catch (IOException e) {Log.e(TAG, "无法创建" + (isHevc ? ".265" : ".264") + " 输出文件", e);}

3、编码数据写入.265文件或者.264文件

编码数据一般的onOutputBufferAvailable方法中处理

private MediaCodec.Callback mCallback = new MediaCodec.Callback() {@Overridepublic void onOutputBufferAvailable(MediaCodec mediaCodec, int id, MediaCodec.BufferInfo bufferInfo) {.......if (frameLength > 0 && m265FileOutputStream != null) {try {m265FileOutputStream.write(h264Buff, 0, frameLength);Log.d(TAG, "写入" + (isHevc ? ".265" : ".264") + "文件成功,长度:" + frameLength + " 时间戳:" + alTimestamp);} catch (IOException e) {Log.e(TAG, "写入" + (isHevc ? ".265" : ".264") + " 文件失败", e);}}}
}

4、关闭流

if (mMediaCodec != null) {mMediaCodec.stop();if (m265FileOutputStream != null) {try {m265FileOutputStream.close();Log.d(TAG,  (isHevc ? ".265" : ".264") + " 文件保存完成: " + m265File.getAbsolutePath());} catch (IOException e) {Log.e(TAG, "关闭"+(isHevc ? ".265" : ".264") +"文件失败", e);} finally {m265FileOutputStream = null;}}mMediaCodec.release();mMediaCodec = null;}

二、ffplay分析编码数据

1、adb将文件导出到本地

1、确保已连接到手机,导出文件
265的

adb exec-out run-as com.qukan.qklive cat cache/output.265 > E:/output.265

264的

adb exec-out run-as com.qukan.qklive cat cache/output.264 > E:/output.264

2、ffplay分析编码数据

能看到画面且无报错就是正常的编码数据
265的

ffplay -f hevc -i E:/output.265

264的

ffplay -f h264 -i E:/output.264

查看详细日志在命令后面加上-loglevel trace

ffplay -f hevc -i E:/output.265 -loglevel trace

3、ffprobe查看编码信息

可以看到分辨率等信息

ffprobe -show_streams -show_format E:/output.265

4、ffprobe查看编码错误信息

ffprobe -v warning -i E:/output.265

5、ffmpeg查看编码错误信息

ffmpeg -v error -i E:/output.265 -f null -

三、MP4相关命令

1、将一个 .265 的纯 HEVC 码流文件转换并封装成一个标准的 .mp4 视频文件(无音频)

ffmpeg -i E:/output.265 -c:v libx265 -c:a copy E:/output.mp4

2、查看Mp4信息

查看部分信息

ffprobe -v quiet -show_entries stream=width,height,codec_name,rotate -show_entries format_tags=rotate -print_format flat your_video.mp4

示例结果:

streams.stream.0.width=1920
streams.stream.0.height=1080
streams.stream.0.codec_name=h264
streams.stream.0.rotate=90
format_tags.rotate=90

查看详细信息

ffprobe -v quiet -print_format json -show_streams -show_format E:/output.mp4

示例结果,是一个json:

{"streams": [{"index": 0,"codec_name": "hevc","codec_long_name": "H.265 / HEVC (High Efficiency Video Coding)","profile": "Main","codec_type": "video","codec_tag_string": "hev1","codec_tag": "0x31766568","width": 1280,"height": 720,"coded_width": 1280,"coded_height": 720,"closed_captions": 0,"film_grain": 0,"has_b_frames": 2,"pix_fmt": "yuv420p","level": 93,"color_range": "tv","color_space": "smpte170m","color_transfer": "smpte170m","color_primaries": "bt470bg","chroma_location": "left","field_order": "progressive","refs": 1,"view_ids_available": "","view_pos_available": "","id": "0x1","r_frame_rate": "25/1","avg_frame_rate": "25/1","time_base": "1/12800","start_pts": 0,"start_time": "0.000000","duration_ts": 64000,"duration": "5.000000","bit_rate": "39062","nb_frames": "125","extradata_size": 2488,"disposition": {"default": 1,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0,"non_diegetic": 0,"captions": 0,"descriptions": 0,"metadata": 0,"dependent": 0,"still_image": 0,"multilayer": 0},"tags": {"language": "und","handler_name": "VideoHandler","vendor_id": "[0][0][0][0]","encoder": "Lavc61.26.100 libx265"}}],"format": {"filename": "E:/output.mp4","nb_streams": 1,"nb_programs": 0,"nb_stream_groups": 0,"format_name": "mov,mp4,m4a,3gp,3g2,mj2","format_long_name": "QuickTime / MOV","start_time": "0.000000","duration": "5.000000","size": "29200","bit_rate": "46720","probe_score": 100,"tags": {"major_brand": "isom","minor_version": "512","compatible_brands": "isomiso2mp41","encoder": "Lavf61.9.100"}}
}

3、ffmpeg查看Mp4错误信息

ffmpeg -v error -i E:/output.mp4 -f null -

4、ffmpeg强制旋转MP4视频90度

ffmpeg -i E:/output.mp4 -vf "rotate=90*PI/180" -c:a copy E:/output_rotated.mp4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92318.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92318.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92318.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何打造一支AI时代下的IT团队,为企业战略目标快速赋能

执行摘要 在当前AI技术迅猛发展的背景下,中国中小企业正面临着前所未有的数字化转型机遇与挑战。据最新调研显示,2025年全球AI市场规模将突破5000亿美元,而中国AI应用占比已达35%。与此同时,AI领域人才缺口高达1000万人&#xff0…

机器学习-LinearRegression

1、 关键数学知识点: 边缘概率密度 联合密度对非关注变量积分:fX(x)∫fX,Y(x,y)dyf_X(x)∫f_{X,Y}(x,y)dyfX​(x)∫fX,Y​(x,y)dy; 条件概率密度 切片 fX∣Y(x∣y)fX,Y(x,y)/fY(y)f_{X|Y}(x|y)f_{X,Y}(x,y)/f_Y(y)fX∣Y​(x∣y)fX,Y​(x,y)…

解决微信小程序中如何把npm构建的模块与主包分离,构建到分包上面

1、配置分包2、复制packge.json到分包中3、在project.config.json中增加npm配置4、终端执行npm i下载模块5、构建npm到miniprogram_npm中

自动驾驶中的传感器技术21——Camera(12)

自动驾驶摄像头的图像评测 摄像头的性能受到环境光照、天气条件、运动模糊等因素的影响,因此需要通过多方面的评测来确保其在各种场景下的可靠性。 在自动驾驶领域,图像质量评估不仅关注图像的清晰度、分辨率等传统指标,还需要结合目标检测…

AI+OA原生应用 麦当秀AIPPT

麦当秀也在WAIC期间重新定义AIOA一、什么是“原生AI”?“原生AI”可以理解为:AI系统本身具备完整的办公能力,不需要依赖传统办公软件(如Word、Excel、PPT)作为载体。也就是说,用户可以直接通过AI系统完成文…

K8S 入门操作

之前一直用kubectl这个命令操作,这些都是基于命令来操作K8S kubectl get pods kubectl get nodes kubectl get svc kubectl create deployment... kubectl expose deployment...kubectl 文档 命令行工具 (kubectl) | Kubernetes 命令参考 Kubectl Reference Doc…

蒙文OCR识别技术难点实现及应用场景剖析

一、蒙文OCR识别核心技术难点1. 文字特性带来的识别挑战连写特性:蒙文字符存在复杂的连写形式(词首、词中、词尾变形)方向特异性:传统蒙文为垂直书写(现代也有横排),需特殊方向处理字符相似性&a…

通过docker构建一个java镜像

通过docker构建一个java镜像 FROM zlyxzq/centos7:v1 VOLUME /tmp WORKDIR /app COPY /target/aa.jar /root/app/aa.jarENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENV JAVA_HOME /usr/local/java ENV PA…

SpringBoot学习日记 Day5:解锁企业级开发核心技能

一、前言:从玩具项目到生产系统经过前四天的学习,我们已经能够开发基础功能了。但要让应用真正具备生产价值,还需要掌握数据库高级操作、事务控制、缓存优化等企业级开发技能。今天就来攻克这些关键知识点!二、JPA进阶&#xff1a…

将英文PDF文件完整地翻译成中文的4类方式

文章目录一、在线翻译服务(最快捷,适合临时查看)1.1 代表工具:1.2 操作流程(以Google翻译为例)1.3 优点和缺点1.4 适用场景二、专业软件(最佳平衡,兼顾格式与质量)2.1 代…

【分享】我国八大沙漠空间矢量范围

今天小编整理分享的是 我国八大沙漠空间矢量范围shp。▲ 我国八大沙漠空间矢量范围概况数据概况我国八大沙漠空间矢量范围。中国八大沙漠。分别为腾格里沙漠,塔克拉马干沙漠,巴丹吉林沙漠,库布奇沙漠,乌兰布和沙漠,库…

【音视频】WebRTC C++ native 编译

一、搭建环境 我们这里介绍在Windows10VS2019的环境下编译WebRTC源码,由于WebRTC源码在外网上,需要科学的方式下载,不然下载特别慢,建议直接找国内下载好的源码,这里的源码是2021年的版本:https://pan.bai…

Selenium在Pyhton应用

目录 1. selenium的基本原理 2. selenium环境的搭建步骤 3. 元素的定位和操作 4.元素的基本属性方法 5.浏览器的操作方法 6.三种等待 强制等待 显示等待 隐式等待 7. 键盘与鼠标的操作 鼠标悬停用 拖拽操作 8. 下拉框元素定位 9.页面滚动操作 10. 页面截图操作 S…

【Docker】Redis基础命令在Docker中的使用

文章目录一 Redis 容器化部署指南1 获取 Redis 镜像2 服务启动2.1 首次启动新容器2.2 重启已有容器3 服务验证4 连接 Redis5 数据持久化方案5.1 使用 Docker 卷5.2 启用 AOF 持久化6 容器管理6.1 停止容器6.2 删除容器7 数据清理7.1 清空 Redis 数据7.2 完全移除7.3 删除数据卷…

ubuntu 2024 安装拼音输入法

1. 卸载ibussudo apt remove ibus2. install fcitx5核心组件sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-material-color3. 安装中文语言支持sudo apt install language-pack-zh-hans4. 设置默认输入法im-config -n fcitx55. 配置环境变量sudo vim ~/.bashrc粘贴&am…

语言模型的多个agent

是的,语言模型 在某些情况下确实可以通过多个 agent(代理)来共同协作完成任务。这种设计通常用于复杂任务或需要多步骤处理的场景,具体的流程如下: 1. 什么是 Agent? Agent(代理) 是…

CSS--:root指定变量,其他元素引用

原文网址:CSS--:root指定变量,其他元素引用-CSDN博客 简介 本文介绍CSS中使用变量的方法。 场景描述 CSS可以使用变量,比如:指定整个网页的主体颜色作为变量,其他的元素去使用这个颜色。这样在修改颜色时&#xff…

秋招笔记-8.7

今天先来补充一下关于Unity和UE的一些问题,后续开始深挖项目:Unity关于fixed update和update:同一帧中物理更新优先执行?关于协程:协程是基于迭代器实现的,而迭代器是基于状态机实现的。协程的本质是编译器…

DAY 26 函数专题1:函数定义与参数

浙大疏锦行知识点回顾: 函数的定义变量作用域:局部变量和全局变量函数的参数类型:位置参数、默认参数、不定参数传递参数的手段:关键词参数传递参数的顺序:同时出现三种参数类型时 作业 #作业1 import math def calcul…

跨学科视域下的深层语义分析与人类底层逻辑一致性探索

摘要本文章旨在系统性地探讨一个前沿的交叉学科研究课题:如何通过深层语义分析,探索并建模人类认知中普遍存在的底层逻辑一致性。此研究横跨自然语言处理(NLP)、知识图谱(KG)、认知科学、脑神经科学、系统科…