视频播放开发
场景介绍
视频播放包括播放控制、播放设置和播放查询,如播放的开始/停止、播放速度设置和是否循环播放等。
接口说明
视频播放类Player的主要接口
开发步骤
1. 创建Player实例,可调用Player(Context context),创建本地播放器,用于在本设备播放。
2.构造数据源对象,并调用Player实例的setSource(Source source)方法,设置媒体源,代码示例如下:
1.private Context context = this; private HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0xD000500, "MainAblityTest"); Player player = new Player(context); File file = new File("/data/data/xxxx/files/test_audio.mp4"); // 根据实际情况设置文件路径 FileInputStream in = new FileInputStream(file); FileDescriptor fd = in.getFD(); // 从输入流获取FD对象 Source source = new Source(fd); player.setSource(source); player.prepare(); player.setPlayerCallback(new Callback()); player.play(); player.stop();
3. 调用prepare(),准备播放。
4. 构造IPlayerCallback,通过IPlayerCallback,可在相应的回调函数中响应准备完毕、播放结束等事件。代码示例如下:
public class Callback implements Player.IPlayerCallback { @Override public void onPrepared() { HiLog.info(TAG, "Player is now prepared,and ready to play"); } @Override public void onMessage(int i, int i1) { } @Override public void onError(int errorType, int errorCode) { HiLog.error(TAG, "PlayerCallback onError errorType: %{public}d, errorCode: %{public}d", errorType, errorCode); } @Override public void onResolutionChanged(int i, int i1) { } @Override public void onPlayBackComplete() { HiLog.info(TAG, "PlayerCallback onPlayBackComplete"); } @Override public void onRewindToComplete() { } @Override public void onBufferingChange(int i) { } @Override public void onNewTimedMetaData(Player.MediaTimedMetaData mediaTimedMetaData) { } @Override public void onMediaTimeIncontinuity(Player.MediaTimeInfo mediaTimeInfo) { } }
5. 调用play()方法,开始播放。
6. (可选)调用pause()方法和play()方法,可以实现暂停和恢复播放。
7. (可选)调用rewindTo(long microseconds)方法实现播放中的拖拽功能。
8. (可选)调用getDuration()方法和getCurrentTime()方法,可以实现获取总播放时长以及当前播放位置功能。
9. 调用 stop()方法停止播放。
10. 播放结束后,调用release()释放资源。
视频录制开发
场景介绍
视频录制的主要工作是选择视频/音频来源后,录制并生成视频/音频文件。
接口说明
视频录制类Recorder的主要接口
开发步骤
1. 调用Recorder()方法,创建Recorder实例。
2. 构造数据源对象,并调用Recorder实例的setSource(Source source)方法,设置媒体源,代码示例如下:
Recorder recorder = new Recorder(); Source source = new Source(); source.setRecorderAudioSource(Recorder.AudioSource.MIC); source.setRecorderVideoSource(Recorder.VideoSource.SURFACE); recorder.setSource(source);
3. 调用setOutputFormat(int outputFormat)方法,设置录制文件存储格式。
4. (可选)构造音频属性AudioProperty对象(不设置音频则是只录视频),并调用Recorder实例的setAudioProperty(AudioProperty property)方法,设置录制的音频属性,代码示例如下:
AudioProperty audioProperty = new AudioProperty.Builder() .setRecorderNumChannels(2) .setRecorderSamplingRate(192000) .setRecorderAudioEncoder(Recorder.AudioEncoder.AAC) .setRecorderBitRate(48000) .build(); recorder.setAudioProperty(audioProperty);
5. 构造存储属性StorageProperty对象,并调用Recorder实例的setStorageProperty(StorageProperty property)方法,设置录制的存储属性,代码示例如下
String path = "/sdcard/audiotestRecord.mp4"; StorageProperty storageProperty = new StorageProperty.Builder() .setRecorderPath(path) .setRecorderMaxDurationMs(1000000) .setRecorderMaxFileSizeBytes(1000000) .build(); recorder.setStorageProperty(storageProperty);
6. (可选)构造视频属性VideoProperty对象,并调用Recorder实例的setVideoProperty(VideoProperty property)方法,设置录制的视频属性,代码示例如下:
VideoProperty videoProperty = new VideoProperty.Builder() .setRecorderVideoEncoder(Recorder.VideoEncoder.H264) .setRecorderWidth(3840) .setRecorderDegrees(90) .setRecorderHeight(2160) .setRecorderBitRate(40000000) .setRecorderRate(30) .setRecorderFps(30) .build(); recorder.setVideoProperty(videoProperty); recorder.prepare();
7. 调用prepare(),准备录制。
8. (可选)构造录制回调,首先构造对象IRecorderListener,IRecorderListener需要实现onError(int what, int extra),实现录制过程收到错误信息时做相应的操作。下面的代码例子中录制异常时,打印了相关的日志信息,代码示例如下:
private HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0xD000500, "MainAblityTest"); class RecorderErrorAndInfoListener implements IRecorderListener { @Override public void onError(int what, int extra) { } @Override public void onMessage(int what, int extra) { } } IRecorderListener listener = new RecorderErrorAndInfoListener() { @Override public void onError(int what, int extra) { HiLog.error(TAG, "EncodeWriteFileListener onError what:%{public}d, extra:%{public}d", what, extra); } }
9. 调用start()方法,开始录制。
10. (可选)调用pause()方法和resume()方法,可以实现暂停和恢复录制。
11. 调用 stop()方法停止录制。
12. 录制结束后,调用release()释放资源。
媒体提取开发
场景介绍
媒体提取主要工作是将多媒体文件中的音视频数据进行分离,提取出音频、视频数据源。
接口说明
视频提取类Extractor的主要接口
开发步骤
1. 调用Extractor()方法创建Extractor实例。
2. 构造数据源对象,并调用Extractor实例的setSource(Source source)方法,设置媒体源,代码示例如下:
Extractor extractor = new Extractor(); File file = new File("/sdcard/test_audio.mp4"); // 根据实际情况设置文件路径 FileInputStream in = new FileInputStream(file); FileDescriptor fd = in.getFD(); Source source = new Source(fd); extractor.setSource(source);
3. 调用getTotalStreams()方法获取媒体的轨道数量。
4. 调用specifyStream(int id)方法选择特定轨道的数据,进行提取。
5. (可选)调用unspecifyStream(int id)方法取消选择轨道。
6. (可选)调用rewindTo(long microseconds, int mode)方法实现提取过程中的跳转指定位置。
7. 调用readBuffer(ByteBuffer buf, int offset)方法,可以实现获取提取出来的Buffer数据功能。
8. 调用next()方法,实现提取下一帧的功能。
9. (可选)调用getStreamId()方法,可以实现获取当前选择的轨道编号的功能。
10. (可选)调用getFrameTimestamp()方法,可以实现获取当前轨道内媒体数据帧时间戳的功能。
11. (可选)调用getFrameSize()方法,可以实现获取当前轨道的媒体数据帧大小的功能。
12.(可选)调用getFrameType()方法,可以实现获取当前轨道的媒体数据帧flags的功能。
提取结束后,调用release()释放资源。