h264acc

news/2024/7/10 20:55:44 标签: python, ffmpeg

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

aac音频:

     打包aac音频必须加上一个adts(Audio Data Transport Stream)头,共7Byte,adts包括fixed_header和variable_header两部分,各28bit。

fixed_header

syncword12b固定为0xfff
id1b0表示MPEG-4,1表示MPEG-2
layer2b固定为00
protection_absent1b固定为1
profile2b取值0~3,1表示aac
sampling_frequency_index4b表示采样率,0: 96000 Hz,1: 88200 Hz,2: 64000 Hz,3:48000 Hz,4: 44100 Hz,5: 32000 Hz,6: 24000 Hz,7: 22050 Hz,8: 16000 Hz,9: 12000 Hz,10: 11025 Hz,11: 8000 Hz,12: 7350 Hz
private_bit1b固定为0
channel_configuration3b取值0~7,1: 1 channel: front-center,2: 2 channels: front-left, front-right,3: 3 channels: front-center, front-left, front-right,4: 4 channels: front-center, front-left, front-right, back-center
original_copy1b固定为0
home1b固定为0


variable_header

copyright_identification_bit1b固定为0
copyright_identification_start1b固定为0
aac_frame_length13b包括adts头在内的音频数据总长度
adts_buffer_fullness11b固定为0x7ff
number_of_raw_data_blocks_in_frame2b固定为00


mp3音频:

mp3音频不需要加adts头。


6.h264帧类型判断

当nalu type=5或1时,表示后面跟着的数据是视频数据,下面我们只列出前2项。

first_mb_in_sliceGolomb编码一般为0,一个slice为一帧图像
slice_typeGolomb编码帧类型,2、4、7、9表示I帧,0、3、5、8表示P帧
,1、6表示B帧。


7.mp4转ts

     我们假设mp4格式中的视频编码为h.264,音频编码为aac。我们从mp4中获取的视频信息包括:sps、pps、dts、pts、帧率、帧数据、ticks(每秒滴答数)。音频信息包括:pts、采样频率、声道数、帧数据。mp4文件的dts和ts文件的dts是需要进行换算的,都是初始值 + 增量,但是增量计算是不同的。

视频信息获取:

spsstsd.avc1.avcC
ppsstsd.avc1.avcC
dtsstts
ptsstts + ctts
帧率帧个数 / 总时长
timescaletrak.mdia.mdhd
帧数据stsc + stco + stsz

音频信息获取:

ptsstts
采样频率trak.mdia.mdhd
声道数stsd.mp4a
帧数据stsc + stco + stsz


8.mp4中关于h264和aac的说明

     mp4的stsd原子中包含很多关键的音视频编解码元信息。对于视频数据,不同的编解码格式stsd中包含的子原子类型是不同的。MP4的视频H.264封装有2种格式:h264和avc1,只要看到这两个FOURCC(四字节编码)。就可以肯定是h.264编码,区别在于slice是否有起始码。对于音频数据,stsd中包含的子原子只会是mp4a,mp4a又包含了一个子原子esds,判断音频编码格式的是esds中的第十一个字节,如果是0x40则说明是aac编码,如果是0x69则说明是mp3。

  • AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的,但是带有4字节的长度。

  • H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0×00000001的。

     除了avc1和h264还可能是下面的FOURCC,只是名字不同而已。

  • MEDIASUBTYPE_AVC1 'AVC1' H.264 bitstream without start codes.

  • MEDIASUBTYPE_H264 'H264' H.264 bitstream with start codes.

  • MEDIASUBTYPE_h264 'h264' Equivalent to MEDIASUBTYPE_H264, with a different FOURCC.

  • MEDIASUBTYPE_X264 'X264' Equivalent to MEDIASUBTYPE_H264, with a different FOURCC.

  • MEDIASUBTYPE_x264 'x264' Equivalent to MEDIASUBTYPE_H264, with a different FOURCC.

转载于:https://my.oschina.net/u/727148/blog/666829


http://www.niftyadmin.cn/n/1480892.html

相关文章

JAVA-包装类

一、八种数据类型对应的包装类 关系: 自动封箱就是:自动将基本数据类型转换为包装器类型 自动拆箱就是:自动将包装器类型转换为基本数据类型 从 jdk 1.5 出现之后自动封箱和自动拆箱,就有编译器帮助完成! Jav…

JAVA-字符串String“”==“”的判断

关于字符串判断 String a “a”; String b “b”; String c “ab”;//方法区 直接赋值的方式 最多产生一个对象在方法区, 如果方法区中已经有了该字符串常量,那么只会把该常量的引用返回给c ,而不会创建新的对象。这种方式会产生0-1个字…

JAVA-StringBuffer

它是一个增强的String类,在长度可变上增强了。长度和内容都可变。 String是不可变的类型,即创建一个String对象后,就不能修改这个String,平常使用的”aa””bb”生成”aabb”这个过程中,实际是创建了三个String对象&a…

JAVA-StringBuffer与StringBuilder的区别

Stringbuilder非线程安全的。执行效率比较高 重效率,轻安全。 StringBuffer和StringBuilder的共同点和区别 共同点: 1:都是对字符串做操作的。 2:都是可变的字符串序列。 3:底层都是使用char[]数组实现。 4&…

JAVA-日期类

1.Date时间 Date date new Date(); System.out.println(date); System.out.println(date.toLocaleString());//过时的方法 System.out.println(date.getDate());//当前的日期 一个月的第几天 System.out.println(date.getDay());//星期几 返回值 (0 Sunday, 1 Monday, 2 Tu…

JAVA-Math类

关于数学相关的一个类,主要包含了一些数学公式,求绝对值,最大值最小值,和堆角度的操作的方法。 (Math.cbrt(27));//立方根 double result 0; result Math.ceil(2.2);//天花板,返回大于等于实际参数的正整数的值 resu…

c#后台List转为js对象(在前台操作)

<!-- 用html标签防止html转义 (html.raw方法转双引号中的双引号时不会转义) --><input id"json" type"hidden" value"JsonConvert.SerializeObject(Model)" />

java使用log4j

1.首先需要log4j的配置文件&#xff0c;将配置文件放在src根目录下。 配置文件内容如下&#xff1a; &#xff08;1&#xff09; log4j配置详解 - stone - stonexmx 的博客 ### set log levels ### log4j配置详解 - stone - stonexmx 的博客log4j.rootLogger debug , stdo…