diff --git a/ansible/playbook.yaml b/ansible/playbook.yaml index 716378b..dab11b0 100644 --- a/ansible/playbook.yaml +++ b/ansible/playbook.yaml @@ -28,3 +28,4 @@ - autofs - exfat - bhyve + - media diff --git a/ansible/roles/media/files/cast_file_intel b/ansible/roles/media/files/cast_file_intel new file mode 100644 index 0000000..5706b48 --- /dev/null +++ b/ansible/roles/media/files/cast_file_intel @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# + +ffmpeg -re -vaapi_device /dev/dri/renderD128 -i "$1" -vf 'format=nv12,hwupload' -c:v h264_vaapi -r 30 -g 30 -loop -1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp:172.16.16.44/live/test & +ffmpegpid=$! + +sleep 1 +castnow --exit 'https://broadcast.fizz.buzz/hls/hls/test.m3u8' +wait "$ffmpegpid" + +sleep 10 diff --git a/ansible/roles/media/files/cast_file_nvidia b/ansible/roles/media/files/cast_file_nvidia new file mode 100644 index 0000000..51d298d --- /dev/null +++ b/ansible/roles/media/files/cast_file_nvidia @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# + +ffmpeg -re -i "$1" -vcodec h264_nvenc -r 30 -g 30 -loop -1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp:172.16.16.44/live/test & +ffmpegpid=$! + +sleep 1 +castnow --exit 'https://broadcast.fizz.buzz/hls/hls/test.m3u8' +wait "$ffmpegpid" + +sleep 10 diff --git a/ansible/roles/media/files/mpv.conf b/ansible/roles/media/files/mpv.conf new file mode 100644 index 0000000..6d1ab84 --- /dev/null +++ b/ansible/roles/media/files/mpv.conf @@ -0,0 +1,25 @@ +# To debug hardware video acceleration: +# mpv --hwdec=auto --msg-level=vd=v,vo=v,vo/gpu/vaapi-egl=trace + +# GPU Decoding +hwdec=auto +# Allow CPU processing via filters: +#hwdec=auto-copy + +# Use higher quality gpu rendering +profile=gpu-hq +scale=ewa_lanczossharp +cscale=ewa_lanczossharp + +# Instead of dropping frames, re-sample audio which may cause a slight pitch change +# ISSUE: caused frame stutter on Louie S01E03 +# video-sync=display-resample + +# Make motion smoother when video frame rate != monitor refresh rate +interpolation +tscale=oversample + +# Load a lot of the file into memory +# cache=yes +# demuxer-max-bytes=123400KiB +# demuxer-readahead-secs=20 diff --git a/ansible/roles/media/meta/main.yaml b/ansible/roles/media/meta/main.yaml new file mode 100644 index 0000000..655446a --- /dev/null +++ b/ansible/roles/media/meta/main.yaml @@ -0,0 +1,2 @@ +dependencies: + - users diff --git a/ansible/roles/media/tasks/common.yaml b/ansible/roles/media/tasks/common.yaml new file mode 100644 index 0000000..3062762 --- /dev/null +++ b/ansible/roles/media/tasks/common.yaml @@ -0,0 +1,32 @@ +- name: Install packages + package: + name: + - ffmpeg # for cast_file + state: present + +- name: Install packages + when: install_graphics + package: + name: + - mpv + - evince + - gimp + - imv # image viewer + state: present + +- include_tasks: "tasks/{{graphics_driver}}.yaml" + +- import_tasks: tasks/freebsd.yaml + when: 'os_flavor == "freebsd"' + +- import_tasks: tasks/linux.yaml + when: 'os_flavor == "linux"' + +- include_tasks: + file: tasks/peruser.yaml + apply: + become: yes + become_user: "{{ initialize_user }}" + loop: "{{ users | dict2items | community.general.json_query('[?value.initialize==`true`].key') }}" + loop_control: + loop_var: initialize_user diff --git a/ansible/roles/media/tasks/freebsd.yaml b/ansible/roles/media/tasks/freebsd.yaml new file mode 100644 index 0000000..5b6db0e --- /dev/null +++ b/ansible/roles/media/tasks/freebsd.yaml @@ -0,0 +1,7 @@ +- name: Install packages + package: + name: + # Have to use yt-dlp instead of youtube_dl because of mpv + # - youtube_dl + - yt-dlp + state: present diff --git a/ansible/roles/media/tasks/intel.yaml b/ansible/roles/media/tasks/intel.yaml new file mode 100644 index 0000000..6a2cbb5 --- /dev/null +++ b/ansible/roles/media/tasks/intel.yaml @@ -0,0 +1,10 @@ +- name: Install scripts + copy: + src: "files/{{ item.src }}" + dest: "{{ item.dest }}" + mode: 0755 + owner: root + group: wheel + loop: + - src: cast_file_intel + dest: /usr/local/bin/cast_file diff --git a/ansible/roles/media/tasks/linux.yaml b/ansible/roles/media/tasks/linux.yaml new file mode 100644 index 0000000..b91a0a3 --- /dev/null +++ b/ansible/roles/media/tasks/linux.yaml @@ -0,0 +1,5 @@ +- name: Install packages + package: + name: + - youtube-dl + state: present diff --git a/ansible/roles/media/tasks/main.yaml b/ansible/roles/media/tasks/main.yaml new file mode 100644 index 0000000..5c1df6c --- /dev/null +++ b/ansible/roles/media/tasks/main.yaml @@ -0,0 +1 @@ +- import_tasks: tasks/common.yaml diff --git a/ansible/roles/media/tasks/peruser.yaml b/ansible/roles/media/tasks/peruser.yaml new file mode 100644 index 0000000..d48fda3 --- /dev/null +++ b/ansible/roles/media/tasks/peruser.yaml @@ -0,0 +1,29 @@ +- include_role: + name: per_user + +- name: Create directories + file: + name: "{{ account_homedir.stdout }}/{{ item }}" + state: directory + mode: 0700 + owner: "{{ account_name.stdout }}" + group: "{{ group_name.stdout }}" + loop: + - ".config/mpv" + +- name: Copy files + copy: + src: "files/{{ item.src }}" + dest: "{{ account_homedir.stdout }}/{{ item.dest }}" + mode: 0600 + owner: "{{ account_name.stdout }}" + group: "{{ group_name.stdout }}" + loop: + - src: mpv.conf + dest: .config/mpv/mpv.conf + +- import_tasks: tasks/peruser_freebsd.yaml + when: 'os_flavor == "freebsd"' + +- import_tasks: tasks/peruser_linux.yaml + when: 'os_flavor == "linux"' diff --git a/ansible/roles/media/tasks/peruser_freebsd.yaml b/ansible/roles/media/tasks/peruser_freebsd.yaml new file mode 100644 index 0000000..e69de29 diff --git a/ansible/roles/media/tasks/peruser_linux.yaml b/ansible/roles/media/tasks/peruser_linux.yaml new file mode 100644 index 0000000..e69de29