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;
|
||||
}
|
||||
|
||||
Logger.LogDebug("Launched ffmpeg process");
|
||||
state.TranscodingJob = transcodingJob;
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
}
|
||||
Logger.LogDebug("File '{0}' created or transcoding has finished", waitFor);
|
||||
|
||||
if (state.IsInputVideo && transcodingJob.Type == TranscodingJobType.Progressive && !transcodingJob.HasExited)
|
||||
{
|
||||
|
@ -314,6 +318,7 @@ namespace MediaBrowser.Api.Playback
|
|||
{
|
||||
StartThrottler(state, transcodingJob);
|
||||
}
|
||||
Logger.LogDebug("StartFfMpeg() finished successfully");
|
||||
|
||||
return transcodingJob;
|
||||
}
|
||||
|
|
|
@ -243,6 +243,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
|||
|
||||
request.StartTimeTicks = GetStartPositionTicks(state, requestedIndex);
|
||||
|
||||
state.WaitForPath = segmentPath;
|
||||
job = await StartFfMpeg(state, playlistPath, cancellationTokenSource).ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
|
@ -458,16 +459,15 @@ namespace MediaBrowser.Api.Playback.Hls
|
|||
TranscodingJob transcodingJob,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var segmentFileExists = File.Exists(segmentPath);
|
||||
|
||||
// If all transcoding has completed, just return immediately
|
||||
if (transcodingJob != null && transcodingJob.HasExited && segmentFileExists)
|
||||
var segmentExists = File.Exists(segmentPath);
|
||||
if (segmentExists)
|
||||
{
|
||||
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);
|
||||
|
||||
// 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)
|
||||
{
|
||||
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 it appears in the playlist, it's done
|
||||
if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
if (!segmentFileExists)
|
||||
{
|
||||
segmentFileExists = File.Exists(segmentPath);
|
||||
}
|
||||
if (segmentFileExists)
|
||||
if ((transcodingJob != null && transcodingJob.HasExited) || File.Exists(nextSegmentPath))
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ if [[ -n ${web_branch} ]]; then
|
|||
checkout -b origin/${web_branch}
|
||||
fi
|
||||
yarn install
|
||||
yarn build
|
||||
mkdir -p ${web_target}
|
||||
mv dist/* ${web_target}/
|
||||
popd
|
||||
|
|
Loading…
Reference in New Issue
Block a user