如何分离MP4、FLV等格式视频为H264码流
2017-12-05 16:53
501 查看
在分离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的时候,不存在上述问题。
2、SPS和PPS
SDP中的H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。3、相关函数介绍
(1)av_bitstream_filter_init
输入参数:比特流过滤器的名字
输出参数:根据比特流过滤器的创建并初始化一个比特流过滤器的上下文。
(2)av_bitstream_filter_filter
参数1:比特流过滤器的上下文
参数2:avcodeccontext输出流的编码器上下文.。
参数3:指定筛选器配置的参数,可能为空.
参数4:指针被更新以指向过滤缓冲区.
参数5:指针以字节形式更新到已过滤的缓冲区大小.
参数6:包含数据到过滤器的缓冲区
参数7:在字节缓冲区大小
参数8:设置为非零,如果缓冲区对应于一个关键帧数据包
相关文章推荐
- FLV视频格式如何在线转换MP4?
- 如何使用java代码进行视频格式的转换(FLV)
- 网站上flv,MP4等格式的视频文件播放不出来的解决办法
- centos 安装 STREAMING h264 视频的流播放 关于如何配置APACHE的STREAMING播放MP4的视频.
- h264格式的flv和mkv无损转换成mp4的方法
- H264视频码流格式浅析
- kindeditor本身支持上传flash功能,但是我们经常需要上传一些flv、mp4或则其它格式的视频。 其实具体的播放功能是通过jwplayer实现的。我只对kindeditor简单的修改了一下
- 网站上flv,MP4等格式的视频文件播放不出来的解决办法
- 如何使用视频格式转换器将flv转换成MP4
- (转)MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项
- 老司机图文教程教你如何免费下载腾讯视频的视频mp4(直接下载到,不用qlv格式转mp4格式,亲测)
- 如何使用java代码进行视频格式的转换(FLV)
- 利用ffmpeg0.6.1把.h264纯码流打包成.mp4 .avi等格式
- MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项
- 利用ffmpeg0.6.1把.h264纯码流打包成.mp4 .avi等格式 (转载)
- 如何下载腾讯视频的视频转为MP4常用格式视频
- h264格式的flv和mkv无损转换成mp4的方法
- 视频格式基础知识:让你了解MKV、MP4、H.265、码率\码流、多码流等等
- 使用 MP4v2 分离 MP4 中的 H264 码流
- MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项