在使用FFMPEG的类库进行编程的过程中,可以直接输出解复用之后的的视频数据码流。只需要在每次调用av_read_frame()之后将得到的视频的AVPacket存为本地文件即可。
经试验,在分离MPEG2码流的时候,直接存储AVPacket即可。
在分离H.264码流的时候,直接存储AVPacket后的文件可能是不能播放的。
如果视音频复用格式是TS(MPEG2 Transport Stream),直接存储后的文件是可以播放的。
复用格式是FLV,MP4则不行。
经过长时间资料搜索发现,FLV,MP4这些属于“特殊容器”,需要经过以下处理才能得到可播放的H.264码流:
1.第一次存储AVPacket之前需要在前面加上H.264的SPS和PPS。这些信息存储在AVCodecContext的extradata里面。
并且需要使用FFMPEG中的名为"h264_mp4toannexb"的bitstream filter 进行处理。
然后将处理后的extradata存入文件
具体代码如下:
- FILE*fp=fopen("test.264","ab");
- unsignedchar*dummy=NULL;//输入的指针
- intdummy_len;
- AVBitStreamFilterContext*bsfc=av_bitstream_filter_init("h264_mp4toannexb");
- av_bitstream_filter_filter(bsfc,is->ic->streams[is->video_stream]->codec,NULL,&dummy,&dummy_len,NULL,0,0);
- fwrite(is->ic->streams[is->video_stream]->codec->extradata,is->ic->streams[is->video_stream]->codec->extradata_size,1,fp);
- av_bitstream_filter_close(bsfc);
- free(dummy);
2.通过查看FFMPEG源代码我们发现,AVPacket中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。
具体代码如下:
- charnal_start[]={0,0,0,1};
- fwrite(nal_start,4,1,fp);
- fwrite(pkt->data+4,pkt->size-4,1,fp);
- fclose(fp);
经过以上两步处理之后,我们就得到了可以正常播放的H.264码流
相关推荐
MFC+ffmpeg+socket实时解码H.264码流,具体的参考博客内容有说明
ffmpeg 实时解码DEMO 实时解码H.264码流
1.使用ffmpeg将多张图片生成H264文件; 2.从H264文件中获取一帧图片和一帧中的SLICE图片; 3.能够直接使用ffplay.exe播放H264文件; 4.完整工程,可直接运行(附带测试图片和实例); 5.vs2013;
1.移植ffmpeg到android 2.通过JNI接口调用ffmpeg实现h264的解码以及渲染...3.h264渲染采用opengles技术 代码保护局ffmpeg源码 JNI部分 以及opengles渲染部分,还有上层demo APP程序,该程序可以直接安装,播放h264文件
使用ffmpeg截获rtp中的h264payload,并组成h.264码流
此前做过一个YUV420P像素数据编码为H.264码流的例子。对这个例子进行了升级。升级后编码器实现了YUV420P像素数据编码为H.265码流。 尽管该视频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个视频所有必备...
很多播放器都使用了ffmpeg这个类库来编解码 使用LIB和DLL实现ffmpeg的相关功能函数
基于QT与VS2010创建工程,调用QT中的UDP创建组播发送端,读取H.264文件,以每秒25帧发送。在组播接收端接收到数据后,调用FFMPEG库解析H.264数据流,并在QT界面实时显示。
4)、ffmpeg采用命令的方式拉流和推流,支持H265和H264。 5)、支持获取流的访问数,可设置自动关闭0访问数的推流以节约系统资源。 6)、linux系统支持推流前系统资源限制。 7)、完整的日志输出,便于查看项目...
利用ffmpeg库,将H264裸流文件读到内存,然后封装为MP4文件并保存到本地。转换效果亲测,流畅,无卡顿。
ffmpeg编译大全(很详细),ffmpeg中文开发文档,h.264编解码!
编译好的ffmpeg类库文件,32位版本,输出版本号为 ffmpeg version N-99305-gbc0e776 Copyright (c) 2000-2020 the FFmpeg developers built with 用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.27.29112 版 包含...
通过ffmpeg工具,将h.264格式文件转换为yuv文件
ffmpeg解码MP4生成h264和opus裸流数据,不只是MP4,其他的封装格式也行,只要ffmpeg支持的就可以。由于ffmpeg不支持获取opus的裸流数据,输出的是封装了opus的ogg文件,故自己调用ffmpeg-api获取裸流数据。webrtc传输...
可以用于测试FFMPEG的H.264编码,从网上下载了几个都不太清晰,自已用FFMPEG从AVI文件提取了H.264码流
c++使用ffmpeg把h264/h265和mp3写入mp4文件,内含ffmpeg库、示例demo、视频素材。
视频解码的代码写在fdecode中 详见我的博客:https://blog.csdn.net/hml111666/article/details/122485955
将H.264视频裸流与AAC声音数据打包成TS格式码流,用于网络传输,例如RTSP
基于ffmpeg的H.264实时流视频播放器的设计与实现,胡金辉,马跃,本文设计并实现了基于ffmpeg解码库的H.264实时流视频播放器。本系统主要包括数据接收、视频解码、显示播放三个主要功能模块,接收模�