Added audio track functionality to mpv player

This commit is contained in:
Nikolaj Olsson 2016-02-29 15:41:09 +01:00
parent 465a80815f
commit 9485fd9350
7 changed files with 129 additions and 7 deletions

View File

@ -1749,6 +1749,7 @@ can edit in same subtitle file (collaboration)</Information>
<Title>Settings for mpv</Title>
<DownloadMpv>Download mpv dll</DownloadMpv>
<DownloadMpvFailed>Unable to download mpv - please re-try later!</DownloadMpvFailed>
<DownloadMpvOk>The mpv dll file was downloaded and is ready for use.</DownloadMpvOk>
</SettingsMpv>
<SetVideoOffset>
<Title>Set video offset</Title>

View File

@ -4696,6 +4696,9 @@ namespace Nikse.SubtitleEdit.Core
case "SettingsMpv/DownloadMpvFailed":
language.SettingsMpv.DownloadMpvFailed = reader.Value;
break;
case "SettingsMpv/DownloadMpvOk":
language.SettingsMpv.DownloadMpvOk = reader.Value;
break;
case "SetVideoOffset/Title":
language.SetVideoOffset.Title = reader.Value;
break;

View File

@ -290,5 +290,53 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
return list;
}
public static List<string> ReadObjectArray(string text)
{
var list = new List<string>();
text = text.Trim();
if (text.StartsWith('[') && text.EndsWith(']'))
{
text = text.Trim('[', ']').Trim();
int onCount = 0;
bool keepNext = false;
var sb = new StringBuilder();
foreach (var c in text)
{
if (keepNext)
{
sb.Append(c);
keepNext = false;
}
else if (c == '\\')
{
sb.Append(c);
keepNext = true;
}
else if (c == '{')
{
sb.Append(c);
onCount++;
}
else if (c == '}')
{
sb.Append(c);
onCount--;
}
else if (c == ',' && onCount == 0)
{
list.Add(sb.ToString().Trim());
sb.Clear();
}
else
{
sb.Append(c);
}
}
if (sb.Length > 0)
list.Add(sb.ToString().Trim());
}
return list;
}
}
}

View File

@ -16618,6 +16618,7 @@ namespace Nikse.SubtitleEdit.Forms
toolStripMenuItemSetAudioTrack.Visible = false;
var libVlc = mediaPlayer.VideoPlayer as LibVlcDynamic;
var libMpv = mediaPlayer.VideoPlayer as LibMpvDynamic;
if (libVlc != null)
{
int numberOfTracks = libVlc.AudioTrackCount;
@ -16634,6 +16635,22 @@ namespace Nikse.SubtitleEdit.Forms
toolStripMenuItemSetAudioTrack.Visible = true;
}
}
else if (libMpv != null)
{
int numberOfTracks = libMpv.AudioTrackCount;
_videoAudioTrackNumber = libMpv.AudioTrackNumber;
if (numberOfTracks > 1)
{
toolStripMenuItemSetAudioTrack.DropDownItems.Clear();
for (int i = 0; i < numberOfTracks; i++)
{
toolStripMenuItemSetAudioTrack.DropDownItems.Add((i + 1).ToString(CultureInfo.InvariantCulture), null, ChooseAudioTrack);
if (i == _videoAudioTrackNumber)
toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Select();
}
toolStripMenuItemSetAudioTrack.Visible = true;
}
}
if (mediaPlayer.VideoPlayer != null && audioVisualizer != null && audioVisualizer.WavePeaks != null && audioVisualizer.WavePeaks.Peaks.Count > 0)
{
@ -16650,15 +16667,23 @@ namespace Nikse.SubtitleEdit.Forms
private void ChooseAudioTrack(object sender, EventArgs e)
{
var libVlc = mediaPlayer.VideoPlayer as LibVlcDynamic;
var libMpv = mediaPlayer.VideoPlayer as LibMpvDynamic;
if (libVlc != null)
{
var item = sender as ToolStripItem;
int number = int.Parse(item.Text);
number--;
libVlc.AudioTrackNumber = number;
_videoAudioTrackNumber = number;
}
else if (libMpv != null)
{
var item = sender as ToolStripItem;
int number = int.Parse(item.Text);
number--;
libMpv.AudioTrackNumber = number;
_videoAudioTrackNumber = number;
}
}
private void textBoxListViewTextAlternate_TextChanged(object sender, EventArgs e)

View File

@ -163,6 +163,11 @@ namespace Nikse.SubtitleEdit.Forms
var libVlc = (LibVlcDynamic)videoPlayerContainer1.VideoPlayer;
libVlc.AudioTrackNumber = _audioTrackNumber;
}
else if (_audioTrackNumber >= 0 && videoPlayerContainer1.VideoPlayer is LibMpvDynamic)
{
var libMpv = (LibMpvDynamic)videoPlayerContainer1.VideoPlayer;
libMpv.AudioTrackNumber = _audioTrackNumber;
}
}
private void timer1_Tick(object sender, EventArgs e)

View File

@ -191,6 +191,11 @@ namespace Nikse.SubtitleEdit.Forms
var libVlc = (LibVlcDynamic)MediaPlayerStart.VideoPlayer;
libVlc.AudioTrackNumber = AudioTrackNumber;
}
else if (AudioTrackNumber >= 0 && MediaPlayerStart.VideoPlayer is LibMpvDynamic)
{
var libMpv = (LibMpvDynamic)MediaPlayerStart.VideoPlayer;
libMpv.AudioTrackNumber = AudioTrackNumber;
}
}
private void VideoEndEnded(object sender, EventArgs e)
@ -212,6 +217,11 @@ namespace Nikse.SubtitleEdit.Forms
var libVlc = (LibVlcDynamic)MediaPlayerEnd.VideoPlayer;
libVlc.AudioTrackNumber = AudioTrackNumber;
}
else if (AudioTrackNumber >= 0 && MediaPlayerEnd.VideoPlayer is LibMpvDynamic)
{
var libMpv = (LibMpvDynamic)MediaPlayerEnd.VideoPlayer;
libMpv.AudioTrackNumber = AudioTrackNumber;
}
}
private VideoInfo ShowVideoInfo(string fileName)

View File

@ -1,10 +1,12 @@
using Nikse.SubtitleEdit.Core;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Nikse.SubtitleEdit.Core.SubtitleFormats;
namespace Nikse.SubtitleEdit.Logic.VideoPlayers
{
@ -237,26 +239,54 @@ namespace Nikse.SubtitleEdit.Logic.VideoPlayers
get { return !IsPaused; }
}
private List<string> _audioTrackIds;
public int AudioTrackCount
{
get
{
return 1; //TODO: Fix
if (_audioTrackIds == null)
{
_audioTrackIds = new List<string>();
int mpvFormatString = 1;
IntPtr lpBuffer = Marshal.AllocHGlobal(1024);
_mpvGetPropertyString(_mpvHandle, Encoding.UTF8.GetBytes("track-list\0"), mpvFormatString, ref lpBuffer);
string trackListJson = Marshal.PtrToStringAnsi(lpBuffer);
foreach (var json in Json.ReadObjectArray(trackListJson))
{
string trackType = Json.ReadTag(json, "type");
string id = Json.ReadTag(json, "id");
if (trackType == "audio")
{
_audioTrackIds.Add(id);
}
}
}
return _audioTrackIds.Count;
}
}
private int _audioTrackNumber = 0;
public int AudioTrackNumber
{
get
{
return _audioTrackNumber;
int mpvFormatString = 1;
IntPtr lpBuffer = Marshal.AllocHGlobal(10);
_mpvGetPropertyString(_mpvHandle, Encoding.UTF8.GetBytes("aid\0"), mpvFormatString, ref lpBuffer);
string str = Marshal.PtrToStringAnsi(lpBuffer);
if (AudioTrackCount > 1 && _audioTrackIds.Contains(str))
{
return _audioTrackIds.IndexOf(str);
}
return 0;
}
set
{
//TODO: Fix
//_mpvCommand(_mpvHandle, new[] { "set", "aid", value.ToString(CultureInfo.InvariantCulture), null });
//_audioTrackNumber = value;
string id = "1";
if (AudioTrackCount > 1 && value >= 0 && value < _audioTrackIds.Count)
{
id = _audioTrackIds[value];
}
_mpvCommand(_mpvHandle, new[] { "set", "aid", id.ToString(CultureInfo.InvariantCulture), null });
}
}