我正在录制直播,很多人都会因为PK而调整分辨率。
比如solo时分辨率为720x1280,开始PK后,分辨率变为900x720,PK结束后,回到solo,分辨率又变为720x1280。
这些录制的视频文件太大了,而且都是h264,所以我尝试将它们重新编码为AV1以减小文件大小。
但重新编码后,分辨率是固定的,不会像以前那样正确调整。
这是图片,我没有足够的声誉来发布图片。https ://i.sstatic.net/LhLAXMjd.gif
例如,原始文件在左侧,重新编码的文件在右侧。
本视频以 900x720 开始,PK 结束并于 00:00:06 回到独奏,分辨率变为 720x1280。
ffplay 播放原始视频文件,一切看起来都很好。
ffplay 播放重新编码的视频文件,在 00:00:06 之后,分辨率仍然保持 900x720,并导致图形拉伸和切断。
这是我使用的命令:
ffmpeg -i original.flv -y -c:v libsvtav1 re-encode.mp4
我尝试使用相同的编解码器 h264 重新编码,但同样的问题仍然存在
ffmpeg -i original.flv -y -c:v libx264 re-encode.mp4
不知道如何解决这个问题
这是视频文件:https ://www.mediafire.com/file/0vaxtzurwhom8bn/ReEncode_Resolution.zip/file
我希望重新编码的视频文件可以在 ffplay 中正确播放(需要时分辨率会改变)
问题是 FFmpeg 读取第一帧的分辨率,并将剩余视频缩放(调整大小)为第一帧的分辨率。
我们可以通过将整个视频缩放和填充到(比如说)900x720 分辨率来解决这个问题:
if(lt(iw/ih,900/720),-2,900)
900
-如果框架太宽,则将宽度设置为(否则设置为-2
以保持比例)。if(lt(iw/ih,900/720),720,-2)
720
-如果框架太高,则将高度设置为(否则设置为-2
以保持比例)。pad=900:720:(ow-iw)/2:(oh-ih)/2
- 添加黑色边距(如果需要)以将分辨率固定为 900x720。注意:
-2
应用自动比例,但即使如此。编辑:
使用多种分辨率重新编码文件:
据我所知,不支持使用 FFmpeg 在“单次传递”中重新编码具有多种分辨率的单个文件。
我们可以将文件拆分为多个文件(段),重新编码每个段,然后连接已编码的段。
要自动执行该过程,需要一个脚本(未包含在内)。
以下解决方案通过示例输入视频展示了各个阶段(“手动”) :
将视频分割成片段 - 每个片段包含一个GOP(以关键帧开始,中间没有任何关键帧)。
使用Segment Muxer可以
-segment_time 0
做到这一点:使用 AV1 编码器对每个片段进行编码:
编辑生成的文件
list.txt
-将所有文件替换.flv
为.mp4
:使用Concat Demuxer连接 MP4 片段文件:
确保
output.mp4
包含多个分辨率(使用 FFprobe):输出为: