分离(MP4/FLV/MKV等)中的H.264视频信息 保存并播放
来源:互联网 发布:2017mac配置jdk1.8环境 编辑:程序博客网 时间:2024/05/16 07:05
参考http://blog.csdn.net/leixiaohua1020/article/details/11800877
在分离H.264码流的时候,直接存储AVPacket后的文件可能是不能播放的。
如果视音频复用格式是TS(MPEG2 Transport Stream),直接存储后的文件是可以播放的。
复用格式是FLV,MP4则不行。
经过长时间资料搜索发现,FLV,MP4这些属于“特殊容器”,需要经过以下处理才能得到可播放的H.264码流:
1.分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter(比特流过滤器)处理。有两种处理方式:
(1)使用bitstream filter处理每个AVPacket(简单)
把每个AVPacket中的数据(data字段)经过bitstream filter“过滤”一遍。关键函数是av_bitstream_filter_filter()。示例代码如下
上述代码中,把av_bitstream_filter_filter()的输入数据和输出数据(分别对应第4,5,6,7个参数)都设置成AVPacket的data字段就可以了。
需要注意的是bitstream filter需要初始化和销毁,分别通过函数av_bitstream_filter_init()和av_bitstream_filter_close()。
经过上述代码处理之后,AVPacket中的数据有如下变化:
*每个AVPacket的data添加了H.264的NALU的起始码{0,0,0,1}
*每个IDR帧数据前面添加了SPS和PPS
(2)手工添加SPS,PPS(稍微复杂)
将AVCodecContext的extradata数据经过bitstream filter处理之后得到SPS、PPS,拷贝至每个IDR帧之前。下面代码示例了写入SPS、PPS的过程。通过查看FFMPEG源代码我们发现,AVPacket中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。
具体代码如下:
拷贝4个字节(0x00000001)
当封装格式为MPEG2TS的时候,不存在上述问题。
SDP中的H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。3、相关函数介绍
- 分离(MP4/FLV/MKV等)中的H.264视频信息 保存并播放
- 如何分离MP4、FLV等格式视频为H264码流
- flv、MP4 视频播放问题
- win2003服务器flv、mp4视频播放设置
- 用FlowPlayer播放flv、mp4等视频文件
- opencv播放mkv视频
- JW Player6.7Pro专业版(网页视频播放器),自定义Logo和右键菜单,支持MP4、FLV等,支持直播
- h.264保存flv文件
- 视频格式基础知识:让你了解MKV、MP4、H.265、码率、色深等
- 下载mp4视频到本地,并播放
- QQ影音播放MP4、MKV等视频文件有声音没图像,显示绿屏
- mkv、rmvb、avi、MP4、flv、wmv特点和区别
- opencv播放mkv视频 - 并实现滚动条&并使滚动条随着播放移动
- 狸窝视频转换器压制视频mp4格式使用的H.264编码器配置参数信息
- 利用FFmpeg将mkv视频转换为H.264
- 介绍两款H.264编码器(放弃FLV,拥抱MP4)
- h.264视频编码加生成QT7可播放的mp4文件
- 利用FMS3来播放H.264格式的mp4高清视频
- rac one node 安装和切换(11gR2)
- Compressive Tracking之CompressiveSensing(压缩感知理论)
- 蓝桥杯-闰年判断
- python练习1
- Java8新特性 - 流式数据处理
- 分离(MP4/FLV/MKV等)中的H.264视频信息 保存并播放
- 推荐几个好用的js库
- 描述符表和描述符高速缓存
- 350. Intersection of Two Arrays II
- G - 诡异的楼梯 (bfs)
- 将工程导入maven后报错问题
- webpack学习
- rocketmq概念总结
- Android 系列 4.11使用活动线程队列和处理程序在线程之间发送消息