iOS音视频编码

iOS音视频编码,第1张

iOS音视频开发涉及的方面比较广泛,一般分为采集、音视频的封装、编码、推流、拉流、解封装、解码、播放等阶段。其中音视频的编码和解码阶段是非常重要的步骤。其中编码分为硬编码和软编码,对应解码分为硬解码和软解码。

硬编码是指使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。

硬编码一般性能高,对CPU没有压力,但是对其他硬件要求较高(如GPU等)。

软编码是指使用CPU进行编码,软编码通常使用:ffmpeg+x264。

软编码实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低。

常见的直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H264作为视频编码格式,AAC作为音频编码格式。

iOS中编码方式:

在iOS8之前,苹果并没有开放硬编码的接口,所以只能采用ffmpeg+x624进行软编码

在iOS8之后,苹果开放了接口,并且封装了VideoToolBox&AudioToolbox两个框架,分别用于对视频&音频进行硬编码

利用FFmpeg解析音视频流,音视频流可以来自一个标准的RTMP的URL或者是一个文件 通过解析得到音视频流,进一步就可以解码, 然后视频渲染在屏幕上,音频通过扬声器输出

利用FFmpeg框架中libavformat模块可以通过函数 av_read_frame 解析出音视频流的音视频数据,如果直接使用FFmpeg硬解,仅需要解析到AVPacket即可传给解码模块使用,如果使用VideoToolbox中的硬解, 对于视频数据,还需要获取其NALU Header中的(vps)sps, pps以便后续使用

使用流程

FFmpeg parse流程

下面的链接中包含搭建iOS需要的FFmpeg环境的详细步骤,需要的可以提前阅读

iOS手动编译并搭建FFmpeg

导入FFmpeg框架后,首先需要将用到FFmpeg的文件改名为mm, 因为涉及C,C++混编,所以需要更改文件名

然后在头文件中导入FFmpeg头文件

注意: FFmpeg是一个广为流传的框架,其结构复杂,一般导入都按照如上格式,以文件夹名为根目录进行导入,具体设置,请参考上文链接

21 注册FFmpeg

一般在程序中的main函数或是主程序启动的代理方法 - (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 中初始化FFmpeg,执行一次即可

22 利用视频文件生成格式上下文对象

C++音视频开发学习资料 :点击领取 音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

23 获取Audio / Video流的索引值

通过遍历format context对象可以从 nb_streams 数组中找到音频或视频流索引,以便后续使用

24 是否支持音视频流

目前视频仅支持H264, H265编码的格式实际过程中,解码得到视频的旋转角度可能是不同的,以及不同机型可以支持的解码文件格式也是不同的,所以可以用这个方法手动过滤一些不支持的情况具体请下载代码观看,这里仅列出实战中测试出支持的列表

音频本例中仅支持AAC格式其他格式可根据需求自行更改

使用AVPacket这个结构体来存储压缩数据对于视频而言, 它通常包含一个压缩帧,对音频而言,可能包含多个压缩帧,该结构体类型通过 av_malloc() 函数分配内存,通过 av_packet_ref() 函数拷贝,通过 av_packet_unref() 函数释放内存

解析数据

int av_read_frame(AVFormatContext s, AVPacket pkt); : 此函数返回存储在文件中的内容,并且不验证解码器的有效帧是什么。它会将存储在文件中的内容分成帧,并为每次调用返回一个。它不会在有效帧之间省略无效数据,以便为解码器提供解码时可能的最大信息。

获取sps, pps等NALU Header信息

通过调用av_bitstream_filter_filter可以从码流中过滤得到sps, pps等NALU Header信息

av_bitstream_filter_init: 通过给定的比特流过滤器名词创建并初始化一个比特流过滤器上下文

av_bitstream_filter_filter: 此函数通过过滤buf参数中的数据,将过滤后的数据放在poutbuf参数中输出的buffer必须被调用者释放

此函数使用buf_size大小过滤缓冲区buf,并将过滤后的缓冲区放在poutbuf指向的缓冲区中。

注意: 下面使用new_packet是为了解决av_bitstream_filter_filter会产生内存泄漏的问题每次使用完后将用new_packet释放即可

可以根据自己的需求自定义时间戳生成规则这里使用当前系统时间戳加上数据包中的自带的pts/dts生成了时间戳

本例将获取到的数据放在自定义的结构体中,然后通过block回调传给方法的调用者,调用者可以在回调函数中处理parse到的视频数据

获取parse到的音频数据

因为我们已经将packet中的关键数据拷贝到自定义的结构体中,所以使用完后需要释放packet

parse完成后释放相关资源

C++音视频开发学习资料 :点击领取 音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

注意: 如果使用FFmpeg硬解,则仅仅需要获取到AVPacket数据结构即可不需要再将数据封装到自定义的结构体中

如果您在苹果设备上使用iMovie等软件制作视频,并将其导出为AAC格式,但其他设备无法识别该文件,可能是由于以下原因:

1 文件受到损坏:在导出文件的过程中,有可能文件本身就出现了问题,例如数据丢失、文件结构错误等,导致其他设备无法识别该文件。尝试重新导出文件,查看问题是否得到解决。

2 编码不兼容:某些设备可能不支持AAC格式,或者只支持特定的AAC编码方式。可以尝试将导出的AAC文件转换为其他设备支持的格式,例如MP3、WAV等。

3 版本不匹配:一些设备只能播放特定版本的AAC文件,而无法识别其他版本。可以尝试调整编码和版本等参数,以使得导出的AAC文件能够被其他设备识别和播放。

4 版权保护:在某些情况下,AAC文件可能受到版权保护,其他设备无法识别并播放该文件。可以检查文件是否受到版权保护,确认是否需要获得相应的授权或许可。

需要注意的是,文件格式和编码等参数之间的兼容性问题较为复杂,需要根据具体情况进行分析和调整。建议您在尝试以上方法后,如果问题依然存在,可以咨询相关专业人士或技术支持人员寻求帮助。

iphone支持aac文件。

苹果公司重量级的iPod和iPod mini全都能播放16-320Kbps的AAC文件,加上苹果倾力打造的iTunes音乐播放器,为制作播放AAC文件铺好了一条捷径。所以苹果手机是支持aac文件的。

Apple自带播放器还可以将最新的唱片压缩成AAC格式提供下载。AAC是在MP3基础上开发出来的,所以两者的编码系统有一些相同之处。虽然AAC的编码工序更为复杂。但是播放器可以下载aac文件。

扩展资料:

iphone自带播放器可以读取、写入以及转换于MP3、AIFF、WAV、MPEG-4、AAC与Apple Lossless之间。

iTunes也能播放任何QuickTime能播放的(甚至是一些视频格式),包括来自iTunes Store与Audiblecom有声书的受保护的AAC文件。为了播放其他格式,例如内含Ogg的Vorbis或Speex编码,iTunes需要安装Xiph QuickTime组件。

参考资料来源:百度百科—aac

笔者iOS开发工程师,现在很多应用场景下都会用到视频播放技术,当然iOS APP也不例外,这是写这篇文章的背景。

最近我一个同样做iOS工程师的同学说他最近面试了一个人,简历里写着做过视频播放,就问他基本的视频播放原理是什么,结果此人一脸懵逼状什么也没答上来,只是说会用iOS SDK下调用视频播放的几个API。我同学跟我说他就是想问问此人计算机基础怎么样,其实只要应聘者能说出“解码”两个字都会让他满意的,可惜他却什么也没说出来。这又让笔者想起几年前临近大学毕业时同寝室友校招面试时也遇到了同样的问题,他也做过视频播放,人家就问他其中有两个问题,一是如果现在有一种非常奇怪的格式的视频让你播放你该怎么办,他也是懵逼了。二是如果现在有一个1G的超大视频让你播放,你又该怎么办,他直接就傻了,面试自然折戟沉沙了。

事实上仅就iOS APP来讲,要想做出视频播放的功能来,的确是调用 AVFoundation 框架下几个常用的API就可以了,iOS 9 之前常用的是 MPMoviePlayerController ,ios 9 之后推荐使用流播放技术的 AVPlayer ,可是就像常说的API普通的程序员都会调,可是真正有专业基础和想进阶就要知其然还要知其所以然,有专业基础的和半路出家的程序员的最大区别也正在于此,这也就成了本片文章写作的契机,下面这些内容也是笔者整合了一些自己的一些积累,主要来源于我们有合作关系的一家叫保利威视的视频解决方案提供商,希望对大家有帮助,水平有限,有不足之处还请大家不吝赐教。

视音频技术主要包含以下几点: 封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。

视频播放器播放网上的视频文件,需要经过以下几个步骤: 解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。过程如图所示。

解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如>

以上就是关于iOS音视频编码全部的内容,包括:iOS音视频编码、MAC/iOS利用FFmpeg解析音视频数据流、苹果视频aac格式导出不识别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9614038.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存