[mythtvnz] Cutting H.264 DVB-T files with ffmpeg without transcoding
David Moore
dmoo1790 at ihug.co.nz
Mon Jul 19 05:46:02 BST 2010
Craig Blaikie wrote:
> Jonathan Hoskin wrote:
>> Anybody worked out a reliable way to cut recordings from Freeview
>> terrestrial using ffmpeg?
>>
>>
>> Nope. I wonder if the developers have properly addressed it / been made
>> aware of it.
>>
>>
>>
>> I've seen a lot of posts from (I think) ffmpeg devs on various lists
>> which seem to say "too bad, it's the recording that's bad, not a bug in
>> ffmpeg".
>>
>> ffmpeg -async 1 -ss [start time] -t [duration] -i recording.mpg
> -vcodec
>> copy -acodec ac3 -ab 384k -f dvd cut_recording.mpg
>>
>> The "-async 1" seems to be needed to keep audio in sync with video.
> The
>> "-f dvd" might (not sure yet) be a fix for av mux errors. Audio is
>> transcoded to AC3 since most channels only have LATM AAC audio.
>>
>>
>> "-f dvd" uses a MPEG2-PS container - H.264 isn't supported in the
>> MPEG-PS file format:
>> http://www.gossamer-threads.com/lists/mythtv/mythtvnz/417130#417130
>
>
> David Moore wrote
>> Thanks for that. I have tried MPEG-TS format as well but also with no
>> joy. Latest semi-successful attempts have involved extracting the video
>> to raw H264 format and transcoding the audio to raw AC3 then remuxing to
>> mpg (without the -f dvd option). Unfortunately I get audio/video sync
>> problems now. I don't see how I can easily resolve this because (I
>> assume) the raw formats have no timestamps or have timestamps which are
>> slightly out of sync.
>>
>> Seems that timestamps may be the root of the problem because I was
>> previously getting the ffmpeg "non-monotone timestamp" error and weird
>> start times reported by ffmpeg. I have no idea how to fix this without a
>> lot of manual audio/video syncing. I wonder how myth copes with the same
>> recordings when ffmpeg has problems? Might have to dig into the myth and
>> ffmpeg source code to try and find the differences.
>
> You could try using vlc, as I found it was able to play the recorded video
> files with sound, use it to convert the audio to mp4a and then use ffmpeg to
> do the cutting or compression, I know it's an extra step, and you end
> needing free space to have an almost identical copy of the file there, but
> it seems to work, and the audio appears to stay in sync. I couldn't get VLC
> to cut and convert the video without totally messing it up, hence the extra
> ffmpeg step.
>
> Use command line version of VLC to copy video and transcode audio.
>
> nice -n 15 cvlc input_filename.mpg --sout="#transcode{acodec=mp4a, ab=192,
> channels=2, samplerate=48000}:standard{mux=ts, dst=temp_filename.mp4,
> access=file}:sout-transcode-soverlay=0" vlc://quit
>
> then use ffmpeg to cut, or in this example, convert to iPod.
>
> nice -n 15 ffmpeg -i temp_filename.mp4 -vcodec libxvid -b 512kb -qmin 3
> -qmax 5 -bufsize 4096 -g 300 -acodec libfaac -ab 192kb -s 736x416 -aspect
> 16:9 output_filename.mp4
>
> Cheers,
> Craig
>
Thanks Craig. Your advice about using VLC helped a lot. I still took a
while to fully solve my problems though. What I wanted to do was snip
about 15 mins off the end of one recording and then join it to another
recording. Here is what I did:
Step 1: Transcode the whole of the first file with VLC:
cvlc 2 file1.mpg :sout="#transcode{acodec=a52, ab=384, channels=2,
samplerate=48000}:standard{mux=ps, dst=file1a.mpg,
access=file}:sout-transcode-soverlay=0" vlc://quit
Step 2: Snip the end off the transcoded file with ffmpeg:
ffmpeg -async 1 -ss 01:55:17 -i file1a.mpg -vcodec copy -acodec copy
file1b.mpg
Step 3: Transcode the second file with VLC:
cvlc file2.mpg --sout="#transcode{acodec=a52, ab=384, channels=2,
samplerate=48000}:standard{mux=ps, dst=file2a.mpg,
access=file}:sout-transcode-soverlay=0" vlc://quit
Step 4: Fix the timestamps in file2a so that they start just after the
end of file1b. (Before I did this ffmpeg reported a start time of around
8800 seconds for file2a!? I've seen this sort of thing on lots of my
recordings.)
ffmpeg -itsoffset 881.58 -i file2a.mpg -vcodec copy -acodec copy file2b.mpg
Step 5: Cat the two files into the final product:
cat file1b.mpg file2b.mpg > final_file.mpg
This may not be the most efficient way to get what I wanted but the end
result looks good with only a minor glitch at the join, good audio/video
sync and is seekable.
I found the vlc "mux=ps" option to be a lot faster than "mux=ts".
The ffmpeg "itsoffset" option didn't work as I expected. It seems to
need an absolute time, not an offset time. The value I entered ended up
as the value for the start time of the second file. This value was the
length of the first file so "catting" the files together ended up with
good timestamps in the final file, if you follow what I'm trying to say.
I'm still pretty sure that most of my problems are due to bad
timestamps. Need to do more tests to find a final solution.
More information about the mythtvnz
mailing list