Gstreamer no element error (lamemp3enc) - streaming

I'm trying to use gstreamer at odroid C1+.
I installed gstreamer, base, good, ugly, bad, libav getting from here
https://gstreamer.freedesktop.org/modules/
following here
http://linuxfromscratch.org/blfs/view/svn/index.html
But when I run like this
gst-launch-1.0 -e pulsesrc device="alsa_input.usb-046d_0809_52A63768-02.analog-mono" ! audioconvert ! lamemp3enc target=1 bitrate=64 cbr=true ! filesink location=audio.mp3
I get error
WARNING: erroneous pipeline: no element "lamemp3enc"
How should I do?
++
I run
GST_PLUGIN_PATH=/usr/lib/gstreamer-1.0/ gst-inspect-1.0 lamemp3enc
and get
Factory Details:
Rank primary (256)
Long-name L.A.M.E. mp3 encoder
Klass Codec/Encoder/Audio
Description High-quality free MP3 encoder
Author Sebastian Dröge <sebastian.droege#collabora.co.uk>
Plugin Details:
Name lame
Description Encode MP3s with LAME
Filename /usr/lib/gstreamer-1.0/libgstlame.so
Version 1.8.1
License LGPL
Source module gst-plugins-ugly
Source release date 2016-04-20
Binary package GStreamer Ugly Plugins 1.8.1 BLFS
Origin URL http://www.linuxfromscratch.org/blfs/view/svn/
GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstAudioEncoder
+----GstLameMP3Enc
Implemented Interfaces:
GstPreset
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
audio/x-raw
format: S16LE
layout: interleaved
rate: { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
channels: 1
audio/x-raw
format: S16LE
layout: interleaved
rate: { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
channels: 2
channel-mask: 0x0000000000000003
SRC template: 'src'
Availability: Always
Capabilities:
audio/mpeg
mpegversion: 1
layer: 3
rate: { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
channels: [ 1, 2 ]
Element Flags:
no flags set
Element Implementation:
Has change_state() function: gst_audio_encoder_change_state
Element has no clocking capabilities.
Element has no URI handling capabilities.
Pads:
SINK: 'sink'
Pad Template: 'sink'
SRC: 'src'
Pad Template: 'src'
Element Properties:
name : The name of the object
flags: readable, writable
String. Default: "lamemp3enc0"
parent : The parent of the object
flags: readable, writable
Object of type "GstObject"
perfect-timestamp : Favour perfect timestamps over tracking upstream timestamps
flags: readable, writable
Boolean. Default: false
mark-granule : Apply granule semantics to buffer metadata (implies perfect-timestamp)
flags: readable
Boolean. Default: false
hard-resync : Perform clipping and sample flushing upon discontinuity
flags: readable, writable
Boolean. Default: false
tolerance : Consider discontinuity if timestamp jitter/imperfection exceeds tolerance (ns)
flags: readable, writable
Integer64. Range: 0 - 9223372036854775807 Default: 40000000
target : Optimize for quality or bitrate
flags: readable, writable
Enum "GstLameMP3EncTarget" Default: 0, "quality"
(0): quality - Quality
(1): bitrate - Bitrate
bitrate : Bitrate in kbit/sec (Only valid if target is bitrate, for CBR one of 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 or 320)
flags: readable, writable
Integer. Range: 8 - 320 Default: 128
cbr : Enforce constant bitrate encoding (Only valid if target is bitrate)
flags: readable, writable
Boolean. Default: false
quality : VBR Quality from 0 to 10, 0 being the best (Only valid if target is quality)
flags: readable, writable
Float. Range: 0 - 9.999 Default: 4
encoding-engine-quality: Quality/speed of the encoding engine, this does not affect the bitrate!
flags: readable, writable
Enum "GstLameMP3EncEncodingEngineQuality" Default: 1, "standard"
(0): fast - Fast
(1): standard - Standard
(2): high - High
mono : Enforce mono encoding
flags: readable, writable
Boolean. Default: false
Presets:
"Ubuntu"

what OS are you running on odroid (Android/Ubuntu?) what gives gst-inspect-1.0 lamemp3enc.. there is library path .. you can ldd it:
ldd /usr/local/lib/gstreamer-1.0/libgstlame.so
linux-vdso.so.1 => (0x00007ffc7dbed000)
libgstaudio-1.0.so.0 => /usr/local/lib/libgstaudio-1.0.so.0 (0x00007f4a97faa000)
libgstbase-1.0.so.0 => /usr/local/lib/libgstbase-1.0.so.0 (0x00007f4a97d4c000)
libgstreamer-1.0.so.0 => /usr/local/lib/libgstreamer-1.0.so.0 (0x00007f4a97a31000)
libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f4a977e0000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f4a974d8000)
libmp3lame.so.0 => /usr/lib/x86_64-linux-gnu/libmp3lame.so.0 (0x00007f4a9724a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4a9702c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4a96c67000)
libgsttag-1.0.so.0 => /usr/local/lib/libgsttag-1.0.so.0 (0x00007f4a96a2d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4a96727000)
liborc-0.4.so.0 => /usr/local/lib/liborc-0.4.so.0 (0x00007f4a964a4000)
libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f4a9629f000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f4a96097000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4a95e93000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f4a95c8a000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f4a95a4c000)
/lib64/ld-linux-x86-64.so.2 (0x0000558c95a32000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4a95833000)
Check if you have all libs .. you need especially libmp3lame.so ..
You can always use apt-file tool to check which package provides this lib.. but its quite apparent that its this package (run as root or sudo):
apt-get install libmp3lame-dev
If you did not have it at compile time (I guess you compiled as you linked linuxfromscratch..) you need to recomiple gst-plugins-ugly after installing this lib..
Then check the last part at when you rerun configure at ugly (I would suggest using autogen.sh instead.. but I dont know your environment..) which should mention if you will have mp3 builded..
UPDATE
So you just need to set the env variable GST_PLUGIN_PATH. Gstreamer just haven't known where to look for the gstreamer mp3 plugin..
you can export the env variable.. say in ~/.basrhc:
export GST_PLUGIN_PATH=/usr/lib/gstreamer-1.0/
and then just the same pipe will work perfectly, this is simpler one (tested, works):
gst-launch-1.0 -e audiotestsrc ! audioconvert ! lamemp3enc ! filesink location=audio.mp3
HTH

Related

Cardano Pre Production Testnet TrConnectError

Since the documention of the cardano developer portal is outdated (old testnet) i researched and now know about the new testnets documented here https://book.world.dev.cardano.org/environments.html and on Github.
I followed the tutorial on the documentation https://developers.cardano.org/docs/get-started/running-cardano about running the node for the testnet, but instead of using the deprecated files i used the new enviroment files for the pre production testnet.
Now i cant sync the network.
I get the following info over and over again:
TrConnectError (Just 127.0.0.1:1337) 3.72.231.105:30000 Network.Socket.connect: <socket: 29>: invalid argument (Invalid argument)
TrConnectionManagerCounters (ConnectionManagerCounters {fullDuplexConns = 0, duplexConns = 0, unidirectionalConns = 0, inboundConns = 0, outboundConns = 0})
TracePromoteColdFailed 50 0 3.72.231.105:30000 160.633570297628s Network.Socket.connect: <socket: 29>: invalid argument (Invalid argument)
TraceGovernorWakeup
TracePublicRootsRequest 100 1
TracePublicRootRelayAccessPoint [RelayAccessDomain "preprod-node.world.dev.cardano.org" 30000]
TracePublicRootResult "preprod-node.world.dev.cardano.org" [(3.72.231.105,60)]
TracePublicRootsResults (fromList []) 9 512s
console info from the node, same es in the text
I can get the sync status which looks like the first time running like this:
{
"block": 0,
"epoch": 0,
"era": "Byron",
"hash": "9ad7ff320c9cf74e0f5ee78d22a85ce42bb0a487d0506bf60cfb5a91ea4497d2",
"slot": 0,
"syncProgress": "0.01"
}
I tried it with the devnet, and preview testnet too - didn't work either.
Cardano node version (currently the newest):
cardano-node 1.35.3 - linux-x86_64 - ghc-8.10
git rev ea6d78c775d0f70dde979b52de022db749a2cc32
Does anyone know why this happens and how to fix it?
Run the node with "--host-addr 0.0.0.0". For example:
cardano-node run --config $HOME/cardano/preprod/config.json
--database-path $HOME/cardano/db
--socket-path $HOME/cardano/db/node.socket
--host-addr 0.0.0.0
--port 1337
--topology $HOME/cardano/preprod/topology.json

What does proto means, xdp/ebpf?

What does proto signifies over here, I was following this
https://github.com/xdp-project/xdp-tutorial/tree/master/tracing03-xdp-debug-print Can anyone explain what proto means in this context?
$ sudo ./trace_read
src: 5a:b3:63:62:de:d7 dst: 3a:b:b:8e:5e:6a proto: 56710
src: 5a:b3:63:62:de:d7 dst: 3a:b:b:8e:5e:6a proto: 56710
src: 5a:b3:63:62:de:d7 dst: 3a:b:b:8e:5e:6a proto: 56710
In this context, given it seems to be displaying L2 information, proto is the Ethertype. It indicates the protocol of the next header (L3).
56710 is 0xDD86 (in big endian) in hexadecimal, which corresponds to the Ethertype of IPv6.

Can logstash's Google Cloud Storage output plugin do persistent transmission after restart machine?

Using this config for logstash's output. It's using /tmp/logstash-gcs as a local folder. Send to GCS when file become 1024 kbytes.
input {
beats {
port => 5044
}
}
filter {}
output {
google_cloud_storage {
bucket => "gcs-bucket-name"
json_key_file => "/secrets/service_account/credentials.json"
temp_directory => "/tmp/logstash-gcs"
log_file_prefix => "logstash_gcs"
max_file_size_kbytes => 1024
output_format => "json"
date_pattern => "%Y-%m-%dT%H:00"
flush_interval_secs => 2
gzip => false
gzip_content_encoding => false
uploader_interval_secs => 60
include_uuid => true
include_hostname => true
}
}
After restart machine, can it continuous do the job schedule without any data loss?
Does it has a queue feature to manage as pub/sub?
About solution, there are 2 ways.
Use filebeat to beat those tmp files again.
Set grace period seconds to insure logstash has enough time to send last task when machine down.

Unicode in Erlang logs with logger

I’m trying to output some Unicode into log with:
logger:debug("~ts", [<<"Тест"/utf8>>]).
and getting the following in log:
DEFAULT FORMATTER CRASHEDDEFAULT FORMATTER CRASHEDDEFAULT FORMATTER....
However, if I use ~s as a format string instead, it doesn’t crash, but outputs non-unicode version:
debug: ТеÑ<U+0081>Ñ<U+0082>
Any ideas? Can’t seem to find what am I doing wrong.
Environment
Erlang/OTP 21 [erts-10.0.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Logger config from sys.config:
{kernel, [
{logger, [
{handler, default, logger_std_h,
#{level => debug,
formatter => {logger_formatter, #{single_line => true}},
config => #{type => {file, "log/main.log"}}}},
{handler, errors, logger_std_h,
#{level => error,
formatter => {logger_formatter, #{single_line => false}},
config => #{type => {file, "log/errors.log"}}}}
]},
{logger_level, debug}
]}
I spent whole night tracing with someone on Erlang Slack channel and we found that it is single line formatter specifically that had a bug crashing the whole thing. It's now fixed in 21.1. After upgrading the issue's gone.

perl how to grab spesific string in paragraph style

I'm new on perl and still learning by doing some case. I've some case on parsing a log with perl.
There is a data log :
Physical interface: ge-1/0/2, Unit: 101, Vlan-id: 101, Address: 10.187.132.3/27
Index: 353, SNMP ifIndex: 577, VRRP-Traps: enabled
Interface state: up, Group: 1, State: backup, VRRP Mode: Active
Priority: 190, Advertisement interval: 1, Authentication type: none
Advertisement threshold: 3, Delay threshold: 100, Computed send rate: 0
Preempt: yes, Accept-data mode: yes, VIP count: 1, VIP: 10.187.132.1
Dead timer: 2.715s, Master priority: 200, Master router: 10.187.132.2
Virtual router uptime: 5w5d 12:54
Tracking: disabled
Physical interface: ge-1/0/2, Unit: 102, Vlan-id: 102, Address: 10.187.132.35/27
Index: 354, SNMP ifIndex: 580, VRRP-Traps: enabled
Interface state: up, Group: 2, State: master, VRRP Mode: Active
Priority: 200, Advertisement interval: 1, Authentication type: none
Advertisement threshold: 3, Delay threshold: 100, Computed send rate: 0
Preempt: yes, Accept-data mode: yes, VIP count: 1, VIP: 10.187.132.33
Advertisement Timer: 0.816s, Master router: 10.187.132.35
Virtual router uptime: 5w5d 12:54, Master router uptime: 5w5d 12:54
Virtual Mac: 00:00:5e:00:01:02
Tracking: disabled
Physical interface: ge-1/0/2, Unit: 103, Vlan-id: 103, Address: 10.187.132.67/27
Index: 355, SNMP ifIndex: 581, VRRP-Traps: enabled
Interface state: up, Group: 3, State: backup, VRRP Mode: Active
Priority: 190, Advertisement interval: 1, Authentication type: none
Advertisement threshold: 3, Delay threshold: 100, Computed send rate: 0
Preempt: yes, Accept-data mode: yes, VIP count: 1, VIP: 10.187.132.65
Dead timer: 2.624s, Master priority: 200, Master router: 10.187.132.66
Virtual router uptime: 5w5d 12:54
Tracking: disabled
I curious how we can retrieve some value and store it to array. I've tried grep it but I'm confuse how to take a spesific value.
Expected Value on Array of Hashes:
$VAR1 = {
'interface' => 'ge-1/0/2.101',
'address' => '10.187.132.3/27',
'State' => 'backup'
'Master-router' => '10.187.132.2'
};
$VAR2 = {
'interface' => 'ge-1/0/2.102',
'address' => '10.187.132.35/27',
'State' => 'master'
'Master-router' => '10.187.132.35'
};
$VAR3 = {
'interface' => 'ge-1/0/2.103',
'address' => '10.187.132.67/27',
'State' => 'backup'
'Master-router' => '10.187.132.66'
};
You could use regex to split each paragraph up. Something like this might work:
/((\w|\s|-)+):\s([^,]+)/m
The matching groups would then look something like:
Match 1
1. Physical interface
2. e
3. ge-1/0/2
Match 2
1. Unit
2. t
3. 101
Match 3
1. Vlan-id
2. d
3. 101
As you can see 1. corresponds to a key whereas 3. is the corresponding value. You can store the set of pairs any way you like.
For this to work each attribute in the log would need to be comma-seperated, which the example you have listed isn't. Assuming the example you have listed is correct, you would have to adjust the regex a little to make it work. You can test it online at rubular until it works. If it is comma seperated you might just want to split each paragraph by "," and then split each result on ":".
EDIT:
It seems to me like each line is comma seperated so the methods mentioned above might work perfectly well if you use them on a single line at a time.
To parse the data:
Obtain a section from the file by reading lines into a section while the lines start with whitespace.
Split the sections at the item separators which are either commas or linebreaks
Split each item at the first colon into a key and value
Case-fold the key and store the pair into a hash
A sketch of an implementation:
my #hashes;
while (<>) {
push #hashes, {} if /\A\S/;
for my $item (split /,/) {
my ($k, $v) = split /:/, $item, 2;
$hashes[-1]{fc $k} = $v;
}
}
Then you can extract those pieces of information from the hash which you are interested in.
Since each record is a paragraph, you can have Perl read the file in those chunks by local $/ = ''; (paragraph mode). Then, use a regex to capture each value that you want within that paragraph, pair that value with a hash key, and then push a reference to that hash onto an array to form an array of hashes (AoH):
use strict;
use warnings;
use Data::Dumper;
my #arr;
local $/ = '';
while (<DATA>) {
my %hash;
( $hash{'interface'} ) = /interface:\s+([^,]+)/;
( $hash{'address'} ) = /Address:\s+(\S+)/;
( $hash{'State'} ) = /State:\s+([^,]+)/;
( $hash{'Master-router'} ) = /Master router:\s+(\S+)/;
push #arr, \%hash;
}
print Dumper \#arr;
__DATA__
Physical interface: ge-1/0/2, Unit: 101, Vlan-id: 101, Address: 10.187.132.3/27
Index: 353, SNMP ifIndex: 577, VRRP-Traps: enabled
Interface state: up, Group: 1, State: backup, VRRP Mode: Active
Priority: 190, Advertisement interval: 1, Authentication type: none
Advertisement threshold: 3, Delay threshold: 100, Computed send rate: 0
Preempt: yes, Accept-data mode: yes, VIP count: 1, VIP: 10.187.132.1
Dead timer: 2.715s, Master priority: 200, Master router: 10.187.132.2
Virtual router uptime: 5w5d 12:54
Tracking: disabled
Physical interface: ge-1/0/2, Unit: 102, Vlan-id: 102, Address: 10.187.132.35/27
Index: 354, SNMP ifIndex: 580, VRRP-Traps: enabled
Interface state: up, Group: 2, State: master, VRRP Mode: Active
Priority: 200, Advertisement interval: 1, Authentication type: none
Advertisement threshold: 3, Delay threshold: 100, Computed send rate: 0
Preempt: yes, Accept-data mode: yes, VIP count: 1, VIP: 10.187.132.33
Advertisement Timer: 0.816s, Master router: 10.187.132.35
Virtual router uptime: 5w5d 12:54, Master router uptime: 5w5d 12:54
Virtual Mac: 00:00:5e:00:01:02
Tracking: disabled
Physical interface: ge-1/0/2, Unit: 103, Vlan-id: 103, Address: 10.187.132.67/27
Index: 355, SNMP ifIndex: 581, VRRP-Traps: enabled
Interface state: up, Group: 3, State: backup, VRRP Mode: Active
Priority: 190, Advertisement interval: 1, Authentication type: none
Advertisement threshold: 3, Delay threshold: 100, Computed send rate: 0
Preempt: yes, Accept-data mode: yes, VIP count: 1, VIP: 10.187.132.65
Dead timer: 2.624s, Master priority: 200, Master router: 10.187.132.66
Virtual router uptime: 5w5d 12:54
Tracking: disabled
Output:
$VAR1 = [
{
'Master-router' => '10.187.132.2',
'interface' => 'ge-1/0/2',
'address' => '10.187.132.3/27',
'State' => 'backup'
},
{
'Master-router' => '10.187.132.35',
'interface' => 'ge-1/0/2',
'address' => '10.187.132.35/27',
'State' => 'master'
},
{
'Master-router' => '10.187.132.66',
'interface' => 'ge-1/0/2',
'address' => '10.187.132.67/27',
'State' => 'backup'
}
];
Hope this helps!