利用FFmepg解析并解码音频流数据,然后将解码后的音频数据送给Audio Queue以实现播放
利用FFmpeg解析音频数据流, 利用FFmpeg解码音频数据为PCM格式 利用Audio Queue Player实现音频数据播放
本例以一个苹果原生相机录制的MOV文件为例, 将该文件使用FFmpeg解析并解码,将解码后的数据放入传输队列中,然后开启audio queue player, 播放器在回调函数中轮循取出队列中的数据实现播放
FFmpeg parse流程
FFmpeg解码流程
为了每次能够重新播放,这里需要标记当前是否为解码的第一帧数据,以重新启动播放器 另一点是使用NSTimer等待音频数据放入队列再开始播放,因为audio queue是驱动播放模式,所以必须等音频数据放入传输队列再开始播放
从Parse模块中可以获取当前文件对应FFmepg的上下文对象 AVFormatContext 因此音频流解码器信息可以直接获取
AVFrame 作为解码后原始的音视频数据的容器AVFrame通常被分配一次然后多次重复(例如,单个AVFrame以保持从解码器接收的帧)。在这种情况下,av_frame_unref()将释放框架所持有的任何引用,并在再次重用之前将其重置为其原始的清理状态。
调用avcodec_send_packet将压缩数据发送给解码器最后利用循环接收avcodec_receive_frame解码后的音视频数据
avformat_open_input这些代码打开文件
然后av_read_frame不停的读文件内容
然后decode,然后encode。然后avio_open打开输出文件,然后不停的将encode结果av_interleaved_write_frame到文件里。
您好,很高兴为您解答。
参考下:>
FFmpeg 进行视频转码的时候,使用了 concat 协议中的 ‘ | ’ 语法,如下图官方文档所示:
所以针对这一点,我们利用 file 协议构造本地文件路径指令,并将其加于concat 协议中,使得 FFmpeg 在处理视频流时候执行指令,将指令指向的内容直接加载到视频中,然后通过查看视频即可获得文件内容。
neex大神的poc
Local File Disclosure via ffmpeg
FFmpeg各版本的安装
FFmpeg安装中各种问题的解决方案
FFmpeg中的SSRF问题
本文内容参考网上知识,自己从中实践感悟而来,希望能对大家有所帮助。
(菜鸡作者木有直接给poc的能力也很绝望啊)
如果牵扯版权问题请及时联系,愿意更改删减~~
FFmpeg名称中的mpeg来自视频编码标准MPEG,而前缀FF是Fast Forward的首字母缩写。
目录
默认的编译会生成 4 个可执行文件和 8 个静态库。可执行文件包括用于 转码 、 推流 、Dump媒体文件的 ffmpeg 、用于播放媒体文件的 ffplay 、 用于获取媒体文件信息的 ffprobe ,以及作为简单流媒体服务器的 ffserver 。
8个静态库其实就是FFmpeg的8个模块,具体包括如下内容。
比如AAC编码,常见的有两种封装格式
AAC 的 bit stream filter 常常应用在 编码 的过程中。
与音频的AAC编码格式相对应的是视频中的 H264编码 ,它也有两种封装格式
FFmpeg中也提供了对应的 bit stream filter ,称 H264_mp4toannexb ,可以将MP4封装格式的H264数据包转换为annexb封装格式的H264数据 (其实就是裸的H264的数据)包。
H264 的 bit stream filter 常常应用于视频解码过程中。
ffmpeg 是进行媒体文件转码的命令行工具
ffprobe 是用于查看媒体 文件头信息的工具
ffplay 则是用于播放媒体文件的工具
1首先用ffprobe查看一个音频的文件
2输出格式信息format_name、时间长度duration、文件 大小size、比特率bit_rate、流的数目nb_streams等。
3以JSON格式的形式输出具体每一个流 最详细 的信息
4显示帧信息的命令如下:
5查看包信息的命令如下:
ffplay是以FFmpeg框架为基础,外加渲染音视频 的库libSDL来构建的媒体文件播放器。
业界内开源的 ijkPlayer 其实就是基于 ffplay 进行改造的播放器,当然其做了硬件解码以及很多兼容性的工作。
在 ffplay中音画同步的实现方式其实有三种。分别是
并且在 ffplay 中默认的对齐方式也是以 音频 为基准进行对齐的。
首先要声明的是,播放器接收到的视频帧或者音频帧,内部都会有 时间戳(PTS时钟) 来标识它实际应该在什么时刻进行展示。
实际的对齐策略如下:比较视频当前的播放时间和音频当前的播放时间
关键就在于音视频时间的比较以及延迟的计算,当然在比较的过程中会设 置一个 阈值(Threshold) ,若超过预设的阈值就应该做调整(丢帧渲染 或者重复渲染),这就是整个对齐策略。
ffmpeg 就是强大的媒体文件转换工具。它可以转换任何格式的媒体文件,并且还可以用自己的 AudioFilter 以及 VideoFilter 进行处理和编辑。
接下来介绍一个解码的实例,该实例实现的功能非常单一,就是把一个视频文件解码成单独的音频PCM文件和视频YUV文件。
AVFormatContext是API层直接接触到的结构体,它会进行格式的封 装与解封装。
该结构体包含的就是与实际的 编解码 有关的部分。
331 av_register_all
所以该函数的内部实现会先调用 avcodec_register_all 来注册所有configh里面开放的编解码器,然后会注册所有的 Muxer 和 Demuxer (也就是封装格式),最后注册所有的 Protocol (即协议层的东西)。
332 av_find_codec
这里面其实包含了两部分的内容:一部分是寻找 解码器 ,一部分是寻找 编码器 。
333 avcodec_open2
该函数是打开编解码器(Codec)的函数,无论是编码过程还是解码过程,都会用到该函数。
avformat_open_input
根据所提供的文件路径判断文件的格 式,其实就是通过这一步来决定使用的到底是哪一个 Demuxer 。
avformat_find_stream_info
该方法的作用就是把所有 Stream 的 MetaData 信息填充好。
av_read_frame
使用该方法读取出来的数据是 AVPacket 。
对于 音频流 ,一个 AVPacket 可能包含 多 个 AVFrame ,但是对于 视频流 ,一个 AVPacket 只包含 一 个 AVFrame ,该函数最终只会返回一个 AVPacket 结构体。
avcodec_decode
该方法包含了两部分内容:一部分是 解码视频 ,一部分是 解码音频 , 解码 是会委托给对应的解码器来实施的。
avformat_close_input
该函数负责释放对应的资源。
avformat_alloc_output_context2
该函数内部需要调用方法avformat_alloc_context来分配一个 AVFormatContext 结构体。
avio_open2
编码的阶段了,开发者需要将手动封装好的 AVFrame 结构体,作为 avcodec_encode_video 方法的输入,将其编码成为 AVPacket ,然后调用 av_write_frame 方法输出到媒体文件中。
本文参考 音视频开发进阶指南
项目源码地址 - FFmpegDecoder
视频中有关键帧概念,视频是分块压缩存储,每一块有一个关键帧,其他帧只记录与关键帧不同的地方以节省存储空间。
对于第一个问题,AVSEEK_FLAG_BACKWARD是从指定的时间点向前寻找最近的关键帧,所以很可能19,20,21秒在一个分块内,它们的关键帧是同一帧。
以上就是关于iOS利用FFmpeg解码音频数据并播放全部的内容,包括:iOS利用FFmpeg解码音频数据并播放、c++ ffmpeg如何获取RTP包中的Seq和timestamp、如何用ffmpeg获取USB摄像头数据并存储到本地等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)