不同媒体容器封装层的timebase分析

2024-04-19 07:18

本文主要是介绍不同媒体容器封装层的timebase分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用ffmpeg封装过程中发现,封装成mp4文件音视频是同步的,但是封装成mpegts文件则有问题,视频播放正常,但音频播放异常,且不同步。所以猜测是封装层的时间基准单位(timebase)在搞鬼。
在此,并没有去深入的分析ffmepg中的源代码,而是简单的修改了一下ffmpeg中的av_dump_format函数,使之把音频的tbn(即封装层的timebase)也打印出来,分析了如下容器:mpegts, mp4, mov和flv共4中,结果如下:

test.ts
----------------------------------------------------------
Input #0, mpegts, from '/home/b1shen/Videos/test.ts': Duration: 00:01:00.02, start: 1.400000, bitrate: 763 kb/s
  Program 1 Metadata: service_name    : Service01
      service_provider: FFmpeg    
      Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 640x480 [SAR 4:3 DAR 16:9] , 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 128 kb/s, 90k tbn
分析结果: 
    video: tbn:90k
    audio: tbn:90k 
    所以video与audio的封装层的timebase是一致的,均为90ktest.mp4
---------------------------------------------------------- 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/b1shen/Videos/test.mp4': Duration: 00:01:00.02, start: 0.000000, bitrate: 680 kb/s 
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 4:3 DAR 16:9], 557 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 115 kb/s, 44100 tbn, 44100 tbc ( default)
    Metadata: handler_name    : SoundHandler 
    分析结果:
    video: tbn:12800
    audio: tbn:44100 
    从结果来看,音频及视频的封装层timebase不一致,视频为128000,音频为44100(与采样率一致)test.mov
----------------------------------------------------------
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/b1shen/Videos/test.mov': Metadata: major_brand     : qt  minor_version   : 512
    compatible_brands: qt  
    encoder         : Lavf56.40.101 Duration: 00:01:00.02, start: 0.000000, bitrate: 680 kb/s 
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 4:3 DAR 16:9], 557 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)    Metadata: handler_name    : DataHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 115 kb/s, 44100 tbn, 44100 tbc ( default)
    Metadata: handler_name    : DataHandler 
    分析结果: 与mp4格式的结果一致test.flv
----------------------------------------------------------
Input #0, flv, from '/home/b1shen/Videos/test.flv': Metadata: major_brand     : isomminor_version   : 1
    compatible_brands: isomavc1
    encoder         : Lavf56.40.101 Duration: 00:01:00.02, start: 0.000000, bitrate: 686 kb/s 
Stream #0:0: Video: h264 (High), yuv420p(progressive), 640x480 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc 
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 1k tbn, 44100 tbc 
    分析结果: 
    video: tbn: 1k
    audio: tbn: 1k
    audio与video的封装层的timebase一致,均为1k

这篇关于不同媒体容器封装层的timebase分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916887

相关文章

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa