`

使用FFMPEG类库分离出多媒体文件中的H.264码流

 
阅读更多

在使用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存入文件

具体代码如下:

 

[cpp]view plaincopy
 
  1. FILE*fp=fopen("test.264","ab");
[cpp]view plaincopy
 
  1. unsignedchar*dummy=NULL;//输入的指针
  2. intdummy_len;
  3. AVBitStreamFilterContext*bsfc=av_bitstream_filter_init("h264_mp4toannexb");
  4. av_bitstream_filter_filter(bsfc,is->ic->streams[is->video_stream]->codec,NULL,&dummy,&dummy_len,NULL,0,0);
  5. fwrite(is->ic->streams[is->video_stream]->codec->extradata,is->ic->streams[is->video_stream]->codec->extradata_size,1,fp);
  6. av_bitstream_filter_close(bsfc);
  7. free(dummy);

 

 

2.通过查看FFMPEG源代码我们发现,AVPacket中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。

具体代码如下:

 

[cpp]view plaincopy
 
  1. charnal_start[]={0,0,0,1};
  2. fwrite(nal_start,4,1,fp);
  3. fwrite(pkt->data+4,pkt->size-4,1,fp);
  4. fclose(fp);

 

 

经过以上两步处理之后,我们就得到了可以正常播放的H.264码流

分享到:
评论

相关推荐

    MFC+ffmpeg+socket实时解码H.264码流

    在IT领域,尤其是在多媒体处理和网络通信中,"MFC+ffmpeg+socket实时解码H.264码流"是一个关键的技术组合。这个技术栈主要用于实现远程视频传输和播放,尤其是在实时监控、在线视频会议或者流媒体服务中。下面将详细...

    ffmpeg 实时解码DEMO 实时解码H.264码流

    为了在命令行中使用FFmpeg解码H.264流,可以使用如下的基本命令: ```bash ffmpeg -i input.h264 -c:v copy output.yuv ``` 这条命令将输入的H.264码流(input.h264)解码并输出为YUV格式(output.yuv),这里使用了...

    使用FFmpeg截获h264裸码流

    ### 使用FFmpeg截取H.264裸码流详解 #### 一、引言 在多媒体处理领域,FFmpeg是一款极为强大的工具包,能够帮助开发者实现音视频编解码、转码、录制、流媒体传输等多种功能。其中,从RTP流中截取H.264裸码流是一项...

    Qt基于FFmpeg解码本地视频生成 H.264文件并播放

    在本文中,我们将深入探讨如何使用Qt结合FFmpeg库来解码本地视频,并将解码后的数据生成H.264编码的文件,最后实现播放功能。Qt是一个强大的跨平台应用开发框架,而FFmpeg则是一个开源的多媒体处理工具,支持多种...

    利用FFmpeg将mkv视频转换为H.264

    FFmpeg是一款强大的开源多媒体处理工具,它支持各种视频、音频格式的编码、解码、转换、流媒体等操作。在本场景中,我们将探讨如何利用FFmpeg将MKV格式的视频转换为使用H.264编码的视频,以及相关的编程实现。 首先...

    ffmpeg_h.264.zip_FFmpeg解码_ffmpeg 文档_ffmpeg 解码_ffmpeg开发_h.264编解码

    在本压缩包文件"ffmpeg_h.264.zip"中,主要聚焦于FFmpeg对h.264编码的解码功能及其相关的开发文档。 1. FFmpeg解码:FFmpeg的解码功能是其核心特性之一,它能够解析各种视频和音频编码格式,包括h.264。h.264是一种...

    使用ffmpeg将h.264转为yuv格式

    在这个场景中,我们关注的是如何使用FFmpeg将H.264格式的视频文件转换成YUV格式。H.264是一种高效的视频编码标准,广泛应用于高清视频编码,而YUV则是一种常见的数字视频颜色空间,常用于视频处理和编码过程。 首先...

    TCP接收264码流,使用ffmpeg解码

    在这个场景中,我们关注的是通过TCP协议接收H.264编码的视频流,并利用ffmpeg工具进行解码,最终将其保存为YUV格式的文件。这是一个典型的客户端程序实现,具体涉及以下几个关键知识点: 1. **TCP协议**:TCP...

    Qt基于FFmpeg播放本地 H.264(H264)文件

    在本文中,我们将深入探讨如何使用Qt框架结合FFmpeg库来播放本地的H.264编码的视频文件。H.264是一种高效的视频编码标准,广泛应用于各种媒体格式和网络流媒体服务。Qt是一个跨平台的应用程序开发框架,而FFmpeg是一...

    c++使用ffmpeg把h264/h265和mp3写入mp4文件

    本主题聚焦于如何使用C++与FFmpeg库来将H264、H265编码的视频流和MP3音频流合并并写入到MP4文件中。H264和H265是两种高效的视频编码标准,而MP3是一种广泛接受的音频编码格式。MP4文件格式则允许同时存储视频和音频...

    利用ffmpeg将RTSP传输的h264原始码流保存到文件中

    执行此命令后,FFmpeg会开始从RTSP流中抓取数据,并将其保存到`output.h264`文件中。注意,这个文件仅包含视频数据,不包含任何时间戳或其他元数据,因此通常需要一个容器格式(如MP4或MKV)来封装这些信息,以便于...

    vs2010 ffmpeg实时解码h264码流

    在本文中,我们将深入探讨如何在Visual Studio 2010环境下使用C++实时解码H264视频码流。H264是一种高效、先进的视频编码标准,广泛应用于高清视频传输、在线流媒体服务等领域。FFmpeg是一个强大的开源多媒体处理...

    利用ffmpeg将H264裸流文件封装为MP4文件并保存

    这里,`-i` 参数指定输入文件,`input.h264` 是你的H264裸流文件,`-c copy` 命令告诉FFmpeg只需复制流而不进行重新编码,`output.mp4` 是目标MP4文件名。 3. **执行转换**:在命令行中输入上述命令,FFmpeg会读取...

    QT组播发送H264文件并接收FFMPEG解析播放

    FFmpeg的`avcodec`库提供了对H.264解码的支持,`avformat`库则用于处理封装格式,帮助从UDP数据流中提取出原始的H.264 NAL单元(Network Abstraction Layer Units)。 解析后的视频帧需要在QT界面上实时显示。QT...

    使用ffmpeg将多张图片生成H264裸流并获取帧图片

    1.使用ffmpeg将多张图片生成H264文件; 2.从H264文件中获取一帧图片和一帧中的SLICE图片; 3.能够直接使用ffplay.exe播放H264文件; 4.完整工程,可直接运行(附带测试图片和实例); 5.vs2013;

    H.264&H.265视频压缩编码参考码率表

    H.264&H.265视频压缩编码参考码率表,可用与编码压缩H.264和H.265视频是参考压缩编码的参考码率和质量高低对应目标压缩视频文件大小的测算

    Android平台的FFmpeg类库

    要在Android应用中使用FFmpeg库,需要在项目的build.gradle文件中配置NDK路径,并添加依赖项。然后,通过Java或Kotlin的JNI接口调用原生库中的函数,实现音视频处理功能。 6. **示例应用**: 使用FFmpeg库的常见...

    封装的使用FFMPEG的DXVA2解码显示H264和H265码流的库

    FFmpeg是一款强大的开源多媒体处理工具,它包含了各种编解码器、过滤器和转换功能,广泛应用于音视频处理领域。在FFmpeg中,DXVA2(DirectX ...通过学习和使用这类库,开发者可以构建出更加流畅、低延迟的多媒体应用。

    Android 移植ffmpeg解码h264文件并播放渲染

    1.移植ffmpeg到android 2.通过JNI接口调用ffmpeg实现h264的解码以及渲染...3.h264渲染采用opengles技术 代码保护局ffmpeg源码 JNI部分 以及opengles渲染部分,还有上层demo APP程序,该程序可以直接安装,播放h264文件

    最简单的基于FFMPEG的视频编码器(YUV编码为HEVC H 265 )

    此前做过一个YUV420P像素数据编码为H.264码流的例子。对这个例子进行了升级。升级后编码器实现了YUV420P像素数据编码为H.265码流。 尽管该视频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个视频所有必备...

Global site tag (gtag.js) - Google Analytics