【发布时间】:2022-02-06 16:41:14
【问题描述】:
我正在尝试在我的服务器上将传入的 rtmp 流保存为 mp4 文件。我正在使用nginx-rtmp 模块并将exec_record_done 指令上的容器从flv 更改为mp4。这是使用 ffmpeg 完成的,如下所示
ffmpeg -i input.flv output.mp4
我正在发送 h264 视频流和 aac 音频流(在一个 flv 容器中),以保持它与 mp4 兼容
我想知道是否可以将传入的流直接保存为mp4并避免在每个会话结束时进行转码
我猜这将有助于避免我在录制完成时看到的突然 CPU 峰值
nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish all;
allow play all;
application live {
live on;
record all;
record_suffix .flv;
record_path /tmp/videos/;
record_unique on;
exec_record_done ffmpeg -y -i $path /home/ubuntu/videos/$basename.mp4;
}
}
}
我认为这很简单,因为底层流保持不变。任何帮助表示赞赏:)
【问题讨论】:
-
MP4 不是实时流媒体格式(它作为存储文件逐步下载)。 MP4 编码器需要所有可用数据,因为 MP4 的元数据列出了所有关键帧和视频中每一帧的时间等。在这种情况下,元数据在所有数据都已知(记录完成)之前无法存在。可能的解决方案 如果它只是视频,则可以存储 H264(以及录制后的多路复用器)。如果您也有音频,那么您将需要一个 a/v 容器。如果您不喜欢 FLV 容器,可以尝试输出为 分段 MP4 格式。