ffmpeg+srs实现推流

ffmpeg

常见参数

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
基本选项:
-formats    输出所有可用格式
-f fmt  指定格式(音频或视频格式)
-i filename     指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头
-y  覆盖已有文件
-t duration     记录时长为t
-fs limit_size  设置文件大小上限
-ss time_off    从指定的时间(s)开始, [-]hh:mm:ss[.xxx]的格式也支持
-itsoffset time_off     设置时间偏移(s),该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
-title string   标题
-timestamp time     时间戳
-author string  作者
-copyright string   版权信息
-comment string     评论
-album string   album名
-v verbose  与log相关的
-target type    设置目标文件类型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number     设置要记录的帧数
视频选项:
-b  指定比特率(bits/s),似乎ffmpeg是自动VBR的,指定了就大概是平均比特率
-vb     指定视频比特率(bits/s)
-vframes number     设置转换多少桢(frame)的视频
-r rate     桢速率(fps)
-s size     分辨率
-aspect aspect  设置视频长宽比(4:3, 16:9 or 1.3333, 1.7777)
-croptop size   设置顶部切除尺寸(in pixels)
-cropbottom size    设置底部切除尺寸(in pixels)
-cropleft size  设置左切除尺寸 (in pixels)
-cropright size     设置右切除尺寸 (in pixels)
-padtop size    设置顶部补齐尺寸(in pixels)
-padbottom size     底补齐(in pixels)
-padleft size   左补齐(in pixels)
-padright size  右补齐(in pixels)
-padcolor color     补齐带颜色(000000-FFFFFF)
-vn     取消视频
-vcodec codec   强制使用codec编解码方式('copy' to copy stream)
-sameq  使用同样视频质量作为源(VBR)
-pass n     选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file   选择两遍的纪录文件名为file
-newvideo   在现在的视频流后面加入新的视频流
高级视频选项
-pix_fmt format     set pixel format, 'list' as argument shows all the pixel formats supported
-intra  仅适用帧内编码
-qscale q   以<数值>质量为基础的VBR,取值0.01-255,约小质量越好
-loop_input     设置输入流的循环数(目前只对图像有效)
-loop_output    设置输出视频的循环数,比如输出gif时设为0表示无限循环
-g int  设置图像组大小
-cutoff int     设置截止频率
-qmin int   设定最小质量
-qmax int   设定最大质量
-qdiff int  量化标度间最大偏差 (VBR)
-bf int     使用frames B 帧,支持mpeg1,mpeg2,mpeg4
音频选项:
-ab     设置比特率(单位:bit/s,也许老版是kb/s)
-aframes number     设置转换多少桢(frame)的音频
-aq quality     设置音频质量 (指定编码)
-ar rate    设置音频采样率 (单位:Hz)
-ac channels    设置声道数
-an     取消音频
-acodec codec   指定音频编码('copy' to copy stream)
-vol volume     设置录制音量大小(默认为256)
-newaudio   在现在的音频流后面加入新的音频流
字幕选项:
-sn     取消字幕
-scodec codec   设置字幕编码('copy' to copy stream)
-newsubtitle    在当前字幕后新增
-slang code     设置字幕所用的ISO 639编码(3个字母)
Audio/Video 抓取选项:
-vc channel     设置视频捕获通道(只对DV1394)
-tvstd standard     设置电视标准 NTSC PAL(SECAM)

vcodec和-c:v,-acodec和-c:a的区别

-vcodec 等价与 -c:v   -acodec 等价与 -c:a

流程图

  1. 输入文件
  2. 解封装
  3. 视频码流
  4. 音频码流
  5. 封装
  6. 输出文件

C++音视频开发学习资料点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

ffmpeg操作电脑

ffmpeg -list_devices true -f dshow -i dummy

[dshow @ 0000027bcb107d80] "XiaoMi USB 2.0 Webcam" (video)
[dshow @ 0000027bcb107d80]   Alternative name "@device_pnp_?usb#vid_05c8&pid_03ec&mi_00#6&742fed8&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global"
[dshow @ 0000027bcb107d80] "麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" (audio)
[dshow @ 0000027bcb107d80]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}wave_{D8148BF9-80C5-46F4-8390-C21C4DBD56BB}"

打开摄像头

ffplay -f dshow -i video="@device_pnp_?usb#vid_05c8&pid_03ec&mi_00#6&742fed8&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global"

打开桌面

ffmpeg -f gdigrab -i desktop  -r 60  -g 60 -f flv  rtmp://182.61.17.16:1935/live/1234

ffmpeg视频转码

  1. 转换成H264编解码
ffmpeg -i input_file -vcodec h264 output_file # -vcodec h264 表示视频编解码方式为 H264。

转换成H265编解码

ffmpeg -i input_file -vcode hevc output_file 
# -vcodec  hevc 表示视频编解码方式为 H265,注意ffmpeg 中名称为 hevc,不是H265!

设置输出视频的分辨率

ffmpeg -i input_file -vcodec h264 -s 1280x720 output_file
# 其中 -s 表示分辨率。

剪切某段视频

ffmpeg -ss 0:05:00 -t 0:1:30 -i input_file -vcodec copy -acodec copy output_file
ffmpeg -ss 300 -t 90  -i input_file -vcodec copy -acodec copy output_file
#上面的两种方式等价,时间格式支持 HH:MM:SS或者秒数。 -ss 开始时间, -t 持续时间, -vcodec copy 保持原视频编码, -acodec copy 保持原音频编码。

分离音视频流保存为不同文件

ffmpeg -i input_file -vcodec copy -an output_file_video  //提取视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio  //提取音频流
# 其中 -an 表示不处理音频, -vn 表示不处理视频。

合并多个音视频文件为一个文件

ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file

提取视频图像保存为图片文件

ffmpeg –i input_file –r 1 –f image2 image-%3d.jpeg        //提取图片
# 其中 -r 表示提取图像的频率,-f 表示输出格式, %3d 表示文件命名方式(也即生成的图片名为 image-001.jpeg, image-002.jpeg, ...., image-999.jpeg)。

录制rtsp网络数据流

ffmpeg –i rtsp://192.168.1.100:5555/test_stream –vcodec copy out.avi
将rtsp的网络视频流文件保存为 out.avi 本地文件

ffmpeg 视频推流

ffmpeg -re  -i test.mp4 -vcodec h264 -c copy -f flv rtmp://182.61.17.16:1935/live/1019232

推送电脑摄像头

ffmpeg -f dshow -i video="@device_pnp_?usb#vid_05c8&pid_03ec&mi_00#6&742fed8&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global" -vcodec libx264 -f flv  rtmp://182.61.17.16:1935/demo/1234

C++音视频开发学习资料点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

ffprobe

ffprobe获取视频信息

ffprobe face_trans.mp4
###
# 表明视频文件的封装格式属于 mov,mp4,m4a,3gp,3g2,mj2 格式集合
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'face_trans.mp4': 
  Metadata:
    major_brand     : isom # major_brand表明视频文件属于isom
    minor_version   : 0
    compatible_brands: mp41avc1 # 兼容格式有mp41avc1
    creation_time   : 2022-02-24T08:18:00.000000Z # 视频文件创建时间是2022年02月24日8时18分00秒
    encoder         : vlc 3.0.7.1 stream output
    encoder-eng     : vlc 3.0.7.1 stream output
  # 表明视频文件时间长度是1分钟8.68秒,开始播放时间是0.0秒,视频码率是2553kb/s
  Duration: 00:01:08.68, start: 0.000000, bitrate: 2553 kb/s
  # 视频编码格式是h264,子类型是high类型,颜色空间是yuv420p,分辨率是1920x1080,码率是2552kb/s,帧率是25.04帧每秒,tbr也是帧率的意思
  Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2552 kb/s, 25.04 fps, 25 tbr, 1000k tbn (default)
    Metadata:
      creation_time   : 2022-02-24T08:18:00.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]

视频元数据信息转json格式

ffprobe -v quiet -show_format -show_streams -print_format json face.mp4

#### 
{
    "streams": [
        {
            "index": 0,
            "codec_name": "h264",
            "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
            "profile": "High",
            "codec_type": "video",
            "codec_tag_string": "[0][0][0][0]",
            "codec_tag": "0x0000",
            "width": 1920,
            "height": 1080,
            "coded_width": 1920,
            "coded_height": 1080,
            "closed_captions": 0,
            "film_grain": 0,
            "has_b_frames": 0,
            "pix_fmt": "yuv420p",
            "level": 40,
            "chroma_location": "left",
            "field_order": "progressive",
            "refs": 1,
            "is_avc": "false",
            "nal_length_size": "0",
            "id": "0x1e0",
            "r_frame_rate": "25/1",
            "avg_frame_rate": "25/1",
            "time_base": "1/90000",
            "start_pts": 7200,
            "start_time": "0.080000",
            "duration_ts": 47062800,
            "duration": "522.920000",
            "bits_per_raw_sample": "8",
            "extradata_size": 34,    
        }
    ],
    "format": {
        "filename": "face.mp4",
        "nb_streams": 1,
        "nb_programs": 0,
        "format_name": "mpeg",
        "format_long_name": "MPEG-PS (MPEG-2 Program Stream)",
        "start_time": "0.080000",
        "duration": "522.920000",
        "size": "127365097",
        "bit_rate": "1948521",
        "probe_score": 26
    }
}

ffprobe获取视频总帧数

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

备注:

C++音视频开发学习资料点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

srs

启动命令

./objs/srs -c ./conf/http.flv.live.conf

srs配置

# 打开SRS提供的配置文件http.flv.live.conf并修改
# vim /usr/local/srs/conf/http.flv.live.conf

内容如下:
# the config for srs to remux rtmp to flv live stream.
# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream
# @see full.conf for detail config.

listen              1935;                   # RTMP监听端口
max_connections     1000;                   # 最大连接数
daemon on;                                  # 是否以守护进程方式启动
http_server {                               # nginx服务 
    enabled         on;                     # on为启用
    listen          8080;                   # 监听端口
    dir             ./objs/nginx/html;      # nginx主页地址,服务启动成功后可以通过访问http://ip:port
}


vhost __defaultVhost__ {                 # 启用HTTP LIVE STREAMING虚拟主机服务
    http_remux {
        enabled     on;             # 是否启用
        mount       [vhost]/[app]/[stream].flv;
        # [vhost] 当前http live stream 的虚拟主机,该变量为可选项
        # [app] 当前http live stream的app
        # [stream] 当前http live stream的流
        # 通过设置不同后缀来实现不同输出不同视频流,可以为:.flv、.ts、.mp3、.aac
        # 播放地址为:http://ip:port/live/livestream.flv,注:此处端口为http_server中设置的端口
    }
}
展开阅读全文

页面更新:2024-04-07

标签:字幕   选项   尺寸   音频   格式   方式   质量   文件   时间   视频

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top