Add more logging
Trying to fix hls muxer plus ffmpeg 4.1+ combo Try to fix waiting for segment being ready This is needed because hls muxer in ffmpeg >= 4.1 creates the playlist only when it finishes transcoding. Also cleaned up logs a bit. Lower log level for "StartFfmpeg finished" to debug
This commit is contained in:
parent
6746f708f2
commit
c1f9107b8b
|
@ -289,16 +289,20 @@ namespace MediaBrowser.Api.Playback
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger.LogDebug("Launched ffmpeg process");
|
||||||
state.TranscodingJob = transcodingJob;
|
state.TranscodingJob = transcodingJob;
|
||||||
|
|
||||||
// Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback
|
// Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback
|
||||||
_ = new JobLogger(Logger).StartStreamingLog(state, process.StandardError.BaseStream, logStream);
|
_ = new JobLogger(Logger).StartStreamingLog(state, process.StandardError.BaseStream, logStream);
|
||||||
|
|
||||||
// Wait for the file to exist before proceeeding
|
// Wait for the file to exist before proceeeding
|
||||||
while (!File.Exists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
|
var waitFor = state.WaitForPath ?? outputPath;
|
||||||
|
Logger.LogDebug("Waiting for the creation of '{0}'", waitFor);
|
||||||
|
while (!File.Exists(waitFor) && !transcodingJob.HasExited)
|
||||||
{
|
{
|
||||||
await Task.Delay(100, cancellationTokenSource.Token).ConfigureAwait(false);
|
await Task.Delay(100, cancellationTokenSource.Token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
Logger.LogDebug("File '{0}' created or transcoding has finished", waitFor);
|
||||||
|
|
||||||
if (state.IsInputVideo && transcodingJob.Type == TranscodingJobType.Progressive && !transcodingJob.HasExited)
|
if (state.IsInputVideo && transcodingJob.Type == TranscodingJobType.Progressive && !transcodingJob.HasExited)
|
||||||
{
|
{
|
||||||
|
@ -314,6 +318,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
{
|
{
|
||||||
StartThrottler(state, transcodingJob);
|
StartThrottler(state, transcodingJob);
|
||||||
}
|
}
|
||||||
|
Logger.LogDebug("StartFfMpeg() finished successfully");
|
||||||
|
|
||||||
return transcodingJob;
|
return transcodingJob;
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,6 +243,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
|
|
||||||
request.StartTimeTicks = GetStartPositionTicks(state, requestedIndex);
|
request.StartTimeTicks = GetStartPositionTicks(state, requestedIndex);
|
||||||
|
|
||||||
|
state.WaitForPath = segmentPath;
|
||||||
job = await StartFfMpeg(state, playlistPath, cancellationTokenSource).ConfigureAwait(false);
|
job = await StartFfMpeg(state, playlistPath, cancellationTokenSource).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
|
@ -458,16 +459,15 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
TranscodingJob transcodingJob,
|
TranscodingJob transcodingJob,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var segmentFileExists = File.Exists(segmentPath);
|
var segmentExists = File.Exists(segmentPath);
|
||||||
|
if (segmentExists)
|
||||||
// If all transcoding has completed, just return immediately
|
|
||||||
if (transcodingJob != null && transcodingJob.HasExited && segmentFileExists)
|
|
||||||
{
|
{
|
||||||
return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
|
if (transcodingJob != null && transcodingJob.HasExited)
|
||||||
}
|
{
|
||||||
|
// Transcoding job is over, so assume all existing files are ready
|
||||||
|
return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (segmentFileExists)
|
|
||||||
{
|
|
||||||
var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath, segmentExtension);
|
var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath, segmentExtension);
|
||||||
|
|
||||||
// If requested segment is less than transcoding position, we can't transcode backwards, so assume it's ready
|
// If requested segment is less than transcoding position, we can't transcode backwards, so assume it's ready
|
||||||
|
@ -477,33 +477,26 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var segmentFilename = Path.GetFileName(segmentPath);
|
var nextSegmentPath = GetSegmentPath(state, playlistPath, segmentIndex + 1);
|
||||||
|
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
try
|
// To be considered ready, the segment file has to exist AND
|
||||||
|
// either the transcoding job should be done or next segment should also exit
|
||||||
|
if (segmentExists)
|
||||||
{
|
{
|
||||||
var text = File.ReadAllText(playlistPath, Encoding.UTF8);
|
if ((transcodingJob != null && transcodingJob.HasExited) || File.Exists(nextSegmentPath))
|
||||||
|
|
||||||
// If it appears in the playlist, it's done
|
|
||||||
if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
|
|
||||||
{
|
{
|
||||||
if (!segmentFileExists)
|
return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
|
||||||
{
|
|
||||||
segmentFileExists = File.Exists(segmentPath);
|
|
||||||
}
|
|
||||||
if (segmentFileExists)
|
|
||||||
{
|
|
||||||
return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
//break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (IOException)
|
else
|
||||||
{
|
{
|
||||||
// May get an error if the file is locked
|
segmentExists = File.Exists(segmentPath);
|
||||||
|
if (segmentExists)
|
||||||
|
{
|
||||||
|
continue; // avoid unnecessary waiting if segment just became available
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.Delay(100, cancellationToken).ConfigureAwait(false);
|
await Task.Delay(100, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ if [[ -n ${web_branch} ]]; then
|
||||||
checkout -b origin/${web_branch}
|
checkout -b origin/${web_branch}
|
||||||
fi
|
fi
|
||||||
yarn install
|
yarn install
|
||||||
|
yarn build
|
||||||
mkdir -p ${web_target}
|
mkdir -p ${web_target}
|
||||||
mv dist/* ${web_target}/
|
mv dist/* ${web_target}/
|
||||||
popd
|
popd
|
||||||
|
|
Loading…
Reference in New Issue
Block a user