#7 ogg conversion does not work, removed in order to move conversion code to client

This commit is contained in:
Hamid Reza Mohammadi 2020-09-14 21:01:33 +04:30
parent 627eb832bc
commit 938ff00ec8
4 changed files with 7 additions and 167 deletions

View File

@ -20,7 +20,6 @@
</PackageReference>
<PackageReference Include="MySql.Data" Version="8.0.21" />
<PackageReference Include="NAudio" Version="1.10.0" />
<PackageReference Include="OggVorbisEncoder" Version="1.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.2.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.2.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="5.0.2" />

View File

@ -4307,11 +4307,6 @@
equaivalnet for persian characters
</summary>
</member>
<member name="T:RMuseum.Services.Implementation.OggVorbisConvertor">
<summary>
ogg vorbis convertor
</summary>
</member>
<member name="T:RMuseum.Services.Implementation.PictureFileService">
<summary>
manipulating picture files

View File

@ -1,11 +1,8 @@
using Audit.WebApi;
using ganjoor;
using ganjoor;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using MySql.Data.MySqlClient;
using NAudio.Wave;
using OggVorbisEncoder;
using RMuseum.DbContext;
using RMuseum.Migrations;
using RMuseum.Models.GanjoorAudio;
@ -195,9 +192,9 @@ namespace RMuseum.Services.Implementation
};
string ext = Path.GetExtension(file.FileName).ToLower();
if(ext != ".mp3" && ext != ".xml" && ext != ".zip")
if(ext != ".mp3" && ext != ".xml" && ext != ".ogg")
{
file.ProcessResultMsg = "تنها فایلهای با پسوند mp3، xml و zip قابل قبول هستند.";
file.ProcessResultMsg = "تنها فایلهای با پسوند mp3، xml و ogg قابل قبول هستند.";
}
else
{
@ -331,6 +328,7 @@ namespace RMuseum.Services.Implementation
string localMp3FilePath = Path.Combine(targetPathForAudioFiles, $"{fileNameWithoutExtension}.mp3");
string localOggFilePath = Path.Combine(targetPathForAudioFiles, $"{fileNameWithoutExtension}.ogg");
UploadSessionFile mp3file = mp3files.Where(mp3 => mp3.MP3FileCheckSum == audio.FileCheckSum).SingleOrDefault();
if(mp3file == null)
@ -341,22 +339,11 @@ namespace RMuseum.Services.Implementation
else
{
File.Move(mp3file.FilePath, localMp3FilePath);
File.Move(Path.Combine(Path.GetDirectoryName(mp3file.FilePath), $"{Path.GetFileNameWithoutExtension(mp3file.FilePath)}.ogg"), localOggFilePath);
int mp3fileSize = File.ReadAllBytes(localMp3FilePath).Length;
int oggfileSize = File.ReadAllBytes(localOggFilePath).Length;
//here we should produce and save ogg file
byte[] mp3bytes = File.ReadAllBytes(Path.Combine(targetPathForAudioFiles, $"{fileNameWithoutExtension}.mp3"));
int mp3fileSize = mp3bytes.Length;
int oggfileSize;
using (MemoryStream ms = new MemoryStream(mp3bytes))
using (Mp3FileReader mp3FileReader = new Mp3FileReader(ms))
{
byte[] samples = new byte[mp3FileReader.Length];
await mp3FileReader.ReadAsync(samples, 0, (int)mp3FileReader.Length);
var oggBytes = OggVorbisConvertor.ConvertRawPCMFile(mp3FileReader.Mp3WaveFormat.SampleRate, mp3FileReader.Mp3WaveFormat.Channels, samples, PCMSample.EightBit, mp3FileReader.Mp3WaveFormat.SampleRate, mp3FileReader.Mp3WaveFormat.Channels);
oggfileSize = oggBytes.Length;
File.WriteAllBytes(Path.Combine(targetPathForAudioFiles, $"{fileNameWithoutExtension}.ogg"), oggBytes);
}
Guid legacyAudioGuid = audio.SyncGuid;
while(

View File

@ -1,141 +0,0 @@
using OggVorbisEncoder;
using System;
using System.IO;
namespace RMuseum.Services.Implementation
{
internal enum PCMSample : int
{
EightBit = 1,
SixteenBit = 2
}
/// <summary>
/// ogg vorbis convertor
/// </summary>
internal static class OggVorbisConvertor
{
public static byte[] ConvertRawPCMFile(int OutputSampleRate, int OutputChannels, byte[] PCMSamples, PCMSample PCMSampleSize, int PCMSampleRate, int PCMChannels)
{
int NumPCMSamples = (PCMSamples.Length / (int)PCMSampleSize / PCMChannels);
float PCMDuraton = NumPCMSamples / (float)PCMSampleRate;
int NumOutputSamples = (int)(PCMDuraton * OutputSampleRate);
//Ensure that samble buffer is aligned to write chunk size
NumOutputSamples = (NumOutputSamples / WriteBufferSize) * WriteBufferSize;
float[][] OutSamples = new float[OutputChannels][];
for (int ch = 0; ch < OutputChannels; ch++)
OutSamples[ch] = new float[NumOutputSamples];
for (int sampleNumber = 0; sampleNumber < NumOutputSamples; sampleNumber++)
{
float rawSample = 0.0f;
for (int ch = 0; ch < OutputChannels; ch++)
{
int sampleIndex = (sampleNumber * PCMChannels) * (int)PCMSampleSize;
if (ch < PCMChannels) sampleIndex += (ch * (int)PCMSampleSize);
switch (PCMSampleSize)
{
case PCMSample.EightBit:
rawSample = ByteToSample(PCMSamples[sampleIndex]);
break;
case PCMSample.SixteenBit:
rawSample = ShortToSample((short)(PCMSamples[sampleIndex + 1] << 8 | PCMSamples[sampleIndex]));
break;
}
OutSamples[ch][sampleNumber] = rawSample;
}
}
return GenerateFile(OutSamples, OutputSampleRate, OutputChannels);
}
private static float ByteToSample(short pcmValue)
{
return pcmValue / 128f;
}
private static float ShortToSample(short pcmValue)
{
return pcmValue / 32768f;
}
private static byte[] GenerateFile(float[][] FloatSamples, int SampleRate, int Channels)
{
using (MemoryStream outputData = new MemoryStream())
{
// Stores all the static vorbis bitstream settings
var info = VorbisInfo.InitVariableBitRate(Channels, SampleRate, 0.5f);
// set up our packet->stream encoder
var serial = new Random().Next();
var oggStream = new OggStream(serial);
// =========================================================
// HEADER
// =========================================================
// Vorbis streams begin with three headers; the initial header (with
// most of the codec setup parameters) which is mandated by the Ogg
// bitstream spec. The second header holds any comment fields. The
// third header holds the bitstream codebook.
var headerBuilder = new HeaderPacketBuilder();
var comments = new Comments();
comments.AddTag("ARTIST", "TEST");
var infoPacket = headerBuilder.BuildInfoPacket(info);
var commentsPacket = headerBuilder.BuildCommentsPacket(comments);
var booksPacket = headerBuilder.BuildBooksPacket(info);
oggStream.PacketIn(infoPacket);
oggStream.PacketIn(commentsPacket);
oggStream.PacketIn(booksPacket);
// Flush to force audio data onto its own page per the spec
FlushPages(oggStream, outputData, true);
// =========================================================
// BODY (Audio Data)
// =========================================================
var processingState = ProcessingState.Create(info);
processingState.WriteData(FloatSamples, FloatSamples[0].Length);
for (int readIndex = 0; readIndex <= FloatSamples[0].Length; readIndex += WriteBufferSize)
{
OggPacket packet;
while (!oggStream.Finished
&& processingState.PacketOut(out packet))
{
oggStream.PacketIn(packet);
FlushPages(oggStream, outputData, false);
}
}
FlushPages(oggStream, outputData, true);
return outputData.ToArray();
}
}
private static void FlushPages(OggStream oggStream, Stream Output, bool Force)
{
OggPage page;
while (oggStream.PageOut(out page, Force))
{
Output.Write(page.Header, 0, page.Header.Length);
Output.Write(page.Body, 0, page.Body.Length);
}
}
private static int WriteBufferSize = 512;
private static readonly int[] SampleRates = { 8000, 11025, 16000, 22050, 32000, 44100 };
}
}