Linux, wie man Ton im RAM-Puffer aufzeichnet und Audio mit eigener Verzögerung wiedergibt

8

Ich muss über ein eingebettetes Linux-System Audio von einem Radio an ein sekundäres System senden.

Das sekundäre System muss einen Kommunikationskanal einrichten, der einige Sekunden dauert.

Wenn ich also den Anfang des Tons nicht verlieren möchte, muss ich den Ton aufnehmen und mit einer benutzerdefinierten Verzögerung (maximal ein paar Sekunden) abspielen.

Es sollte möglich sein, arecord zu starten, um das Audio in einer Datei in einem tmpfs Dateisystem aufzuzeichnen, und wenn eine Kommunikation eingeht, starte aplay . Aber in diesem Fall ist der Anfang noch immer verloren, weil das zu sendende Signal zu spät kommt.

Gibt es unter Linux ein Programm, das kontinuierlich Ton in einem Ringpuffer im RAM aufzeichnet und bei Bedarf mit einer benutzerdefinierten Verzögerung wiedergeben kann?

Wenn nicht, was ist die beste Bibliothek, um ein solches Programm auf einem eingebetteten System zu programmieren? alsa oder etwas anderes?

    
leszek.hanusz 04.09.2015, 13:52
quelle

2 Antworten

6

Hier ist ein einfaches C-Programm, das einen zirkulären Puffer zwischen Pipe-In und -Out halten soll. Verwenden Sie wie in | buffer_program | out . Fehlerprüfung wurde weggelassen. Robustheit nicht garantiert. Gibt die allgemeine Idee.

Testskript (aber tatsächlich seit seinem zirkulären Puffer die Daten, die Ihre Verrohrung benötigt, um so kohärent zu sein, dass sie nur irgendeinen Chunk im Strom nimmt. Oder machen Sie einfach den Puffer größer als die Daten):

%Vor%

circular_buffer.c:

%Vor%     
spinkus 13.09.2015, 09:46
quelle
1

Wenn Sie nur einen Puffer benötigen, um die Soundausgabe so lange zu behalten, bis sie verbraucht werden kann, sollte eine Variante funktionieren:

Aufnahme starten:

%Vor%

Starten Sie die Wiedergabe, wenn Ihr Ausgabegerät bereit ist:

%Vor%

Passen Sie die Ausgabepuffergröße an Ihre Anforderungen an.

BEARBEITEN (vorausgesetzt, das Spielen kann jederzeit beginnen):

Wenn Sie fortlaufend aufnehmen und jederzeit abspielen möchten, können Sie die Ausgabe mithilfe des Befehls split in kleinere Dateien aufteilen und die alten Dateien in einem Hilfsprozess löschen .

Etwas wie:

%Vor%

Und zu spielen:

%Vor%

Diese Lösung ist ziemlich dreckig, aber könnte funktionieren (vorzugsweise auf tmpfs, wie Sie bereits erwähnt haben) ...

    
vlp 09.09.2015 20:59
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '379828',
    'url' => 'linux-how-to-record-sound-in-ram-buffer-and-playback-audio-with-custom-delay',
];

$_COOKIE = [
    'advanced-frontend' => '21751c8cbc5a03b0f19d24e651f9a510',
    '_csrf-frontend' => 'b6424edc34e3454421af7eec5cda1f95079120ce4bc069540304c8252b53bc56a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"LvtKihczVwP-zH93uiY4qsdJpcJdVLIl";}',
];

$_SESSION = [
    '__flash' => [],
];