9.用FFmpeg测试H.264文件的解码时间
1. Essence of Method
要测试对H.264文件的解码时间,可以使用FFmpeg进行操作。FFmpeg是一个开源的多媒体处理工具,可以用来处理视频和音频文件,包括解码H.264文件。以下是使用FFmpeg的命令行来测试解码时间的方法:
ffmpeg -i input.h264 -f null -
这个命令会将输入的input.h264
文件解码到空输出,通过查看FFmpeg的输出信息,可以得到解码的耗时信息。
在FFmpeg中,-i
选项用于指定输入文件,后面跟着输入文件的路径。例如,-i input.h264
表示将input.h264
作为输入文件。
-f
选项用于指定输出格式。在上面的示例中,-f null
表示将输出格式设置为null,这意味着不生成任何输出文件,仅仅执行解码操作。
2. Can the FFmpeg be Used Normally?
要检查是否安装了FFmpeg,并查看其版本号,可以在命令行中运行以下命令:
ffmpeg -version
如果安装了FFmpeg,将会显示版本信息。如果未安装,系统可能会显示命令未找到或类似的消息。要安装FFmpeg,请参考官方文档。
PS C:\Users\Administrator> ffmpeg -version
ffmpeg version 2022-09-22-git-af919cf780-essentials_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
libavutil 57. 36.102 / 57. 36.102
libavcodec 59. 44.100 / 59. 44.100
libavformat 59. 32.100 / 59. 32.100
libavdevice 59. 8.101 / 59. 8.101
libavfilter 8. 49.100 / 8. 49.100
libswscale 6. 8.112 / 6. 8.112
libswresample 4. 9.100 / 4. 9.100
libpostproc 56. 7.100 / 56. 7.100
3. How?
在FFmpeg输出信息中,可以看到解码过程的耗时信息。怎么看解码耗时多久?
可以找到类似以下格式的行,其中包含了解码过程的耗时信息:
frame= 250 fps=0.0 q=0.0 size=N/A time=00:00:10.00 bitrate=N/A speed=19.6x
在这个例子中,time=00:00:10.00
表示解码了10秒钟的视频。可以根据这个信息计算解码的平均速度。
在这个例子中,各个字段的含义如下:
frame
: 已解码的帧数。fps
: 每秒钟解码的帧数,即帧率。q
: 压缩质量指标,一般不关注。size
: 输出文件大小。time
: 已解码的时间。bitrate
: 比特率,表示每秒传输的数据量。speed
: 解码速度,表示相对于实时播放速度的倍数。
4. Basic Examples
1)有一组H.264文件若干个,测试解码完这些文件耗时。import subprocess
import time# H.264文件列表
file_list = ['file1.h264', 'file2.h264', 'file3.h264']# 开始计时
start_time = time.time()# 解码每个文件
for file in file_list:subprocess.run(['ffmpeg', '-i', file, '-f', 'null', '-'])# 计算总耗时
end_time = time.time()
total_time = end_time - start_time
print(f"解码耗时: {total_time} 秒")
这个脚本会逐个解码文件,并计算整个过程的总耗时。
2) 在Android手机设备上怎么测试H.264的解码时间
在Android手机设备上测试H.264的解码时间可以使用Android的MediaCodec API。这个API可以用来解码视频,并提供了一些回调函数来监测解码进度。
import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;import java.io.IOException;
import java.nio.ByteBuffer;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {long startTime = System.currentTimeMillis();MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource(Environment.getExternalStorageDirectory().getPath() + "/test.h264");} catch (IOException e) {e.printStackTrace();}MediaFormat format = extractor.getTrackFormat(0);String mime = format.getString(MediaFormat.KEY_MIME);MediaCodec codec = MediaCodec.createDecoderByType(mime);codec.configure(format, null, null, 0);codec.start();ByteBuffer[] inputBuffers = codec.getInputBuffers();ByteBuffer[] outputBuffers = codec.getOutputBuffers();MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();boolean isEOS = false;long time = 0;while (!isEOS) {int inputBufferIndex = codec.dequeueInputBuffer(10000);if (inputBufferIndex >= 0) {ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];int sampleSize = extractor.readSampleData(inputBuffer, 0);if (sampleSize < 0) {codec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);isEOS = true;} else {time = extractor.getSampleTime();codec.queueInputBuffer(inputBufferIndex, 0, sampleSize, time, 0);extractor.advance();}}int outputBufferIndex = codec.dequeueOutputBuffer(info, 10000);if (outputBufferIndex >= 0) {ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];codec.releaseOutputBuffer(outputBufferIndex, true);}}codec.stop();codec.release();long endTime = System.currentTimeMillis();long elapsedTime = endTime - startTime;System.out.println("解码耗时:" + elapsedTime + "毫秒");}}).start();}
}
NOTE : 需要替换setDataSource()方法中的文件路径为你要测试的H.264文件路径。
5. Practical Examples
有一个文件目录里都是H.264的文件。文件名字是“(0,0)tile0crf15.264”,“(0,0)tile0crf17.264”,“(0,0)tile0crf19.264”,“(0,0)tile0crf21.264”,和 (0,0)tile0crf23.264等等共10000个文件。 写一个脚本,自动读取这个目录的文件,会根据文件名中的CRF值将文件分类,并使用FFmpeg解码每个文件,然后计算每个CRF值的平均解码时间。比如测试解码文件为xxxcrf17.264的平均时间是多少,测试解码文件为xxxcrf19.264的平均时间是多少,测试解码文件为xxxcrf21.264的平均时间是多少。
import os
import subprocess# H.264文件所在目录
directory = 'files/'# 不同crf值的文件名列表
crf_files = {15: [],17: [],19: [],21: [],23: []
}# 根据文件名分类
for filename in os.listdir(directory):if filename.endswith(".264"):crf = int(filename.split('crf')[1].split('.')[0])crf_files[crf].append(filename)# 解码每个文件并计算平均时间
for crf, files in crf_files.items():total_time = 0for file in files:command = ['ffmpeg', '-i', os.path.join(directory, file), '-f', 'null', '-']process = subprocess.Popen(command, stderr=subprocess.PIPE)for line in iter(process.stderr.readline, b''):line = line.decode('utf-8')if 'time=' in line:time_str = line.split('time=')[1].split()[0]time = float(time_str.replace(':', ''))total_time += timeprint(f"解码文件 {file} 的进度: {time_str}")process.communicate()process.wait()avg_time = total_time / len(files) if len(files) > 0 else 0print(f"测试解码文件为xxxcrf{crf}.264的平均时间是 {avg_time} 秒")
解码文件 (0,0)tile0crf15.264 的进度: 00:00:00.04
测试解码文件为xxxcrf15.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf17.264 的进度: 00:00:00.04
测试解码文件为xxxcrf17.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf19.264 的进度: 00:00:00.04
测试解码文件为xxxcrf19.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf21.264 的进度: 00:00:00.04
测试解码文件为xxxcrf21.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf23.264 的进度: 00:00:00.04
测试解码文件为xxxcrf23.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf27.264 的进度: 00:00:00.04
测试解码文件为xxxcrf27.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf32.264 的进度: 00:00:00.04
测试解码文件为xxxcrf32.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf37.264 的进度: 00:00:00.04
测试解码文件为xxxcrf37.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf41.264 的进度: 00:00:00.04
测试解码文件为xxxcrf41.264的平均时间是 0.04 秒
解码文件 (0,0)tile0crf45.264 的进度: 00:00:00.04
测试解码文件为xxxcrf45.264的平均时间是 0.04 秒
对于质量相同但内容不同的H.264文件,解码时间可能会有一些差别,但差别通常不会很大。质量相同的文件表示它们在编码时使用的压缩参数相似,因此解码时的工作量也应该相似。然而,由于视频内容的不同可能会导致一些微小的差异,例如帧类型的分布、运动复杂度等,这些差异可能会导致解码时间略有不同。
总的来说,对于质量相同但内容不同的H.264文件,解码时间的差别通常不会很大,但可能会有一些轻微的变化。
对于内容相同但质量不同的H.264文件,解码时间可能会有一些特性,具体取决于编码时所使用的压缩参数和视频内容的复杂性。一般来说,质量较高的H.264文件(即低压缩率、较高码率)可能会导致解码时间稍长,因为解码器需要更多的计算来恢复更精细的图像质量。
另一方面,质量较低的H.264文件(即高压缩率、较低码率)可能会解码得更快,因为解码器需要处理的数据量更少。
但在某些情况下,质量较低的文件可能会因为压缩算法的特性而导致解码时间略有增加,例如出现了更多的预测误差或者需要更多的解码步骤来恢复图像细节。
相关文章:

9.用FFmpeg测试H.264文件的解码时间
1. Essence of Method 要测试对H.264文件的解码时间,可以使用FFmpeg进行操作。FFmpeg是一个开源的多媒体处理工具,可以用来处理视频和音频文件,包括解码H.264文件。以下是使用FFmpeg的命令行来测试解码时间的方法: ffmpeg -i in…...
重建3D结构方式 | 显式重建与隐式重建(Implicit Reconstruction)
在3D感知领域,包括3D目标检测在内,显式重建和隐式重建是两种不同的方法来表示和处理三维数据。它们各自有优势和局限,适用于不同的场景和需求。 显式重建(Explicit Reconstruction) 显式重建是指直接构建场景或物体的三…...
模型的参数量、计算量、延时等的关系
模型的参数量、计算量、延时等的关系 基本概念相互关系代码计算 基本概念 1.参数量:Params 2.计算量:FLOPs,Floating Point Operations,浮点运算次数,用来衡量模型计算复杂度。 3.延时:Latency 4.内存访问…...
Java映射(含源码)
在Java中,“映射”(Map)是一个存储键值对的数据结构,允许你通过键(Key)快速访问值(Value)。映射中的每个键都是唯一的,这意味着每个键都对应一个特定的值。Java提供了几种…...

JMeter 面试题及答案整理,最新面试题
JMeter中如何进行性能测试的规划和设计? 进行JMeter性能测试的规划和设计主要遵循以下几个步骤: 1、确定测试目标: 明确性能测试的目的和目标,比如确定要测试的系统性能指标(如响应时间、吞吐量、并发用户数等&#…...

lua脚本的基础内容
官方地址:http://luajit.org/ 官方wiki地址:http://wiki.luajit.org/Home 推荐书籍: OpenResty 最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/ lua基础文档:https://www.runoob.com/l…...

MySQL语法分类 DDL(1)
DDL(1)(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…...

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片
苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…...
Lua中文语言编程源码-第三节,更改lualib.h Lua标准库, 使Lua支持中文关键词(与所有的基础库相关)
源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lualib.h,是Lua的标准库模块。 Lua标准库一共有有个10个库,base, 基本用不着改,所以没加中文名称。 函数声明宏名英文库名中文库…...

Vue | 使用 ECharts 绘制折线图
目录 一、安装和引入 ECharts 二、使用 ECharts 2.1 新增 div 盒子 2.2 编写画图函数 2.3 完整代码结构 三、各种小问题 3.1 函数调用问题 3.2 数据格式问题 3.3 坐标轴标签问题 3.4 间隔显示标签 参考博客:Vue —— ECharts实现折线图 本文是在上…...

NVENC 视频编码器 API 编程指南 ( 中文转译 )
基于 NVIDIA Kepler™ 和更高版本 GPU 架构的 NVIDIA GPU 包含基于硬件的 H.264/HEVC/AV1 视频编码器(以下简称 NVENC)。NVENC 硬件采用 YUV/RGB 作为输入,并生成符合H.264/HEVC/AV1 标准的视频比特流。可以使用 NVIDIA 视频编解码器 SDK 中提…...

媒体发稿:澳门媒体发稿7个流程
推广平台澳门是一个重要的度假旅游娱乐终点,都是媒体领域热议的话题。对于澳门的媒体发稿营销推广要求,大家提供了一个简单易用的套餐系统软件,帮助大家在澳门媒体上发表推广文章。下面我们就根据7个阶段,详解构建这一套餐推广平台…...

Spring Web MVC入门(2)
学习Spring MVC Postman介绍 在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题. 那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman. 界面介绍: 传参的介绍 1.普通传参, 也就…...

tomcat 实现会话绑定
Tomcat 后端服务器实现 Session ID会话保持 基础架构: 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试: 此时刷新,会话ID一直在变,这样不好 如何解决呢? 不好的是确定ip之后,会一直在一台机上…...
Android Studio中快速修改包名
Android Studio中快速修改包名 假设原包名是com.abc.efg, 新包名是com.aaa.bbb 1、点击齿轮图标,把Compact Middle Packages前面的对勾取消,如果没有就忽略此步 2、在左侧项目栏中,选择Android, App-->java-->com,下面可以看…...

solr/ES 分词插件Jcseg设置自定义词库
步骤: 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置: 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径,我们这个配置可以自定义…...

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)
概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关,从而实现智能物联。NodeMCU 是基于 Lua 的开源固件,ESP8266-NodeMCU是一个开源硬件开发板,支持WiFi功能&a…...

CSS扩展选择器
文章目录 1. 并集选择器2. 交集选择器3. 后代选择器4. 子代选择器5. 兄弟选择器5.1. 相邻兄弟选择器5.2. 通用兄弟选择器 6. 属性选择器7. 伪类选择器7.1. 动态伪类7.2. 结构伪类7.3. 否定伪类 8. 伪元素选择器9. Google 改进案例 1. 并集选择器 选中多个选择器对应的元素。一…...

知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会
在区块链技术的风起云涌和Web3生态的蓬勃发展中,知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit(),此次大会将为全球区块链开发者及业…...

电脑那个部件坏了或者是哪个软件需要修复来看价钱
电脑维修价格表是多少? 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多,而且会以各种奇怪的方式出现问题,下面我们就来看看具体的充电方法。 电脑维修价格表: 1. 重新安装系统。 安装XP系统通常需…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...