首页 » SEO优化 » phpffmpeg转码进度技巧_ffmpeg内存实时转码

phpffmpeg转码进度技巧_ffmpeg内存实时转码

访客 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

关于如何从内存读取数据,以及如何将数据输出到内存,可以参考文章:

ffmpeg 从内存中读取数据(或将数据输出到内存)

phpffmpeg转码进度技巧_ffmpeg内存实时转码

FFmpeg读写内存的关键点有2个:

phpffmpeg转码进度技巧_ffmpeg内存实时转码
(图片来自网络侵删)

1. 初始化自定义的AVIOContext,指定自定义的回调函数。

2. 自己写回调函数。
把稳函数的参数和返回值(尤其是返回值)。

转码实际上便是解码和编码的结合。
该方面的知识可以参考文章:

解码:100行代码实现最大略的基于FFMPEG+SDL的视频播放器(SDL1.x)

编码:最大略的基于FFMPEG的视频编码器(YUV编码为H.264)

转码: 最大略的基于FFMPEG的转码程序

流程

程序的流程图如下图所示。
从图中可以看出,首先分别初始化了输入和输出的AVFormatContext。
然后首先解码输入的AVPacket,得到存储像素数据(YUV420P格式)的AVFrame,然后编码AVFrame为H.264的AVPacket,末了将编码后的AVPacket输出。

FFMPEG基于内存的转码实例

FFMPEG支持内存转码的,但没有现成可用的封装得很好的接口。
几经翻阅网络文章,找到了些许方法,结合自己的实验,完成既定目标。
网络上暂未创造有此类运用,写出来,尽一人绵薄之力。
至于常常盗窃他人成果,亦于此略表心意。

在FFMPEG中,转换视频有一套固定的办法,初始化好参数后,便是调用avformat_write_header写头部信息,调用av_write_frame写一帧数据,调用av_write_trailer写尾部信息,它们都利用AVFormatContext构造体作为参数。

对付利用文件名(file协议)的情形,初始化参数后,调用avio_open来打开文件。
后面可以不用管文件名称了。

对付利用ftp协议的情形,除了在协议路径上加“ftp://ip/”,其它的步骤和上述情形一样。
但必须把稳的是,编译FFMPEG时要添加对应的协议,否则会不堪利。
其余还要在代码加上avformat_network_init函数进行初始化。

说回本文重点。
本文关注的是利用FFMPEG将转换好的视频数据放到内存中,该内存中的数据是完备的视频,直接保存成文件即可播放而不用。
很多年以前搞AVI时研究过其格式,知道在写AVI文件时要将文件指针定位到文件头部,写文件总大小,会利用seek函数。
有的FTP做事是不支持回写和sekk功能的,这也是为什么我之前的考试测验会失落败。

鉴于此,想到了将所有的视频数据放到开辟好的内存,而seek则直接用指针来运算。
网络有这方面的文章,请参考文后地址。

FFMPEG支持自定义AVIOContext,利用avio_alloc_context返回AVIOContext构造体,同时该函数会通报自定义的read、write、seek函数。
再利用avformat_alloc_output_context2函数分配AVFormatContext构造体,再将上面分配的AVIOContext构造体赋值给AVFormatContext的pb成员。

下面说说我所做的步骤。

1、定义好write、seek或read。
详细参考文后源码。
要把稳的是,这里没有读操作,因此不实现,关注的是转码后的数据,因而实现了write和seek。
在write过程中,会涌现内存不足的情形以是我利用av_realloc函数来扩展内存,每次只扩展一半,不足再扩。

2、创建AVIOContext,关赋值,示例如下:

在这里要把稳avformat_alloc_output_context2函数,它会分配AVOutputFormat(如果不指定的话),out_filename是根据文件名来判断是哪一种格式,由于我没有限定利用什么格式,这和前面提到不该用文件是两回事。
详见代码。

3、由于不该用文件了,以是不须要调用avio_open了。
我在这里也纠结好久,一时没转过弯来。

其它就和普通文件的操作类似。

FFMPEG工程浩大,可以参考的书本又不是很多,因此很多刚学习FFMPEG的人常常觉得到无从下手。
因此特地分离出了一个大略的视频编码器供学习之用。
该视频转码器实现了视频格式之间的转换。
包含了封装格式的转换以及视音频编码格式的转换。
只管该视频转码器的代码十分大略,但是险些包含了利用FFMPEG转码一个视频所有必备的API。
十分适宜FFmpeg的初学者。

关注+私信免费领取领取一份99的视频学习资料哦

ffmpeg转码速率掌握方法

FFMPEG 像读取直播流一样读取文件

HLS当前吵得这么熙熙攘攘的,不知道大伙有没有碰着视频播着播着就卡住的问题

实在播着播着就卡住的这个问题,完备是由于吐流吐得太快了,m3u8更新得太快了,或者天生m3u8列表中的新INF太慢了,导致的数据处理问题,卡住,ffmpeg的转码进度实在可以掌握,通过help可以看到如下信息:

可以利用-re这个参数来掌握转码的速率,也便是说,像是播放实时流一样的输出文件,这么做可以掌握HLS输出的速率,非常nice

关注+私信可以免费领取一份99的视频学习资料哦,内容包括:C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,ffmpeg,

DPDK,嵌入式 等。


标签:

相关文章