Android的MediaMuxer没能阻止

Android的MediaMuxer没能阻止

本文介绍了Android的MediaMuxer没能阻止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用媒体codeC,MediaExtractor和MediaMuxer生成MP4文件。一切似乎都正常工作,但是当我打电话MediaMuxer.stop我遇到一个错误。创建的MP4文件,但我不能用播放器播放。

I am trying to use MediaCodec,MediaExtractor and MediaMuxer to generate mp4 file. EveryThing seems to work properly but when i call MediaMuxer.stop i'm having an error . The MP4 file is created but i can't play it with a Player.

下面是我的logcat的:

Here is my logcat:

02-13 10:41:22.420: D/OpenGLRenderer(11768): Enabling debug mode 0
02-13 10:41:22.600: I/OMXClient(11768): Using client-side OMX mux.
02-13 10:41:22.717: E/ACodec(11768): [OMX.TI.DUCATI1.VIDEO.DECODER] storeMetaDataInBuffers failed w/ err -2147483648
02-13 10:41:22.717: I/ACodec(11768): DRC Mode: Port Reconfig Mode
02-13 10:41:22.725: I/MPEG4Writer(11768): limits: 2147483647/0 bytes/us, bit rate: -1 bps and the estimated moov size 3072 bytes
02-13 10:41:22.803: I/MPEG4Writer(11768): setStartTimestampUs: 0
02-13 10:41:22.803: I/MPEG4Writer(11768): Earliest track starting time: 0
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768): Warning message AMessage(what = 'omx ', target = 1) = {
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768):   int32_t type = 0
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768):   void *node = 0x4d
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768):   int32_t event = 3
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768):   int32_t data1 = 1
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768):   int32_t data2 = 117440527
02-13 10:41:22.896: W/AHierarchicalStateMachine(11768): } unhandled in root state.
02-13 10:41:22.912: I/MPEG4Writer(11768): setStartTimestampUs: 0
02-13 10:41:22.912: D/DecodeActivity(11768): INFO_OUTPUT_BUFFERS_CHANGED
02-13 10:41:22.935: D/DecodeActivity(11768): New format {height=832, what=1869968451, color-format=256, slice-height=832, crop-left=32, width=1408, crop-bottom=743, crop-top=24, mime=video/raw, stride=4096, crop-right=1311}
02-13 10:41:22.959: W/MPEG4Writer(11768): 0-duration samples found: 1
02-13 10:41:22.975: W/MPEG4Writer(11768): 0-duration samples found: 1
02-13 10:41:22.990: I/ActivityManager(11768): Timeline: Activity_idle id: android.os.BinderProxy@41ab6858 time:26420441
02-13 10:41:33.701: D/DecodeActivity(11768): InputBuffer BUFFER_FLAG_END_OF_STREAM
02-13 10:41:33.709: D/DecodeActivity(11768): OutputBuffer BUFFER_FLAG_END_OF_STREAM
02-13 10:41:33.709: E/MPEG4Writer(11768): There are no sync frames for video track
02-13 10:41:33.717: W/MPEG4Writer(11768): 0-duration samples found: 283
02-13 10:41:33.717: I/MPEG4Writer(11768): Received total/0-length (284/0) buffers and encoded 284 frames. - video
02-13 10:41:33.717: D/MPEG4Writer(11768): Stopping Video track
02-13 10:41:33.717: D/MPEG4Writer(11768): Stopping Video track source
02-13 10:41:33.717: D/MPEG4Writer(11768): Video track stopped
02-13 10:41:33.717: D/MPEG4Writer(11768): Stopping Audio track
02-13 10:41:36.076: W/MPEG4Writer(11768): 0-duration samples found: 453
02-13 10:41:36.076: I/MPEG4Writer(11768): Received total/0-length (454/0) buffers and encoded 454 frames. - audio
02-13 10:41:36.271: I/MPEG4Writer(11768): Audio track drift time: 0 us
02-13 10:41:36.271: D/MPEG4Writer(11768): Stopping Audio track source
02-13 10:41:36.271: D/MPEG4Writer(11768): Audio track stopped
02-13 10:41:36.271: D/MPEG4Writer(11768): Duration from tracks range is [0, 0] us
02-13 10:41:36.271: D/MPEG4Writer(11768): Stopping writer thread
02-13 10:41:36.271: D/MPEG4Writer(11768): 0 chunks are written in the last batch
02-13 10:41:36.271: D/MPEG4Writer(11768): Writer thread stopped
02-13 12:28:47.507: E/MediaMuxer(14233): stop() is called in invalid state 3
02-13 10:41:36.271: W/dalvikvm(11768): threadid=11: thread exiting with uncaught exception (group=0x417fbc80)
02-13 10:41:36.271: E/AndroidRuntime(11768): FATAL EXCEPTION: Thread-2394
02-13 10:41:36.271: E/AndroidRuntime(11768): Process: com.test.applyexporter, PID: 11768
02-13 10:41:36.271: E/AndroidRuntime(11768): java.lang.IllegalStateException: Failed to stop the muxer
02-13 10:41:36.271: E/AndroidRuntime(11768):    at android.media.MediaMuxer.nativeStop(Native Method)
02-13 10:41:36.271: E/AndroidRuntime(11768):    at android.media.MediaMuxer.stop(MediaMuxer.java:226)
02-13 10:41:36.271: E/AndroidRuntime(11768):    at com.test.applyexporter.MainActivity$DecoderThread.releaseDecoder(MainActivity.java:266)
02-13 10:41:36.271: E/AndroidRuntime(11768):    at com.test.applyexporter.MainActivity$DecoderThread.run(MainActivity.java:113)
02-13 10:41:36.310: I/Process(11768): Sending signal. PID: 11768 SIG: 9

任何线索,为什么停止失败?

Any clues why the stop fail ?

推荐答案

请注意以下错误:

E/MPEG4Writer(11768): There are no sync frames for video track

的多工视频输出必须以一个同步帧(一/ K /关键帧,一/ K / A的I帧)开始。如果你开始用prediction框架,但没有从,去codeR predict不会有任何知道该怎么做。

The muxed video output must begin with a sync frame (a/k/a key frame, a/k/a I-frame). If you start with a prediction frame, but nothing to predict from, the decoder won't have any idea what to do.

请确保您通过所有值 MediaMuxer - 这也正是标志。同步帧将有 BUFFER_FLAG_SYNC_FRAME 标志设置。

Make sure you are passing all of the MediaCodec.BufferInfo values through to the MediaMuxer -- that's where the flags are. The sync frames will have the BUFFER_FLAG_SYNC_FRAME flag set.

(更新:如API 21, BUFFER_FLAG_SYNC_FRAME 是赞成 BUFFER_FLAG_KEY_FRAME pcated德$ P $两个符号具有相同的整数值和相同的含义;所述变化只是采用一致的术语API中的努力的一部分)

(Update: as of API 21, BUFFER_FLAG_SYNC_FRAME is deprecated in favor of BUFFER_FLAG_KEY_FRAME. Both symbols have the same integer value and same meaning; the change is just part of an effort to adopt consistent terminology in the API.)

这篇关于Android的MediaMuxer没能阻止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 09:04