わかりましたので、元の投稿を作成したとき、ffmpeg API についてほとんどまたはまったく知らないことは明らかです... デジタルメディアと変換の詳細について学び始めると、非常に圧倒されます。かなり読んでffmpegソースを調べた後、mp4からmpegtsへの作業出力を得ることができました。概念は、次の実行に似ています。
ffmpeg -i in.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out.ts
しかし、前に述べたように、C の ffmpeg API で実装する必要があります。
そのため、再生可能な .ts ファイルを生成することはできますが、そのビデオ ストリームとオーディオ ストリームは同期されません。つまり、Android タブレットでそれらを再生すると、オーディオが通常の速度で再生されている間にビデオが非常にゆっくりと再生され、その後 (オーディオ ストリームが終了すると) ビデオが通常の速度で最後まで再生されます。生成された同じ .ts ファイルを VLC で再生すると、非常に凝縮されたオーディオ (早送りされたように) が生成され、ビデオが正常に再生されます。
私が慣れていないメディア変換の側面はまだたくさんあります。それらのいくつかは、変換の成功を妨げていると確信しています。
ファイルに関する (ffprobe による) 情報は次のとおりです。 - in.mp4 - Android の記録によって生成されたファイル - MPEG4 (H.264 + AAC) - ffmpeg.ts - ffmpeg 変換によって生成されたファイル - MPEG2TS (H.264 + AAC) - out.ts - 私のコードで生成されたファイル - MPEGTS (H.264 + AAC)
in.mp4
filename=in.mp4
nb_streams=2
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime/MPEG-4/Motion JPEG 2000 format
start_time=0:00:00.000000
duration=0:00:09.961383
size=4.730 Mibyte
bit_rate=3.983 Mbit/s
TAG:major_brand=isom
TAG:minor_version=0
TAG:compatible_brands=isom3gp4
TAG:creation_time=2013-05-28 17:06:57
ffmpeg.ts
filename=ffmpeg.ts
nb_streams=2
format_name=mpegts
format_long_name=MPEG-2 transport stream format
start_time=0:00:01.400000
duration=0:00:09.741267
size=5.132 Mibyte
bit_rate=4.419 Mbit/s
out.ts
filename=out.ts
nb_streams=2
format_name=mpegts
format_long_name=MPEG-2 transport stream format
start_time=0:00:00.000000
duration=0:00:09.741267
size=5.166 Mibyte
bit_rate=4.449 Mbit/s
まず、出力ファイルの start_time に影響を与えることができませんでした。次に、プローブの -show_packets 出力を調べると、次のことがわかりました。
ffmpeg.ts
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=20.506 Kibyte
pos=564
flags=K
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=11.727 Kibyte
pos=22936
flags=_
[/PACKET]
...
[PACKET]
codec_type=audio
stream_index=1
pts=126000
pts_time=0:00:01.400000
dts=126000
dts_time=0:00:01.400000
duration=2089
duration_time=0:00:00.023211
size=285.000 byte
pos=109416
flags=K
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=128089
pts_time=0:00:01.423211
dts=128089
dts_time=0:00:01.423211
duration=2089
duration_time=0:00:00.023211
size=374.000 byte
pos=-1
flags=K
[/PACKET]
...
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=20.000 Kibyte
pos=87232
flags=_
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=16.852 Kibyte
pos=112800
flags=_
[/PACKET]
out.ts
[PACKET]
codec_type=audio
stream_index=1
pts=0
pts_time=0:00:00.000000
dts=0
dts_time=0:00:00.000000
duration=2089
duration_time=0:00:00.023211
size=285.000 byte
pos=22936
flags=K
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=1024
pts_time=0:00:00.011378
dts=1024
dts_time=0:00:00.011378
duration=2089
duration_time=0:00:00.023211
size=374.000 byte
pos=23312
flags=K
[/PACKET]
...
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=11.727 Kibyte
pos=25004
flags=_
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=7168
pts_time=0:00:00.079644
dts=7168
dts_time=0:00:00.079644
duration=2089
duration_time=0:00:00.023211
size=299.000 byte
pos=55460
flags=K
[/PACKET]
ご覧のとおり、ffmpeg.ts は、pts/dts を持たないビデオ パケットから始まります。後続のオーディオ パケットには、pts/dts が含まれます。これが最後まで繰り返されます。ffprobe の出力によると、すべてのビデオ パケットに pts/dts が含まれているわけではありません。
ただし、out.ts はオーディオ パケットで始まり、ビデオ パケットと交互になります。ここで、ビデオ パケットにも pts/dts はありません。違いは、ここでは一連のオーディオ パケットの間に 1 つのビデオ パケットがあることです。残りのビデオ パケットに何が起こったのか (ffmpeg.ts には ~5 オーディオと ~5 ビデオが続きます)。
明らかに、私はまだ学んでいて、まだあまり多くのことを知りません.誰かにとって明白な問題として飛び出すものはありますか? どんな情報や提案でも大歓迎ですが、これからも頑張っていきます!!