使用 ffmpeg-python+命名管道进行图片转视频或推流

这篇具有很好参考价值的文章主要介绍了使用 ffmpeg-python+命名管道进行图片转视频或推流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

命名管道(Named Pipe),也被称为FIFO,是一种在UNIX、Linux和类Unix系统中用于实现进程间通信(IPC)的机制。在Python中,我们可以使用os模块来创建和操作命名管道。

命名管道实际上是个特殊的文件,需要先创建

# 创建命名管道
os.mkfifo(pipe_name)

读写前后需要打开关闭

# 打开备写
pipeout = os.open(pipe_name, os.O_WRONLY)

# 写入数据
os.write(pipeout, framedata)

# 关闭管道
os.close(pipeout)

ffmpeg从命名管道输入源的方法与普通文件输入类似

# 从管道输入输入rawvideo
video_in = ffmpeg.input(PIPE_VIDEO_PATH, format='rawvideo', pix_fmt='bgr24', s="{}x{}".format(VIDEO_WIDTH, VIDEO_HEIGHT))

完整代码,推流或生成视频仅需输入目标rtmp:文章来源地址https://www.toymoban.com/news/detail-853740.html

# coding: utf-8
import os
import time
import cv2
import ffmpeg

VIEW_PATH = 'view'
VIDEO_WIDTH = 1280
VIDEO_HEIGHT = 720

PIPE_VIDEO_PATH = '/tmp/pipe'
try:
    # 创建命名管道
    os.mkfifo( PIPE_VIDEO_PATH )
except OSError:
    print("mkfifo error:", OSError)

def main(rtmp='test.flv'):
    global VIDEO_HEIGHT
    global VIDEO_WIDTH
    filepath = os.path.join(VIEW_PATH, 'p640x1.jpg')
    src_img=cv2.imread(filepath)
    height, width, channels = src_img.shape
    VIDEO_HEIGHT = height
    VIDEO_WIDTH = width
    print('INFO', "height, width, channels : {} {} {}".format(height, width, channels))
    process_stdin = ffmpeg_process(rtmp)
    pipeout = os.open(PIPE_VIDEO_PATH, os.O_WRONLY) #打开命名管道准备写入
    s = time.time()
    count = 0
    while True:
        if count >= 10*25:  #目标视频时长10秒
            break
        os.write(pipeout, src_img.tobytes())
        count+=1
    os.close(pipeout)
    process_stdin.stdin.close()
    process_stdin.wait()
    print(time.time()-s)
    return 0


def ffmpeg_process(rtmp):
    # 从管道输入输入rawvideo
    video_in = ffmpeg.input(PIPE_VIDEO_PATH, format='rawvideo', pix_fmt='bgr24', s="{}x{}".format(VIDEO_WIDTH, VIDEO_HEIGHT))
    process_stdin = (
        ffmpeg
        .output(
                video_in,
                rtmp,
                #loglevel='quiet',
                vcodec='libx264',
                #acodec='aac',
                threads='3',
                # ac='2',
                # ar='44100',
                # ab='320k',
                preset='ultrafast',
                tune='zerolatency',
                f='flv'
                )
        .overwrite_output()
        #.run_async(cmd=["ffmpeg", "-re"],pipe_stdin=True)  #推流
        .run_async(cmd=["ffmpeg"],pipe_stdin=True)      #生成视频不用-re
    )
    return process_stdin

if __name__ == '__main__':
    main()

到了这里,关于使用 ffmpeg-python+命名管道进行图片转视频或推流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用ffmpeg对视频、图片进行旋转,上下翻转,水平翻转

    简介 :在使用ffmpeg做.h264编码后可能会使用vlc播放出现了图像垂直颠倒。可能的原因:RGB图像有两种存储方式:一种是从上往下扫描;另一种是从下往上扫描。OpenCV为从上往下扫描的方式,ffmpeg可能也是从上往下的存储方式,而OpenGL/Unity中的帧缓冲数据可能是从下往上的扫描

    2024年02月15日
    浏览(82)
  • Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serve&client通信

    文章目录 一、管道的应用实例-父进程唤醒子进程,子进程执行某种任务 二、命名管道 1.创建一个命名管道 2.匿名管道与命名管道的区别 3.命名管道的打开规则 4.用命名管道实现serverclient通信 后续将源码上传到gitee,上传后修改链接。 管道应用的一个限制就是只能具有共同祖

    2024年02月10日
    浏览(44)
  • python使用ffmpeg合并多张图片成视频

    注意: 需要在本地有ffmpeg,并且配置环境变量 下载链接如下:https://download.csdn.net/download/qq_30273575/87898080 # FFmpeg 将多张图片合成视频 # 可以使用 FFmpeg 库来将多张图片合成视频,下面是一个简单的示例: # 在代码中,需要提供存储图片的文件夹路径 images_path 和最终生成的视频

    2024年02月11日
    浏览(50)
  • 【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

      进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中

    2024年02月05日
    浏览(55)
  • 匿名管道与命名管道

    🚀进程间通信就是让两个进程进行交流,但是我们知道进程具有独立性,每个进程OS都会为其维护一个pcb,一个进程中的数据在另一个进程中是看不到的,那怎么实现进程间通信的呢? 🚀两个进程要想通信,首先它们需要看到同一份资源,其实就是操作系统出面,为它们提

    2024年02月03日
    浏览(41)
  • 【Linux从入门到精通】通信 | 管道通信(匿名管道 & 命名管道)

        本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信  1、3 进程通信的方式 二、匿名管

    2024年02月09日
    浏览(46)
  • 【Linux】进程间通信(匿名管道 & 命名管道)-- 详解

    如何理解进程间通信? 进程具有独立性,所以进程想要通信难度是比较大的,成本高。 在日常生活中,通信的本质是传递信息,但站在程序员角度来看, 进程间通信的本质:让不同的进程看到同一份资源(内存空间) 。 进程间通信就是进程之间互相传递数据,那么进程间

    2024年04月28日
    浏览(50)
  • 【Linux】匿名管道与命名管道,进程池的简易实现

    本质是先让不同的进程看到同一份资源,也就是两个进程都能对管道文件的缓冲区进行操作 这里我们pipe的时候,会使用两个文件描述符,这两个文件描述里面存的file结构体是同一个,也就是管道文件的file结构体,file结构体中存储有inode以及系统缓冲区,此时fork一个子进程

    2024年02月05日
    浏览(42)
  • 使用python对图片进行压缩

    对于图片,强行被定义高和宽会变形,我们希望图片被改变大小后,比例保持不变,完成对图片的压缩。 1.pillow : pip install pillow -i https://pypi.douban.com/simple 2. os : 连接文件,并获取文件夹下的文件名 获取picture文件下的相关图片的路径,将路径放到列表里面进行存储 使用Image模

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包