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 {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {
            @Override
            public 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 = 0
    for 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 += time
                print(f"解码文件 {file} 的进度: {time_str}")

        process.communicate()
        process.wait()

    avg_time = total_time / len(files) if len(files) > 0 else 0
    print(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文件(即高压缩率、较低码率)可能会解码得更快,因为解码器需要处理的数据量更少。

但在某些情况下,质量较低的文件可能会因为压缩算法的特性而导致解码时间略有增加,例如出现了更多的预测误差或者需要更多的解码步骤来恢复图像细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/462554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

01_什么是深度学习

人工智能包含了机器学习&#xff0c;而深度学习是机器学习的一个分支。 人工智能 试图将通常由人类完成的智力任务自动化—这就是人工智能。 用硬编码的方式实现人工智能&#xff0c;这称作符号主义人工智能Symbolic AI。其中包含专家系统。 机器学习 机器学习是一种替代符…

一个接口白嫖四个AI平台, 五个翻译平台

牙叔教程 简单易懂 家人们, 我这标题起的咋样, 请在评论区打出你对标题的评价 今天我们介绍的仓库是 OneYiGitHub - snailuncle/oneyi: 一个翻译接口, 对接多个平台, one译. 完全免费开源, 没有任何限制, 这是一个翻译接口, 他支持以下平台 五个翻译平台 小牛翻译 小牛翻译开…

sparksession对象简介

什么是sparksession对象 spark2.0之后&#xff0c;sparksession对象是spark编码的统一入口对象&#xff0c;通常我们在rdd编程时&#xff0c;需要SparkContext对象作为RDD编程入口&#xff0c;但sparksession对象既可以作为RDD编程对象入口&#xff0c;在sparkcore编程中可以通…

ARP和DDOS攻击防御介绍

学习目标&#xff1a; 1. 如何利用ARP漏洞进行攻击&#xff1f; 2. 怎样有效地防御ARP攻击&#xff1f; 3. 如何应对DDOS攻击&#xff1f; ARP攻击如何产生&#xff1f; ARP如何进行有效防御&#xff1f; ARP基础工作原理&#xff1a; 交换机会根据mac地址表&#xff0c;进行转…

书客护眼落地灯销量火爆,售罄、补货、又断货、再补货!又成断货王!

今日&#xff0c;备受关注的书客Sun护眼大路灯在市场上掀起了一股抢购热潮&#xff0c;作为近年来照明领域中最大的黑马品牌&#xff0c;始终坚持并最求技术创新的书客品牌&#xff0c;在近日发布全新系列落地护眼台灯后&#xff0c;不仅备受消费者青睐&#xff0c;更是成为了新…

C#,T检验(T -Test)的算法与源代码

1 T-Test 学生t检验(英语:Students t-test)是指虚无假设成立时的任一检定统计有学生t-分布的统计假说检定,属于母数统计。学生t检验常作为检验一群来自正态分配母体的独立样本之期望值的是否为某一实数,或是二群来自正态分配母体的独立样本之期望值的差是否为某一实数。举…

ABC345(A-C)

A - Leftrightarrow(100 points) 语法题&#xff0c;输入一个字符串&#xff0c;判断是否是&#xff1a;的样式&#xff0c;输入后只需判断是第一个和最后一个字符是否分别为">"和"<",再判断中间是否都是""即可。 #include<bits/stdc…

【C语言步行梯】C语言实现三子棋游戏(含详细分析)

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实…

sqllab第二十关通关笔记

知识点&#xff1a; cookie注入 可以进行url解析错误注入传参位置 get请求post请求cookie传参 输入admin admin进行登录&#xff0c;抓取当前数据包 通过放包发现是一个302跳转的响应包&#xff0c;页面只有一个 I Love Cookies&#xff1b;没什么信息 通过点击页面上方的按钮…

【Java】List, Set, Queue, Map 区别?

目录 List, Set, Queue, Map 区别&#xff1f; Collection和Collections List ArrayList 和 Array区别&#xff1f; ArrayList与LinkedList区别? ArrayList 能添加null吗&#xff1f; ArrayList 插入和删除时间复杂度&#xff1f; LinkedList 插入和删除时间复杂度&…

Vue2(4)——iHRM组织架构

组织架构-树组件应用 树形组件-用层级结构展示信息&#xff0c;可展开或折叠。 属性设置 data(绑定数据)props(设置属性)- children(设置子节点的字段名)/ label(设置显示内容的字段名)default-expand-all(默认展开所有节点) 组织架构-树组件自定义结构 显示右侧结构 节点结…

Vue2(三):绑定样式、条件渲染(v-if,v-show)、列表渲染(v-for)、key的原理、列表过滤、列表排序

一、绑定样式 1.绑定class样式 (1)字符串写法 适用于&#xff1a;样式类名不确定&#xff0c;需要动态获取。 <div id"root"><div class"basic" :class"mood" click"changeMood">test</div><!-- class是原本的…

【Python】进阶学习:基于Numpy实现按指定维度拼接两个数组

【Python】进阶学习&#xff1a;基于Numpy实现按指定维度拼接两个数组 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希…

第十三届蓝桥杯(C/C++ 大学B组)

目录 试题 A: 九进制转十进制 试题 B: 顺子日期 试题 C: 刷题统计 试题 D: 修剪灌木 试题 E: X 进制减法 试题 F: 统计子矩阵 试题 G: 积木画 试题 H: 扫雷 试题 I: 李白打酒加强版 试题 J: 砍竹子 试题 A: 九进制转十进制 九进制正整数 ( 2022 )转换成十进制等于多…

2000-2021年各省外商直接投资水平面板数据(含原始数据+计算结果)(无缺失)

2000-2021年各省外商直接投资水平面板数据&#xff08;含原始数据计算结果&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;外商直接投资额&#xff08;万美元&#xff09;、外商直接投资额&#xff08;万元&#xff09;、国…

MySQL语法分类 DQL(4)聚合函数

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

2024年【危险化学品经营单位主要负责人】找解析及危险化学品经营单位主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位主要负责人模拟考试题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位主要负责人…

移动云行动:5.5G技术引领数字化转型

刚刚结束的全国两会上&#xff0c;有人大代表建议应尽快发挥5G-A&#xff08;5.5G&#xff09;优势&#xff0c;加快试点城市布局。此前&#xff0c;中国移动已宣布将在300多个城市启动5.5G商用部署。在通信技术的历史长河中&#xff0c;4G改变了我们的生活方式&#xff0c;而5…

【Poi-tl Documentation】区块对标签显示隐藏改造

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板&#xff1a; 删除行表格测试.docx 改造前测试效果 package run.siyuan…

Iframe 嵌入: 页面嵌入并保持自适应页面的宽高并铺满整个屏幕

文章目录 问题分析1. 嵌入 Iframe2. 样式3. 源码 问题 当我们使用 Iframe 嵌入页面后&#xff0c;会看到它只在小小的一部分进行展示&#xff0c;如何让它铺满整个屏幕 分析 1. 嵌入 Iframe <template><div><iframe :src"embeddedPageUrl" width…