百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

ffmpeg 编码h264 profile如何设置为baseline的问题

ahcoder 2025-03-10 11:57 16 浏览

使用最新版ffmpeg-0.11 libx264-125,使用默认编码时,用Eyecard发现profile-idc一直是PROFILE_H264_HIGH (profile-idc=100),但是项目要求是baseline,设置了AVCodecContext的->profile=FF_PROFILE_H264_BASELINE也没用,经过多方查找,需要如下解决方法:


AVDictionary *opts = NULL;

av_dict_set(&opts, "profile", "baseline", 0);

/* open the codec */

if (avcodec_open2(m_pEncoderCtx, encoder, &opts) < 0)

et/kisaa133/article/details/7792008

FFMPEG生成高质量的h264编码视频

FFMPEG 转换h264格式视频,为了使视频的每一秒都有关键帧,我们分两步来生成,第一步生成两个临时文件,再组合生成最终的视频文件(windows和linux系统都通用)

(1)

ffmpeg -i input.mp4 -y input.temp.wav -s 640x360 -pix_fmt yuv420p -f rawvideo -y - | x264 --profile baseline --level 3 --keyint 25 --bitrate 512 --sar 1:1 --output input.temp.264 - 640x360

(2)

ffmpeg -i input.temp.wav -f h264 -i input.temp.264 -y -vcodec copy -acodec libfaac -ab 50k output.mp4


这样生成的视频质量比较高,不会出现锯齿,也不会出现花屏。

FFmpeg码率控制及内置编码参数介绍

  • 一、码率控制参数
  • 二、编码速度&编码质量&视觉优化参数
  • 一、码率控制:



    普通用户常用CRF、Two-Pass ABR 两种

    CRF(Constant Rate Factor - 限制码率因子)

    适用范围

    优点:该方法在输出文件的大小不太重要的时候,可以使整个文件达到特定的视频质量。该编码模式在单遍编码模式下提供了最大的压缩效率,每一帧可以按照要求的视频质量去获取它需要的比特数。

    缺点:不好的一面是,你不能获取一个特定大小的视频文件,或者说将输出位率控制在特定的大小上。

    参数解析:

    1)量化比例的范围为0~51,其中0为无损模式,23为缺省值,51可能是最差的。该数字越小,图像质量越好。从主观上讲,18~28是一个合理的范围。18往往被认为从视觉上看是无损的,它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲,它依然是有损压缩。

    2)若Crf值加6,输出码率大概减少一半;若Crf值减6,输出码率翻倍。通常是在保证可接受视频质量的前提下选择一个最大的Crf值,如果输出视频质量很好,那就尝试一个更大的值,如果看起来很糟,那就尝试一个小一点值。

    使用方法 - 命令行



    使用方法 - 源码
    在代码中使用时,通过 av_dict_set 设置到 AVDictionary 中,并作为参数传递给 avcodec_open2 即可


    Two-Pass ABR(两遍模式)

    适用范围:如果你的目标是一个确定大小的文件而且帧与帧之间的视频质量并不重要,这个方法很适用。这通过一个例子可以得到很好地解释。比如预期视频文件有10min(600s),200 MB: 200 * 8192 / 600 = ~2730 Kb 2730 - 128(音频常用的比特率) = 2602 kb

    使用方法 - 命令行


    其他码率控制方式

    ABR(Average Bitrate - 平均码率)

    解析:

    它提供了某种“运行均值”的目标,终极目标是最终文件大小匹配这个“全局平均”数字(因此基本上来说,如果编码器遇到大量码率开销非常小的黑帧,它将以低于要求的比特率编码,但是在接下来几秒内的非黑帧它将以高质量方式编码方式使码率回归均值)使用两遍编码模式时这个方法变得更加有效,你可以和“max bit rate ”配合使用来防止码率的波动。

    使用方法 - 命令行



    使用方法 - 源码

    如果设置了AVCodecContext中bit_rate的大小,则采用abr的控制方式

    如果没有设置AVCodecContext中的bit_rate,则默认按照crf方式编码,crf默认大小为23

    CBR(Constant BitRate - 恒定码率)

    解析:


    使用方法 - 命令行

    ffmpeg -i -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M

    // VP9

    ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M

    CQP(Constant Quantization Parameter - 固定质量参数)

    解析

    值越大,压缩率越大,质量越低。

    使用方法 - 命令行


    最大比特率的CRF/2-pass模式

    你可以通过声明-maxrate确保最大码率限制在一个范围里,对于流式传输非常有用,可以配合到(2-Pass)ABR或CRF模式一起使用。

    使用方法 - 命令行


    ffmpeg -i -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f mp4 /dev/null

    ffmpeg -i -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000


    编写代码的话,指定 AVCodecContext 的 rc_max_rate 和 rc_buffer_size 即可。bufsize 根据你希望比特率获得多大的可变性而设置,默认为 maxrate 的两倍,如果想限制流的比特率,可以设置为 maxrate 的一半。

    配合 CRF 模式使用的时候,如果设置的 crf 值过低,视频码率可能超出 -maxrate 的时候,编码器会自动调整 crf,避免出现较大的码率波动。然而,x264 不会严格控制你指定的最大码率,除非使用 2 pass 模式。

    使用方法 - 源码


    二、编码速度&编码质量&视觉优化参数

    preset

    主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。

    tune

    主要配合视频类型和视觉优化的参数况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。

    tune的值有: film: 电影、真人类型;

    animation: 动画;

    grain: 需要保留大量的grain时用;

    stillimage: 静态图像编码时使用;

    psnr: 为提高psnr做了优化的参数;

    ssim: 为提高ssim做了优化的参数;

    fastdecode: 可以快速解码的参数;

    zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

    profile

    H.264有四种画质级别,分别是baseline, extended, main, high:

      1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;

      2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)

      3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),

        也支持CAVLC 和CABAC 的支持;

      4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

    H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。

    根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。

    设置preset、tune、profile

    使用方法 - 命令行

    命令行的方式详见文档。

    使用方法 - 源码


    参考资料;

    C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,RTSP RTMP HLS 流媒体 ffmpeg

    WebRTC,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,嵌入式


    台私信;资料;两个字可以免费领取

    相关推荐

    Linux ntp时钟同步问题(linux ntp同步命令)

    有时候,操作系统会报linux的ntp时钟错误。从时钟源同步时间超时。我查看了一下ntp的时钟源,发现执行ntpq-p显示超时。执行nslookup时钟服务器域名,发现可以正常解析。执行了n...

    linux服务器同步利器Rsync全介绍(付脚本)

    1、认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件...

    如何使用Rsync同步两个网站服务器的内容

    本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。如需学习视频,请复制以下信息到手机浏览器或电脑浏览器上:zc...

    Linux TB级小文件同步备份解决方案

    在某些电子档案存储的业务系统下,按照业务场景要求,需要将产生的所有电子影像资料永久存储,并支持备份;因为“钞能力”等原因,一般备份存储只有一个节点(即:一个备份存储服务器);这样就要求研发工程师,不...

    CentOS7下使用Lsyncd实现文件实时同步

    Lsyncd简单介绍Lsyncd使用文件系统事件接口(inotify或fsevents)来监视本地文件和目录的更改。Lsyncd在几秒钟内将这些文件事件整理核对后,然后生成一个或多个进程以将更...

    如何手动同步Linux系统时间并与互联网时间保持同步?

    在Linux系统中,正确的时间同步对于许多任务都是至关重要的。一些关键应用程序可能需要准确的时间戳才能正常工作,而一些安全功能也需要确保所有服务器的时间都是准确的。NTP服务可以自动同步系统时间和互...

    Linux服务器Rsync定时同步一键化配置指南

    1、主从服务器同时安装rsyncopenssh-clientaptupdate&&aptinstall-yrsyncopenssh-client2、主服务器安装好后输入以下命令生成密钥...

    Linux系统如何使用NTPDATE命令设置时间同步

    简介:咱们在使用Linux系统的时候,常常能发现用了一阵子之后,Linux系统的时间就对不上了。已经知道的情况是,安装Linux的时候选的时区是Asia/Shanghai,可这系统运行了一...

    开源的Linux文件同步工具有哪些?(linux 文件夹 同步)

    Linux系统之间经常需要文件同步,一个好的文件同步工具省时省力,这里介绍几款开源的Linux文件同步工具1.rsync:rsync是Linux上一个功能强大的命令行工具,可以在不同的服务器之间同...

    Linux 系统使用 rsync + inotify 实现文件实时同步

    Linux系统使用rsync+inotify实现文件实时同步简介inotify监控文件的变化后通知rsync进行文件的同步#配置免密登录ssh-keygen-trsaca...

    Linux 远程数据同步工具详解(linux远程同步命令)

    一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之...

    构建基于 Linux 的 NTP 时间同步集群与时间安全防护实战指南

    一、为什么时间同步对系统如此重要?在分布式系统、数据库复制、消息队列、审计日志、安全认证(如Kerberos)、容器编排等场景中,系统时间一致性是保障正确性与安全性的基础。一旦服务器间时间漂移,可能...

    每日Linux学习:同步备份工具 rsync

    rsync是一个用于高效同步文件和目录的工具。它通过仅传输变化的部分(增量传输)来节省时间和带宽,支持本地同步、远程同步(通过SSH),还能保留文件原有权限、时间戳等属性。本文通过几个常用的实例来...

    Chromixium OS 1.0发布 基于Ubuntu发行版

    Chromixium项目宣布chromixiumOS1发布,一款基于Ubuntu的Linux分支,chromixiumOS试图重新打造一款外观和感觉与ChromeOS相似的完...

    iOS8.0.X~iOS8.1完美越狱!盘古团队出品

    【巴士速递·移动情报站】最新消息,iOS8.1越狱了!!此次越狱依旧是iOS7时代我国的大神盘古团队带来的,而该次越狱支持最新的iPhone6、iPhone6Plus、iPadAir2和iPad...