最近给自己的服务器添加了新的电脑的 SSH 权限,但是新电脑上反复尝试都不能 ssh 上服务器。然而通过旧电脑却可以登录上去。没想到竟是因为设备上没有 inode 了。 inode 是什么呢?...使用 df 命令解决“设备上没有剩余空间”的报错 登录到服务器上后,看到了“设备上没有剩余空间”的报错,touch 一个新文件也报这个错,rm 删除东西时就一直卡住了。...这个时候就可以通过 df -h 命令查一下空间使用情况,如果是空间使用满了,就用 du -sh 命令来查找大文件,删除无用的文件来腾空间。...我这次通过 du -sh 查找到 docker 相关的目录占了很多空间,而 docker 本身却打不开,所以先删掉了也占很大空间的/var/log/ 下的文件,其中 maillog 居然有上 G 大小,...tail 了一下发现有好多 “设备上没有剩余空间” 的日志。
前言 上一章,我们了解ffmpeg的解封装,解码过程,这一章我们来了解一下ffmpeg是怎样进行编码,和封装工作的,工作流程如下图所示: [mtkxdodnko.png] 音视频为什么需要编码?...音视频编码主要是为了做压缩,如果音视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。...用于输出编码器中剩余的AVPacket。 10、av_write_trailer():写文件尾。...FFmpeg编码接口使用 1.这步必须放在所有ffmpeg代码前第一个执行在使用FFmpeg解码媒体文件之前,首先需要注册了容器和编解码器有关的组件 //注册所有ffmpeg组件 avcodec_register_all...用于输出编码器中剩余的AVPacket。
源码请参看 https://andy-zhangtao.github.io/ffmpeg-examples/ FFmpeg提供了很多实用且强大的滤镜,比如:overlay, scale, trim, setpts...首先按照前面几篇的套路,在开发FFmpeg应用时,大致有三板斧: 初始化输入设备(初始化解码器及其应用上下文) 初始化输出设备(初始化编码器及其应用上下文) 编写帧处理逻辑(对符合要求的帧数据做各种运算处理...在没有B帧的情况下,PTS=DTS。 而计算pts时,需要建立编码time_base和解码time_base的对应关系. 假设,time=5....inCodecContext->sample_aspect_ratio.num, inCodecContext->sample_aspect_ratio.den); av_log(NULL, AV_LOG_ERROR...初始化其它filter 通过``使用指定的Filter Graph 语法来初始化剩余的Filter,例如: const char *filter_descr = "movie=t.png[wm]
1.2.1 查看FFmpeg支持的封装格式 使用ffmpeg -formats命令可以查看FFmpeg支持的封装格式。...命令行中,输入文件扩展名是错的也没有关系,因为FFmpeg会读取一小段文件来探测出真正的封装格式;但是如果未显式的指定输出封装格式,就只能通过输出文件扩展名来确定封装格式,就必须确保扩展名是正确的。...* @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush * * @see av_interleaved_write_frame...如果调用者不愿处理packet交织问题,应调用av_interleaved_write_frame()替代本函数。...* * @return 0 on success, a negative AVERROR on error.
一、环境介绍 Visual Studio IDE 版本: VS2017 QT版本: QT5.12.6 产生问题环境: 在Visual Studio 2017下开发QT程序,引用了ffmpeg库实现视频播放器开发...1>CClipVideo.obj : error LNK2019: 无法解析的外部符号 _av_interleaved_write_frame,该符号在函数 "protected: int __thiscall...ClipVideo@CClipVideo@@IAEHXZ) 中被引用 1>VideoEncode.obj : error LNK2001: 无法解析的外部符号 _av_interleaved_write_frame...解决问题 出现问题的情况, 一般是在工程里引用了外置库的相关函数,在链接里没有指定库的路径或者是定义函数的.cpp文件没有加入到工程中。...如果是因为引用了外置的库,并用到了外置库里函数,没有加链接路径,那么按照下图把使用的库加入到附加依赖项里即可。
📷 可看到如下结果: 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root xfs ...
# 调试接口 avformat_version:FFmpeg 版本信息 avformat_configuration:FFmpeg 编译配置信息 avformat_license:FFmpeg 许可证信息...许可法律风险 FFmpeg 本身是 LGPL 的,但是 FFmpeg 可以引入其他第三方库,比如 libfdkaac 是 nonfree 的,就有可能存在专利收费的法律风险。...# AVFormat 前处理 前处理部分,主要包含网络初始化、模块遍历、申请上下文空间、打开文件,还有分析音视频流等操作。...avformat_free_context 释放 avformat_open_input 和 avformat_close_input:打开 AVInputFormat 并挂在 AVFormatContext 上,...从输入文件中读取音视频数据包,将音视频数据包写入输出文件会使用 av_read_frame 函数,从输入文件中读取 AVPacket 音视频数据包,还会使用 av_interleaved_write_frame
写入头部到文件 if (avformat_write_header(ofmt_ctx, NULL) < 0) { log_ss( "Error occurred when opening output...将对 packet 进行缓存和 pts 检查,av_write_frame没有 if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) {...log_ss( "Error muxing packets"); break; } log_ss("Write frames to output...原因:主要是因为使用了mp4中的h264编码,而h264有两种封装: 一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中;另一种是mp4模式,一般mp4、mkv、avi会没有...startcode,SPS和PPS以及其它信息被封装在container中,每一个frame前面是这个frame的长度,很多解码器只支持annexb这种模式,因此需要将mp4做转换;在ffmpeg中用h264
如果没有指定输入的AVOutputFormat,就需要根据文件格式名称或者文件名推测输出的AVOutputFormat。...* * @return 0 if OK, < 0 on error or end of file */ 总结起来每段的核心意思 读取码流中的音频若干帧或者视频一帧 如果pkt->buf是空,那么就要等待下一次...av_interleaved_write_frame 输出一帧视音频数据 核心类 AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。...) I帧(关键帧,完整的数据) B帧(上一帧和下一帧的变化)] 有了B帧压缩率更高。...内部指向的视频空间和音频空间 //av_packet_unref(&avPacket); } return 0; } int avError(int errNum) {
等到我们越来越熟悉FFmpeg和一些技术,那么之前的问题都会迎刃而解 这套代码我在4.4.2上运行时没问题的。所以如果有同学在5.0以上,如果涉及动态权限问题,大家加上即可。...当然有些设备可能有些不同。...但我发现并没有什么卵用。每次修改后采集的频率还是没变,擦! setPictureFormat 设置采集到图像的像素格式,Android推荐NV21。...,这里为264编码器,可以根据video_st里的codecID 参数赋值 pCodecCtx->codec_id = pCodec->id; //像素的格式,也就是说采用什么样的色彩空间来表明一个像素点...如果编码器获取失败就没有下文了 创建编码器上下文 pCodecCtx = avcodec_alloc_context3(pCodec) 设置编码器参数 这些参数我个参数的设置上都有加注释
这种方式可以避免繁琐的文件IO操作,节省磁盘空间。2.2.扩展性强内存输入和输出功能可以方便地扩展为其他更高级的应用程序,例如:流媒体服务器、实时音视频采集与处理等。...videoStreamIndex = i; break;//找到视频流就退出 } } //如果videoStream为-1 说明没有找到视频流...如下各函数在不同的阶段会输出数据,都会调用回调函数:avformat_write_header() 将流头部信息写入输出区av_interleaved_write_frame() 将数据包写入输出区av_write_trailer...out_video_stream->time_base); packet.stream_index = out_video_stream->index; ret = av_interleaved_write_frame...在使用完毕后,需要通过调用 avio_context_free() 函数来释放 AVIOContext 结构体占用的内存空间。
ffmpeg -i tnmil.flv -c:a copy -vn tnmil_a.flv ....} else if (ret < 0) { printf("video read error...} else if (ret < 0) { printf("audio read error...738 ap 14670 14670 367 ap 16740 16740 367 vp 36000 18000 4938 和上一节...ffmpeg -i tnmil.flv -c:v copy -an tnmil_v.flv ffmpeg -i tnmil.flv -c:a copy -vn tnmil_a.flv 不输出裸流,而输出带封装格式的流
codec,编码、解码 libavutil,util,通用音视频工具,像素、IO、时间等工具 libavfilter,filter,过滤器,可以用作音视频特效处理 libavdevice,device,设备...其实这是FFmpeg在运用面向对象的思想来编程。XxxxContext可以看做是C语言“类”的实现。 C语言没有类的语法特征,但可以用结构体struct来描述一组元素的集合。...AVFormatContext持有的是传递过程中的数据,这些数据在整个传递路径上都存在,或者都可以复用,AVInputFormat/AVOutputFormat中包含的是动作,包含着如何解析得到的这些数据...av_read_frame() 读取媒体文件中每一帧数据,这是未解码之前的帧 avformat_write_header() 写入输出文件的媒体头部信息 av_interleaved_write_frame...的学习过程很难,梳理清楚结构,整体的代码脉络就比较清楚了,但是libavfilter等核心模块本文没有讲。
如果输入是网络流,输出也是网络流,则实现的是转流功能,将一个流媒体服务器上的流推送到另一个流媒体服务器,如下: ? 2....(ofmt_ctx, &pkt); if (ret < 0) { printf("Error muxing packet\n"); break...= AVERROR_EOF) { printf("Error occurred: %s\n", av_err2str(ret)); return 1; }...return 0; } 2.1 收流 收流功能与打开普通文件代码没有区别,打开输入时,FFmpeg能识别流协议及封装格式,根据相应的协议层代码来接收流,收到流数据去掉协议层后得到的数据和普通文件内容是一样的一...av_q2d((AVRational){frame_rate.den, frame_rate.num}) : 0); } 在av_read_frame()之后,av_interleaved_write_frame
FFmpeg_allluckly.cn.png Mac编译ffmpeg获取FFmpeg-iOS ffmpeg的H.264解码 由上俩篇文章,我们已经对ffmpeg有了一定的了解和应用了,接下来让我们一起学习怎么利用...ffmpeg推流。...只要原因是文件夹系统没有权限导致的,解决方法是文件夹前往/usr/local/share/man/man8文件,显示简介设置系统可读可写即可。...#error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;...得到的推流服务器地址如下 rtmp://localhost:1991/liveApp/room 如果先前已经做过Mac编译ffmpeg获取FFmpeg-iOS这一步的话,不需要再继续下载ffmpeg。
FFMPEG 下载FFMPEG相关的文件和解压 从FFMPEG WINDOW BUILD中下载 dev和shared两个部分的内容 ?...再通过av_interleaved_write_frame将这一个帧发送出去。...,才会进入计算和校验 //没有封装格式的裸流(例如H.264裸流)是不包含PTS、DTS这些参数的。...ret = av_interleaved_write_frame(octx, &pkt); if (ret < 0) { printf("发送数据包出错...= AVERROR_EOF) { printf("Error occurred.\n"); return -1; }
如下是维基百科关于流媒体概念的定义: 流媒体 (streaming media) 是指将一连串的媒体数据压缩后,经过网络分段发送数据,在网络上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发送...如果输入是网络流,输出也是网络流,则实现的是转流功能,将一个流媒体服务器上的流推送到另一个流媒体服务器,如下: ? 2....(ofmt_ctx, &pkt); if (ret < 0) { printf("Error muxing packet\n"); break...return 0; } 2.1 收流 收流的代码与打开普通文件的代码没有区别,打开输入时,FFmpeg 能识别流协议及封装格式,根据相应的协议层代码来接收流,收到流数据去掉协议层后得到的数据和普通文件内容是一样的...av_q2d((AVRational){frame_rate.den, frame_rate.num}) : 0); } 在 av_read_frame() 之后,av_interleaved_write_frame
其次,将编码好的音视频 AVPacket 包添加到媒体文件中去,FFMpeg 为此提供的函数为av_interleaved_write_frame()。...最后,写入文件尾的数据,FFMpeg 为此提供的函数为av_write_trailer()。 封装的大致流程已经完成了,剩余的是一些收尾工作,比如释放分配的内存、结构体等等。...related_stream:尝试找到相关流,如果没有就设为-1。 decoder_ret:如果是non-NULL,返回选定的流的解码器。 flags:此处定位0。...avcodec_decode_video2(video_codec_ctx, frame, got_frame, &pkt); if(ret < 0){ fprintf(stderr, "Error...; pkt.size -= ret; }while(pkt.size > 0); av_free_packet(&orig_pkt); } 解封装大致流程已经完成了,剩余的是一些收尾工作
使用FFmpeg进行软件解码并通过RTMP进行推流 编译带有x264的FFmpeg 编写FFmpeg代码进行推流 通过ImageReader的回调,我们就可以得到截屏的数据了。...所以我们需要先给其分配内存空间和数据 pFrameYUV = av_frame_alloc(); int picture_size = av_image_get_buffer_size(...但实际上,因为由当前的实际来决定。...ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt); if (ret !...= 0) { avError(ret); LOGE("av_interleaved_write_frame failed"); } count++;
Github https://github.com/gongluck/FFmpeg4.0-study/blob/master/official%20example/my_example.cpp #include...MUXING //封装,需打开ENCODE #define HWDECODE //硬解码 #ifdef __cplusplus extern "C" { #endif // FFmpeg...[AV_ERROR_MAX_STRING_SIZE] = { 0 }; #define av_err2str(errnum) \ av_make_error_string(av_error, AV_ERROR_MAX_STRING_SIZE...nullptr) { std::cerr << "sws_getContext err" << std::endl; goto END; } // 分配内存空间...// ffmpe里很多汇编优化,它一次读取或写入的数据可能比你想象中的要多(某些对齐要求),所以ffmpeg操作的内存区域,一般都应该用av_malloc分配,这个函数通常分配的内存会比你要求的多
领取专属 10元无门槛券
手把手带您无忧上云