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:
Vasily 2019-10-03 18:50:39 +03:00
parent 6746f708f2
commit c1f9107b8b
3 changed files with 27 additions and 28 deletions

View File

@ -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;
} }

View File

@ -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);
} }

View File

@ -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