linux下实现dlna识别当前音频格式,如何将实时音频流设置为DLNA兼容设备?

article/2025/9/28 23:42:49

问题描述

有没有办法将声卡的实时输出从我们的12.04.1 LTS amd64桌面流式传输到我们网络中的DLNA-compliant外部设备?使用Rygel,miniDLNA和uShare选择共享目录中的媒体内容总是很好 – 但到目前为止,我们完全无法通过DLNA向客户端获取实时音频流。

Pulseaudio声称有一个DLNA /UPnP媒体服务器,与Rygel一起应该这样做。但我们无法让它运行。

在12.04 LTS中,我们可以在DLNA客户端中选择本地音频设备或我们的GST-Launch流,但Rygel显示以下消息,并且客户端声明它到达播放列表的末尾:

(rygel:7380): Rygel-WARNING **: rygel-http-request.vala:97: Invalid seek request

无法在客户端上收听实时音频流。

只有在分发升级到14.04 LTS之后,我们才能从设置很好的outlined in below answer中选择我们的DLNA渲染器上的实时流。仍然,我们需要在启动rygel之后选择已建立的流,并且无法将新流推送到我们的UPnP设备。音频元数据未传输。

有没有其他选择将我们的声卡的音频作为实时流发送到DLNA客户端?

最佳解决方法

Pulseaudio-DLNA

我创建了一个小型服务器,可以发现网络中的所有upnp渲染器,并将它们作为接收器添加到pulseaudio。因此,您可以通过pavucontrol控制每个应用程序在您的upnp设备上播放。

这是我在linux下处理upnp设备时一直想要的那种舒适感。

sudo apt-get update && sudo apt-get install pulseaudio-dlna

然后,我们从命令行运行pulseaudio-dlna,其中包含以下选项:

pulseaudio-dlna [--host ] [--port ] [--encoder ] [--renderer-urls ] [--debug]

pulseaudio-dlna [-h | --help | --version]

当存在DLNA渲染器时,我们可以从声音菜单中选择它作为输出接收器:

5b004d958be00b9c1c7d797182418c67.png

次佳解决方法

Pavucontrol是这个拼图游戏中缺少的项目!我也正确设置了一切,外部设备(LG电视)显示声音正在播放,但我没有听到任何声音。今天我安装了pavucontrol,当我打开它时,我找到了通过DLNA服务器引导声音的选项。仅当播放器向pulseaudio输出声音时,才会显示DLNA选项。

7e4bf1c7edd9f87961711b9db5372c5a.png

第三种解决方法

对不起,我根本无法帮助你使用Rygel,但可能有一个替代方案可能适合你。

原理是获取一个程序将流记录到audiofile,然后使用指向流所在目录的自定义配置启动miniDLNA。

示例:假设我们在〜/stream /中工作。创建〜/stream /minidlna.conf

network_interface=wlan0

media_dir=/home//stream/

friendly_name=Live Audio Stream

db_dir=/home//stream/

album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

inotify=no

enable_tivo=no

strict_dlna=no

notify_interval=900

serial=12345678

model_number=1

然后将流保存到该目录中的audiofile。谷歌搜索“FFmpeg记录声卡音频”产生了这个命令

ffmpeg -f alsa -i default -acodec flac ~/stream/OutputStream.flac

但我没有太多运气。另一个选择是vlc,你有一个GUI可用,但这不起作用。

然后在另一个终端窗口中启动miniDLNA:

minidlna -d -f ~/stream/minidlna.conf -P ~/stream/minidlna.pid

它应该找到OutputStream.flac,然后可以从您的网络设备访问。

希望如果你还没有解决它给你一些想法。

第四种方法

我必须将“我听到的”流式传输到DLNA渲染器(如WDTV)的一个想法是使用VLC作为http流服务流,并将pulse://alsa_output.xxx.monitor作为输入,并将其转码为MP3或FLAC。然后我想使用一些DLNA控制点让渲染器播放taht流。 VLC确实正确地为转码流提供服务,但它不允许设置mime类型,因此渲染器拒绝播放它。

接下来的想法是在python中编写一个http服务器来代替服务流。它使用parec从脉冲获取音频流,使用flac(或lame或您想要的任何内容)对其进行编码,并正确设置mime类型。

它适用于以下(非常简单)脚本:

#!/usr/bin/python

import BaseHTTPServer

import SocketServer

import subprocess

PORT = 8080

# run "pactl list short |grep monitor" to see what monitors are available

# you may add a null sink for streaming, so that what is streamed is not played back locally

# add null sink with "pactl load-module module-null-sink"

MONITOR = 'null.monitor'

MIMETYPE = 'audio/flac'

ENCODER = 'flac - -c --channels 2 --bps 16 --sample-rate 44100 --endian little --sign signed'

BUFFER = 65536

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):

def do_HEAD(s):

print s.client_address, s.path, s.command

s.send_response(200)

s.send_header('content-type', MIMETYPE)

s.end_headers()

def do_GET(s):

s.do_HEAD()

pa = subprocess.Popen('parec -d {} | {}'.format(MONITOR, ENCODER), shell = True, bufsize = BUFFER, stdout = subprocess.PIPE)

while True:

data = pa.stdout.read(1024)

if len(data) == 0: break

s.wfile.write(data)

print 'stream closed'

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "listening on port", PORT

try:

httpd.serve_forever()

except KeyboardInterrupt:

pass

httpd.server_close()

调整参数,运行它,并将DLNA渲染器指向您的机器。它适用于我的WDTV作为渲染器和带有BubbleUPnP作为控制点的Android手机(您可以在手动将新项目添加到播放列表时输入流URL)。但它应该适用于任何DLNA兼容设备。

第五种方法

以下是Ubuntu 14.04(也经过测试并在15.04上工作)的答案,完整性:

安装任何所需的包:sudo apt-get install rygel rygel-preferences rygel-gst-launch

创建包含以下内容的文件~/.config/rygel.conf:

[GstLaunch]

enabled=true

title=@REALNAME@'s stream

launch-items=myaudioflac;myaudiompeg

myaudioflac-title=FLAC audio on @HOSTNAME@

myaudioflac-mime=audio/flac

myaudioflac-launch=pulsesrc device=upnp.monitor ! flacenc quality=8

myaudiompeg-title=MPEG audio on @HOSTNAME@

myaudiompeg-mime=audio/mpeg

myaudiompeg-launch=pulsesrc device=upnp.monitor ! lamemp3enc target=quality quality=6

[Playbin]

enabled=true

title=Audio/Video playback on @REALNAME@'s computer

[general]

interface=

upnp-enabled=true

[MediaExport]

uris=

从命令行执行以下命令(如果需要,可以将这些命令放入脚本中):

pactl load-module module-http-protocol-tcp

pactl load-module module-rygel-media-server

rygel &

运行paprefs命令,并确保在”Network Server”选项卡上启用(选中)两个DLNA选项。

在您的计算机上播放一些音频。运行pavucontrol程序,在”Playback”选项卡上,将输出设备更改为“DLNA /UPnP Streaming”。

此时,您应该能够从DLNA客户端(渲染器/控制点)播放MPEG和FLAC流。

注意:您可能需要重新启动计算机(或重新启动脉冲)才能开始工作。

第六种方法

来自Adam的python脚本正是我所需要的。辉煌。带有gst-launch的Rygel不能与我的一个渲染器一起使用,但是这个脚本适用于两者。在我的情况下,我正在从squeezelite(用于squeezebox)输入音频流并发送到渲染器。该脚本也可以原始形式工作,从脉冲音频监视器获取输入,如果需要的话。

对这些知之甚少,我设法对脚本做了一些补充:

i)允许它从shell脚本运行并以SIGTERM /SIGKILL终止(‘except’语句现在包含’systemexit’)

ii)允许脚本停止并重新启动,并且re-use是相同的端口(因为重新启动的脚本往往失败,说如果渲染器仍然打开它就无法打开端口) – (allow_reuse_address = True语句)

iii)创建一个从stdin获取输入的版本,并使用sox对其进行重新采样,以wav格式输出(在端口8082上)

所以我的版本看起来像:

#!/usr/bin/python

import BaseHTTPServer

import SocketServer

import subprocess

PORT = 8082

MIMETYPE = 'audio/x-wav'

BUFFER = 65536

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):

def do_HEAD(s):

print s.client_address, s.path, s.command

s.send_response(200)

s.send_header('content-type', MIMETYPE)

s.end_headers()

def do_GET(s):

s.do_HEAD()

pa = subprocess.Popen('sox -t raw -r 96000 -b 24 -L -e signed -c 2 - -t wav -r 44100 -b 16 -L -e signed -c 2 - ', shell = True, bufsize = BUFFER, stdout = subprocess.PIPE)

while True:

data = pa.stdout.read(1024)

if len(data) == 0: break

s.wfile.write(data)

print 'stream closed'

SocketServer.TCPServer.allow_reuse_address = True

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "listening on port", PORT

try:

httpd.serve_forever()

except (KeyboardInterrupt, SystemExit):

pass

httpd.server_close()

参考资料


http://chatgpt.dhexx.cn/article/mKvmR6vK.shtml

相关文章

IOS版aplayer使用教程_享声数播APP使用指南【ios版】

享声数播的内容播放是支持APP操作的,现在我们简单介绍一下相关的操作指南。 关于享声APP,官方推荐安卓手机用户使用bubbleupnp ,苹果ios用户使用8player 举例设备:享声A1 软件:8player 操作顺序 【数播端操作】 ①享声数播用网线连接到路由器 ②在享声主屏幕上切换到【通用…

打开方式中选择默认方式无反映_「全民标签」论享声A1的APP打开方式以及与树莓派的使用对比...

​ 大家好,我是流氓才子。 说在前面:今天的推送,末尾没有福利,因为个人觉得文章的主角就是最大的福利。。。先别急着说这句广告很硬,往下翻翻试试? 近一个月来论坛最火的机器是啥?没猜错的话应该…

Android上好用的DLNA播放器BubbleUPnP

BubbleUPnP的厉害之处在于:实现在手机上听电脑上的歌,或者控制电脑上的播放器当遥控器用。用foobar2000只需要添加一个叫foo_upnp的插件即可,XMBC或者别的支持UPNP的播放器也可以。 BubbleUPnP播放器能够轻松播放手机中的音视频及网络上的UPn…

BubbleUPnP多屏互动

一,相关简介 1、 DLAN简介(百度百科) DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE,其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Living Network Alliance)由索尼、英特尔、微软等…

WebDAV之葫芦儿·派盘+BubbleUPnP

BubbleUPnP 支持WebDAV方式连接葫芦儿派盘。 推荐一款投屏神器,它将手机内容分享到电视大屏上与家人好友一起共享,软件还提供了丰富的音乐及影视资源,喜欢的内容在线搜索就能播放。支持连接葫芦儿派盘WebDAV服务站,可以直接播放派盘内的影视资源。 BubbleUPnP是一款支持U…

数据结构和算法——Huffman树和Huffman编码

Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领域有着广泛的应用。在word2vec模型中,在构建层次Softmax的过程中,也使用到了Huffman树的知识。 在通信中,需要将传输的文…

Huffman编码压缩文件

文章目录 前言一、Huffman编码是什么?二、Huffman编码的实现方法三、Huffman压缩文件1.统计文件个字符出现的次数2.生成Huffman树3.生成码表4.对文件进行压缩 四、Huffman解压文件五、实验结果总结 前言 这个实验是我在学习信息论与编码时所做的课程实验&#xff0…

自适应Huffman编码

自适应Huffman编码,可用初始编码表(数字音视频技术,实验二) 如果你已经理解了 自适应Huffman编码 ,那么你不应该浪费时间在无聊的实验上 实验目的 1、深入掌握自适应Huffman编码的原理 2、掌握自适应Huffman编码算法…

huffman python,哈夫曼(Huffman)编码python代码实现

首先看定义 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称…

Huffman Tree

Huffman Tree 哈夫曼树;哈夫曼编码;最优二叉树 自底向上 变长编码;前缀编码;熵编码 数据无损压缩;最短编码;最佳判定树 一、基本概念 Huffman Tree,又称最优二叉树,是带权路径长度最…

Huffman Codes

题目 In 1953, David A. Huffman published his paper “A Method for the Construction of Minimum-Redundancy Codes”,and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am encounte…

HuffmanTree

#include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "string.h"typedef int ELEMTYPE;//哈弗曼树节点结构体 typedef struct HuffmanTree {ELEMTYPE weight;ELEMTYPE id;//区分权值相同的节点struct HuffmanTree* …

JPEG中Huffman解码实例讲解

DHT Huffuman表格式 -------------------------------------------------------------------------- 名称 字节数 值 说明 -------------------------------------------------------------------------- 段标识 1 FF 段类型 1 C4 段…

哈夫曼树(huffman)

学完了huffman树,讲一下自己对它的理解 huffman树遵循二叉树的原则,每个节点最多有两个子节点,但是每个节点都带有一个权重,如果我们要将一组字符串 “ B D C A F E ” 插入huffman树,每个字符都会带有一个权重&#…

Huffman树和Huffman编码

文章目录 Huffman树的定义带权路径长度WPL Huffman树的构造Huffman树的特点 Huffman编码构造Huffman编码 Huffman树的定义 哈夫曼(Huffman)树,又称最优二叉树,是一类带权路径长度WPL最短的树。 带权路径长度WPL 要理解带权路径…

Huffman树(哈夫曼树)

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为…

虚拟机下安装BackTrack5 (BT5)教程及BT5汉化

isare邀请您访问Backtrack中文网 http://www.backtrack.org.cn/?fromuid50397 isare邀请您访问Backtrack中文网 http://www.backtrack.org.cn/?fromuserisare PS:back track 安装过程中有2点要注意:第一:复制到99%的时候会等大约10来分钟&a…

bt 下载工具 deluge 配置 优化 使用

目录 Ubuntu 18 配置 deluge Deluge 安卓远程客户端 Deluge 性能调优 deluge是基于libtorrentpython的跨平台bt/pt客户端,适合在Linux环境下使用 deluge完全开源免费,对IPv6支持良好,性能优于transmission;在嵌入式设备上使用d…

BT5的U盘完整安装

BT5是什么就不用多说了,从网上看了许多教程,大多是利用unetbootin工具将ISO文件直接解压到U盘上,这样并不能完全使用BT,保存好的文件,重启机器后就没了,其实就是当做光盘使用了,另外还有一个方法…

有哪些好用的BT下载器?

​​​​​​2022年5个好用的 BT/ 磁力链接下载工具推荐 |Windows 、安卓系统 | 科技雷达 A full-featured download manager