[mythtv-users] H264 conversion of interlaced MPEG2?

Michael Stucky mike at stucky.us
Mon May 11 19:46:06 UTC 2015


On Mon, May 4, 2015 at 5:30 PM, Dave MythTV <dave.mythtv at gmail.com> wrote:

>
>
> On Sun, May 3, 2015 at 6:22 PM, Michael Stucky <mike at stucky.us> wrote:
>
>> On Sun, May 3, 2015 at 5:46 PM, Dave MythTV <dave.mythtv at gmail.com>
>> wrote:
>>
>>> Hello everyone.
>>>
>>> I'm running some tests, preparing to reconfigure my backend to transcode
>>> certain shows from US-broadcast ATSC MPEG2 to H264 for hardware accelerated
>>> playback on our various portable devices.  In doing this, I've been
>>> experimenting with Mike Stucky's user job script:
>>> https://www.mythtv.org/wiki/Transcode_Mpeg2_to_H264
>>>
>>>
>>> However, I've hit a snag...  If I run this script on an MPEG2 file with
>>> interlaced SD content, MythTV no longer recognizes the resulting H264 file
>>> as being interlaced, and playback in the MythTV frontend shows interlacing
>>> artifacts.
>>>
>>> I know I could modify Mike's script to specifically deinterlace the
>>> content before or during the H264 conversion... but I didn't think this
>>> would have been necessary?   Shouldn't it be possible to convert interlaced
>>> MPEG2 to interlaced H264, and continue using the frontend's deinterlacer?
>>>
>>>
>>> Additional information:
>>> 'mediainfo' detects the input MPEG2 file as being interlaced, but shows
>>> the output H264 file as being progressive scan.  So I think this might be
>>> an issue with the ffmpeg conversion flagging (or encoding) the
>>> non-deinterlaced output as progressive... and not an issue with MythTV's
>>> player?
>>>
>>>
>>> Thanks for the help.
>>> - Dave
>>>
>>>
>> I have recently discovered this same behavior and I think you are right
>> about it being an ffmpeg issue. It looks like ffmpeg automatically
>> deinterlaces SD content, so I have modified the "transcode" section to do a
>> better job of deinterlacing (this has the added benefit of allowing ffmpeg
>> to do a better job of compressing), this appears to be working for me, at
>> least for SD content:
>>
>>      task = System(path=transcoder, db=db)
>>      try:
>>             output = task('-i "%s"' % tmpfile,
>>                           '-filter:v yadif=1',
>>                           '-sws_flags spline',
>>                           '-r 60000/1001',
>>                           '-c:v libx264',
>>                           '-preset:v slow',
>>                           '-crf:v 18',
>>                           '-threads 0',
>>                           '-c:a copy',
>>                           '-metadata:s:a:0',
>>                           'language="eng"',
>>                           '"%s"' % outfile,
>>                           '2> /dev/null')
>>
>> If you find that this helps let me know and I will update the script on
>> the wiki.
>>
>> Mike
>>
>>
>
> Thanks Mike!  I'll do some experimenting with your changes this evening.
>
> A couple questions:
> * What made you select 'spline' as the scaler method?  (just curious)
> * Did you have a frame rate issue that required forcing the output frame
> rate explicitly?
>
> Also, I think there may be an issue with the yadif filter...
> The FFmpeg docs state that the third yadif parameter (deint) controls
> which frames to deinterlace.  The default is "all", but I've been reading
> that applying yadif on **progressive** source content will negatively
> impact the quality.
> (example: https://ffmpeg.org/pipermail/ffmpeg-user/2014-May/021412.html)
>
> So I think to make your script flexible for both interlaced and
> progressive source content, we would need to either call yadif as
> yadif=1:-1:1  (and hope that the frames are properly flagged?), or do some
> sort of other method (idet filter?) to detect the interlacing and convert
> as necessary?   There is a solution in the message linked above using idet,
> but the author (Nick) reports "mixed success"...  not sure what to make of
> that.
>
> (Other links for reference...)
> https://ffmpeg.org/ffmpeg-filters.html#yadif-1
> https://ffmpeg.org/ffmpeg-filters.html#idet
>
>
> Thanks again
> - Dave
>
>
Sorry for the delay, it was a busy weekend+... I am not an ffmpeg expert so
all the syntax came either from the original shell script or searches for a
better way to deinterlace. But I have done some additional searching and
testing have updated my script on the wiki accordingly.

"yadif=1" has become "yadif=0:-1:1" (mode 0 = one frame out for one frame
in, parity -1 = autodetect, and deint 1 = only deinterlace frames marked as
interlaced). "sws_flags spline" is removed (only applies when scaling
content?). "-r 60000/1001" is removed (this actually caused every frame to
be duplicated for interlaced content). "threads 0" is removed (the h264
encoder uses all available threads by default). "-c:a copy" replaced with
"-strict -2" to use the internal AAC encoder.

This works and produces good quality output for all my content, 1080i,
720p, and 480i all OTA to HDHomerun tuners.

Mike
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mythtv.org/pipermail/mythtv-users/attachments/20150511/aaa838e4/attachment.html>


More information about the mythtv-users mailing list